1. 程式人生 > >以太坊開發基礎(3)建立交易以及部署合約

以太坊開發基礎(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"