ethereum(智能合約)
智能合約
用來執行我們想要的客製化操作,目前多數使用Solidity語言撰寫,每個合約compile後都有一個地址,並且有一個schema,之後每個節點必須主動放入該份擁有合約地址與schema的文件,才能呼叫該合約
讓合約呼叫外部資料
http://docs.oraclize.it/#ethereum-quick-start
Solidity
1.第ㄧ部分:安裝
此方法速度較快,其他需花比較長時間
git clone --recursive https://github.com/ethereum/solidity.git
cd solidity安裝完可在terminal輸入solc試試看
之後我們一樣先執行剛才的節點
geth --ipcdisable --rpc --rpcport 8104 --datadir "./privatechain/01" --networkid 123 --rpcapi="db,eth,net,web3,personal" --port=30310 console然後加入我們的第一個合約
var greeterSource = 'contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) selfdestruct(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }'如果版本大於1.6建議直接使用online compiler(Remix Editor)
(因為如果版本大於1.6之後web3.eth.compile.solidity會出現The method eth_compileSolidity does not exist/is not available錯誤)
online compiler網址: https://ethereum.github.io/browser-solidity/#version=soljson-v0.4.11+commit.68ef5810.js
然後直接貼上 以下
如果還沒有帳號先輸入personal.newAccount() 新增 否則直接貼上部署的code會出現 > Error: authentication needed: password or unlock undefined
之後輸入以下綁定帳號到節點
然後輸入以下來解鎖帳號(讓帳號可以交易)
然後先挖礦產生一些ether才能部署合約
之後點選網頁右側的Details 把下圖右下方web3 deploy 的code到剛才執行terminal的web3 console中

接著回到網頁點選右側最下方的 (contract detail) 把interface的部分複製到我們的geth console 中
然後挖出contract(第一次要先等他跑Dag)
試著輸入
PS:如果出現`invalid address`要先輸入以下
然後輸入
之後挖礦
然後即可看到剛才新設定的值
1.5.8版本之前適用以下
之後試著輸入以下,即可看到剛才compile後的部分
以下為編譯好的合約內容
我們剛才程式碼中的_greeting還沒定義所以輸入以下
接著把我們剛才的合約實例化
然後我們先用以下指令,確定我們鏈上有帳號(也可查看keystore資料夾)
如果沒有可打開Mist新增
之後輸入以下綁定帳號到節點
然後輸入以下來解鎖帳號(讓帳號可以交易)
接著是部署
如果說餘額不夠可先
miner.start(1),確認餘額eth.getBalance(eth.coinbase)
正常的話會出現如下
第二部分
再來為了要把合約加入Blockchain我們要用挖礦方式產生新區塊
因為在私鏈所以我們要自己挖
產生完Dag後接著挖到contract後可以stop

然後就可以輸入以下,如果出現Hello world就成功了
2.把剛才的合約部署到其他節點
為了使得其他人可以運行你的智能合約,你需要兩個資訊: 1.智能合約地址Address 2.智能合約ABI(Application Binary Interface),ABI其實就是一個有序的用戶手冊,描述了所有方法的名字和如何調用它們。
我們可以使用如下獲得其ABI和智能合約地址:
接著我們到另一個節點的console輸入如下,把ABI與Address更改為剛讀取出來的值(建議開一個檔案修改,之後再貼到console,因為code多console不好修改)
ex:
再來於另外一個terminal輸入
如果出現下圖錯誤,我們可以跟另一個節點做區塊鏈同步即可解決

所以先把第一個節點加入,步驟如下
於第一個節點輸入admin.nodeInfo => 複製enode url=> 第二個節點輸入admin.addPeer("剛才複製的enode url")
之後再到第二個節點輸入以下,即可同步區塊
此時第二個節點也會出現Hello World了!
線上編譯合約:https://ethereum.github.io/browser-solidity/#version=soljson-v0.4.9+commit.364da425.js
如果出現錯誤如下,記得指定solidity版本
安全性相關:
互動式教學
解答:https://forum.openzeppelin.com/t/ethernaut-community-solutions/561
可能錯誤
1.Exceeds block gas limit
可參考:https://github.com/trufflesuite/truffle/issues/271
2.Error: insufficient funds for gas * price + value undefined
Last updated
Was this helpful?