區塊鏈初探
阿新 • • 發佈:2018-12-22
- 智慧合約
pragma solidity ^0.4.0; contract SimpleContract { string message; function setMessage(string x) public{ message = x; } function getMessage() constant public returns (string) { return message; } }
- 編譯合約
- 選擇合適的編譯器版本
- 點選右側欄的Compile模組下的Start to compile按鈕進行編譯,同時編譯成功可以在
Run
中模擬執行。
- 部署合約
部署合約就是將編譯好的合約位元組碼通過外部賬號傳送交易的形式部署到以太坊區塊鏈上。
步驟:-
compile
頁面編譯成功後點擊Details
按鈕,出現浮層頁面在浮層中找到WEB3DEPLOY
, 將WEB3DEPLOY
中的內容複製。 -
將智慧合約直接貼上到命令列(
console
)var simplecontractContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"x","type":"string"}],"name":"setMessage","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":true,"inputs":[],"name":"getMessage","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function","stateMutability":"view"}]); var simplecontract = simplecontractContract.new( { from: web3.eth.accounts[0], data: '0x606060405261028f806100126000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063368b877214610047578063ce6d41de146100a257610042565b610002565b34610002576100a06004808035906020019082018035906020019191908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050909091905050610122565b005b34610002576100b460048050506101d3565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156101145780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017157805160ff19168380011785556101a2565b828001600101855582156101a2579182015b828111156101a1578251826000505591602001919060010190610183565b5b5090506101cd91906101af565b808211156101c957600081815060009055506001016101af565b5090565b50505b50565b602060405190810160405280600081526020015060006000508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102805780601f1061025557610100808354040283529160200191610280565b820191906000526020600020905b81548152906001019060200180831161026357829003601f168201915b5050505050905061028c565b9056', gas: '4700000' }, function (e, contract){ console.log(e, contract); if (typeof contract.address !== 'undefined') { console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); } })
-
出現報錯,進行部署之前,先將交易的賬號進行解鎖,不然會出現錯誤
personal.unlockAccount(eth.accounts[0])
-
-
再次進行貼上,沒有報錯了
-
檢查一下交易池,檢視當前交易的待處理狀況:
txpool.status
看到當前的交易池中有一個交易正在等待確認。然後,我們檢視待確認交易的詳細內容:eth.getBlock("pending",true).transactions
檢視區塊資訊與我們之前所設定的相同。from
資料項就是我們傳送交易的地址input
就是合約編譯完成的位元組碼- 新的交易建立在第3號區塊中
-
檢視日誌
INFO [11-03|02:52:58.543] Submitted contract creation fullhash=0x16acefe5b61cff177b3cc65d21237594913bdd7e0c71d97200a42db22147f55d contract=0xE87619e16Aa3d2fd7BeA8A18Bb770b8B1Fd808b8
說明交易已經發送到區塊鏈中了,正在等待礦工的確認,確認後才真正完成智慧合約的部署
- 注意:接下來要開始挖礦(
miner.start(1)
)
- 注意:接下來要開始挖礦(
-
- 呼叫智慧合約
- 使用一個在某個地址上已經存在的合約
simplecontract
是合約物件,通過建立合約的交易來部署合約,是第一個合約simplecontract.address
得到之前部署了的合約的合約地址testcontract
為合約物件,通過交易修改合約的資料。
// instantiate by address testcontract = simplecontractcontract.at(simplecontract.address)
- 呼叫
如果呼叫的智慧合約函式需要合約中的資料, 則需要消耗以太坊gas,否則不需要消耗。由於需要修改合約中的資料, 呼叫setMessage()
時需要使用sendTransaction()發起交易, 並附加發起者的賬號. 以上操作只是發起了交易, 但交易並不一定會被處理. 交易被處理還必須要有節點處於挖礦模式。想要獲取到修改後的資料,必須等到交易完成後,getMessage
才可以獲取到修改後的資料。-
呼叫
setMessage
方法testcontract.setMessage.sendTransaction("sysu", {from:eth.accounts[0]})
解決方法與之前一樣,只需要解鎖一下賬號就可以了
返回的值傳送的交易的hash值
檢視交易池資訊以及詳細的交易資訊
然後開始挖礦 -miner.start(1)
-
呼叫
getMessage
方法
-
- 使用一個在某個地址上已經存在的合約