【安裝環境准備】
一、安裝Ethereum-Wallet
(1)在E盤新建文件夾Eth,專門放置以太坊開發環境
(2)把下載的Ethereum-Wallet-win64-0-11-1.zip壓縮包win-unpacked解壓到C:\Eth目錄下
二、安裝geth
(1)geth下載:https://ethereum.github.io/go-ethereum/downloads/
(2)安裝geth,安裝在C:\Eth 目錄下
(3)在C:\Eth目錄下創建privatechain文件,用以存放區塊鏈數據。
接下來就可以看到Eth文件夾下的我們放的所有東西
【以太坊私有鏈搭建】
一、創建第一個節點
1)在E:\Eth 目錄下創建創世塊文件genesis.json,文件內容如下:
{ "nonce": "0x0000000000000042", "difficulty": "0x40000", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0xffffffff", "alloc": { "3282791d6fd713f1e94f4bfd565eaa78b3a0599d": { "balance": "1337000000000000000000" }, "17961d633bcf20a7b029a7d94b7df4da2ec5427f": { "balance": "229427000000000000000" } }, "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 } }
(2)打開cmd,進入C:\Eth 目錄下(該目錄下有geth.exe和genesis.json文件,便於運行geth命令),創世塊文件初始化命令如下:
geth -datadir "%cd%\privatechain\node1" init genesis.json
執行該命令后會在C:\Eth\privatechain下自動新建node1文件夾,並在node1下生成geth和keystore兩個文件夾。其中geth存放的是區塊信息,keystore中存放的是賬戶信息。
初始化完成以后你就擁有一條自己的私有鏈了,之后就可以啟動自己的私有鏈進行一些操作。
(3)打開geth控制台:
geth -datadir "%cd%\chain" console
(4)創建新賬戶,密碼為liuxixi1,用以下代碼來啟動私有鏈的挖礦:
personal.newAccount('liuxixi1')
此時會返回一個賬戶地址
(5) 輸入exit,退出控制台
(6)重新啟動私有鏈節點
geth --targetgaslimit 4294967295 --rpc --rpcport "8101" --port "30301" --rpcapi "eth,web3,personal" --networkid 2020 --identity 2020 --nodiscover --maxpeers 5 --datadir "%cd%\privatechain\node1" --unlock 0 --rpccorsdomain "*" console
注釋:
--targetgaslimit:每個塊的gas上限,這里可以暫時理解為容量
--rpc:啟動rpc通信,可以進行智能合約的部署和調試
--rpcaddr:rpc接口的地址
--rpcport:rpc接口的端口號
--port:網絡監聽端口,用於節點之間通信
--rpcapi:設置rpc的范圍,暫時開啟eth,web3,personal足夠
--networkid:設置當前區塊鏈的網絡ID,是一個數字,可以隨便寫
--identity:區塊鏈的標示,隨便填寫,用於標示目前網絡的名字
--nodiscover:禁止被網絡中其它節點發現,需要手動添加該節點到網絡
--maxpeers:最大節點數量
--datadir:設置當前區塊鏈網絡數據存放的位置
--unlock:解鎖某用戶(此處用用戶坐標來控制,解鎖后的用戶調用接口發起交易時,不要需要提供密碼),0代表存儲在賬號數組中的第一個賬號,如果一開始沒有創建賬號,改參數可以去掉,不然會報錯,找不到該賬號。
--rpccorsdomain:限制rpc訪問源的ip,代表不限制
--mine:允許挖礦
--console:啟動命令行模式,可以在Geth中執行命令*
192.xx.xx:要改為自己的IP
該命令的主體是geth consoal,表示啟動該節點並進入交互控制台。其中--networkid 2020 表示私有鏈的網絡id。網絡id在連接到其他接點時也會用到。以太坊公網的id是1,為了不產生沖突,這里要指定自己的網絡id。
然后輸入剛建的賬戶密碼:liuxixi1
(7)進入C:\Eth\win-unpacked
,運行Ethereum Wallet.exe
,若果出現版本更新窗口,不用理它,關掉就行了
點擊啟動
可以看到上面都顯示的0,因為還沒有開始挖礦,是沒有以太幣的。
創建兩個賬號
點擊”ADD ACCOUNT” 按鈕,添加一個錢包,程序會彈出一個對話框,提示輸入兩遍密碼,輸入完密碼后,賬號即創建成功。創建其他的賬號,一樣的操作,從上面的截圖可以看到,有三個賬號,一個是MAIN ACCOUNT,一個是ACCOUNT2,一個是ACCOUNT3
挖礦獲取一些以太幣
賬號創建后,還沒有以太幣,需要在私有鏈上挖礦,切換到Geth界面,輸入
miner.start(1)
miner命令括號中的1表示用一個線程進行挖礦,如果不配置,就會讓CPU全速運行,影響計算機的使用。
運行一會后,主賬號就會獲取很多以太幣,這個時候屏幕會快速刷屏,不用管,輸入命令miner.stop()停止挖礦。
這里就可以看Aain account已經有余額了
將一個用戶的以太幣轉給另一個用戶
先點擊ACCOUNT2賬號,進入賬號詳情的界面,點擊右側的“COPY address”,把ACCOUNT2的地址拷貝下來,系統會提示你現在你處在一個測試網絡,不要轉入真正的以太幣到這個賬號。
Account 2地址:0xd4B8b428aA6D0135Ae0E70AF6805004acace9114
點擊錢包中“SEND”按鈕,從MAINACCOUNT給ACCOUNT2轉入一定以太幣,同時可以看到執行這筆交易的費用是0.000378個以太幣。
點擊發送后會提示如輸入密碼,但這時還沒有發送成功,根據區塊鏈的交易規則,需要礦工的確認,並且每筆交易需要確認12個塊,一個塊是16秒的生成時間。切換到Geth程序,輸入挖礦命令,直到ACCOUNT2上顯示100個以太幣,然后停止挖礦。
如下圖看到賬戶2還未有以太幣
輸入挖礦命令進行挖礦
由上圖看到賬戶2已經有以太幣了 說明轉賬成功!然后停止挖礦
部署智能合約
點“CONTRACTS”,進入智能合約管理界面,點擊“DEPOLY NEW CONTRACT”,開始部署智能合約,
選擇部署智能合約的賬號,並輸入智能合約的代碼后,如下圖
pragma solidity ^0.4.18; contract SimpleStorage { uint storedData; function set(uint x)public { storedData= x; } function get() public constant returns (uint) { return storedData; } }
輸入完畢后點擊“DEPLOY”,系統會提示輸入賬號密碼,因為部署智能合約是需要費用的。
這個時候是看不到部署的智能合約的,切換到Geth界面,進行挖礦,在12個塊后,智能合約就能確認並顯示出來。
運行智能合約
點擊DEPLOY NEW CONTRACT
,部署合約
選擇智能合約發起賬戶,這里選擇Main account, 合約以太幣數量填0,其他智能合約的運行也是一樣,無非就是函數多點,輸入多點。
復制solidity語言編寫的智能合約代碼,選擇需要部署的智能合約。
pragma solidity ^0.4.18;
contract MyToken{
/*在合約中使用public關鍵字定義所有能被別的合約訪問的變量*/
string public name;
string public symbol;
uint8 public decimals;
/*建立一個數組存儲賬戶的余額*/
mapping (address => uint256) public balanceOf;
/*建立一個公共的事件用於用戶通知*/
event Transfer(address indexed from, address indexed to, uint256 value);
/*初始化合約,當合約內的函數名和合約名相同時(MyToken),則該函數是合約的構造函數*/
function MyToken(uint256 _supply, string _name, string _symbol, uint8 _decimals) public
{
/*默認將股份分為10000份,即股權的最小單位是0.01%*/
if (_supply == 0) _supply = 1000000;
/*可自定義股權數量和最小單位*/
balanceOf[msg.sender] = _supply;
/*定義股權名稱*/
name = _name;
/*設定股權所使用的單位符號,例如%*/
symbol = _symbol;
/*設定小數位數*/
decimals = _decimals;
}
/*創建股權轉移函數*/
function transfer(address _to, uint256 _value) public {
/*檢驗是否有足夠的股權*/
if (balanceOf[msg.sender] < _value) require(balanceOf[msg.sender] > _value);
if (balanceOf[_to] + _value < balanceOf[_to]) require(balanceOf[_to] + _value > balanceOf[_to]);
/*更新股權轉讓信息*/
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
/*通知用戶股權轉讓成功,並將數據寫入區塊鏈*/
Transfer(msg.sender, _to, _value);
}
輸入賬戶密碼確認,然后部署
當智能合約得到區塊確認,說明智能合約被保存到區塊中,部署智能合約成功
調用智能合約
回到主頁面,點擊CONTRACTS,
點擊進入智能合約,點擊進入剛才部署的智能合約
智能合約頁面的函數以及函數參數,以及執行
main account地址:0x7A280bEf63e47a18c129E4676929E92Dc06897CA
ACCOUNT2地址:0xd4B8b428aA6D0135Ae0E70AF6805004acace9114
點擊EXECUTE執行,發送交易輸入密碼進行確認
挖礦后,Main account的股權占比變為90%,ACCOUNT2的股權占比變為10%