以太坊開發基礎(3)建立交易以及部署合約
在以太坊上使用智慧合約是需要專門的交易的,我們需要花費一定的ether來呼叫智慧合約,把一定的ether轉賬到智慧合約的地址中。在我們學習實現智慧合約之前,先要了解一下如何建立一個交易。
一、釋出交易
第一步: 在一個節點上,採用coinbase賬戶並解鎖它。
> coinbaseAddress = eth.coinbase
> personal.unlockAccount(coinbaseAddress)
Unlock account 0x4e7b6e350db51b1cea072dce8a507683cb83f814
Passphrase:
True
第二步:現在從另一個節點的coinbase帳戶或者其他賬戶複製地址,並回到未解鎖的帳戶節點
> hisAddress = "0xb161ffdc6a63963bfbf7b12069ff52cfe5d42cbc"
第三步:sendTransaction
> eth.sendTransaction({from: eth.coinbase, to: hisAddress, value: 100000000}) INFO [08-24|19:55:15.585] Submitted transaction fullhash=0x278445d113e9526ee84e7c583dbb65f5d293b80e9b1a836cf0d4e8442e61b560 recipient=0xb161ffDc6A63963BfBF7B12069FF52CfE5D42cBC "0x278445d113e9526ee84e7c583dbb65f5d293b80e9b1a836cf0d4e8442e61b560"
還有一件需要注意的事,而且會很容易混淆的,就是為什麼這些數字的值有那麼多0。這是因為值是用wei來表示的,所以不必處理可能在不同系統上引起問題的浮點數。這將與gas(一個與計算步驟大致相當的測量法。每筆交易都需要包括一個Gas限制和一個願意為每個Gas支付的費用;礦工可以選擇進行交易和收費)一起發揮作用 ,需要開始指定合同部署和交易。
如果想知道用這個值傳送了多少以太幣,命令如下:
> web3.fromWei(100000000,'ether')
“0.0000000001”
第四步:要使交易傳送,並且看到不同餘額的差異,需要在節點中啟動礦工,然後在挖掘了一個區塊後停止,現在檢查餘額以檢視變化。
> miner.start() ............... > miner.stop() > web3.eth.getBalance(eth.coinbase) 59999999999900000000 > web3.eth.getBalance(hisAddress) 100000000
二、部署合約
部署合約,是把寫好的智慧合約編譯成EVM(Ethereum Virtual Machine)能讀懂的二進位制編碼(Contract Bytecode),儲存到區塊鏈上。部署到區塊鏈上的合約會有一個和錢包地址格式一樣的合約地址。
合約部署後,使用者需要呼叫合約提供的方法時,就是要向這個合約地址發起交易。
部署合約多很多種方案,你可以通過web3.js來寫一個合約部署的指令碼,然後在geth控制檯裡執行,進行合約部署,也可以通過remix-ide來進行部署,或者在truffle框架內進行部署。
1、Remix IDE編寫第一個智慧合約
remix ide是開發以太坊智慧合約的神器,支援網頁線上編寫、部署和測試智慧合約。網址http://remix.ethereum.org
進入後,新建一個智慧合約命名為HelloWrold.sol,合約程式碼如下:
pragma solidity ^0.4.24;
contract HelloWorld{
function say() public pure returns(string){
return "Hello Wrold";
}
}
remix可以檢測合約程式碼編寫的正確性,如果沒有編譯通過,將在右側工具欄中顯示。編譯通過如下圖所示:
2.Remix連結私有鏈
首先開啟我們的私有鏈環境,然後在remix介面中點選右側Run按鈕,在該介面下將Environment下拉選擇Web3 Provider,彈窗問我們是否要連結一個以太坊節點,點選ok後,在新的彈窗中輸入我們啟動私有鏈時設定的地址,預設為localhost:8545。點選ok進行連結,連結成功後,可以在account欄中顯示出賬號資訊。
這裡需要注意的是,在連結私鏈的時候會出現下面這個錯誤:
Not possible to connect to the Web3 provider. Make sure the provider is running and a connection is open (via IPC or RPC).
所以在啟動私鏈的時候一定要使用下面這個引數:
--rpccorsdomain="*" // 允許跨域請求
完整的命令是:
geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3" --port "30303"
--networkid "29382" --ws --wsorigins="*" --rpccorsdomain="*" console
3.使用remix-ide部署智慧合約
(1)部署合約之前首先要解鎖賬號,在geth中輸入命令解鎖賬戶:
>personal.unlockAccount(eth.accounts[0],"123",0)
true
(2)在remix的Run介面點選粉色deploy按鈕進行部署,可以在remix的控制檯和geth的日誌檔案中看到私有鏈中新產生了一個交易。 (3)在geth中開啟挖礦等待區塊確認
>miner.start()
部署成功後可在remix右側Run介面顯示出合約部署的地址和合約方法供我們進行測試。
4、使用geth部署智慧合約
在remix-ide的compile介面,智慧合約編譯成功後可以看到智慧合約的詳情:
在彈出的對話方塊中找到WEB3DEPLOY部分,點拷貝,貼上到編輯器後,修改初始化字串為hello world。
var _greeting5 ="hello world" ;
var helloContract5 = web3.eth.contract([{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_greeting5","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]);
var hello = helloContract5.new( _greeting5, { from: web3.eth.accounts[2], data: '0x606......029', gas: '4700000' }, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
拷貝會geth控制檯裡,回車後,看到輸出,說明合約已經部署成功。
5.測試合約
(1)remix下測試
remix下只需點選say按鈕即可,可在控制檯檢視合約的執行結果。輸出為Hello World,測試通過。
(2)geth下測試
在geth下測試實際上是使用web3.js在控制檯中操作:
首先,在remix-ide的Run介面複製detail按鈕,得到合約的abi(abi是對合約介面的描述);
然後,複製合約地址
合約地址:0x2668d1b0602bc0e1e2f84f931547940546720d75
abi:
[{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,
"stateMutability":"pure","type":"function"}
最後,使用web3獲取合約例項:
var contract = web3.contract(abi).at(contractAddress);
呼叫合約方法,輸出為 Hello World,測試成功。
> contract.say()
"Hello Wrold"