本篇的主要內容是,經過geth發佈自定義的智能合約,並進行合約調用。html
在最新的geth中,取消了eth.complie,因此網上不少資料都不能用了,但整體來講仍是頗有參考價值的。一路兜兜轉轉,終於調通了整個流程,特此分享。linux
整個合約佈署,總體看來分爲如下四個步驟:git
一、用Solidity語言編寫合約內容。(今天只入門hello world級別的合約,後續文章會對這個語言進行深刻討論)github
二、對合約類進行編譯,得到abiDefinition和bytecode。(由於新版geth1.6中已取消了eth.compile,因此編譯工做只能交由solc或https://ethereum.github.io/browser-solidity進行編譯)web
三、經過abiDefinition和bytecode實例化合約並進行佈署。編程
四、經過合約地址,實例化本身的合約,並進行調用。windows
如今圍繞着這四個步驟展開描述,各位讀者根據如下步驟能夠調通整個過程,若是發現有不足之處,請及時指出。(注:本次實驗基於windows進行)瀏覽器
一、用Solidity語言編寫合約內容ide
pragma solidity ^0.4.0; contract test { function multiply(uint a) public returns(uint d) { return a * 7; } }
如今請先別糾結合約的語法。只要初步認識,這個合約傳出一個整型數a,並返回a*7的結果。工具
二、對合約類進行編譯,得到abiDefinition和bytecode
由於geth 1.6已經取消了eth.complie,因此合約的編譯不能在geth中完成。只能經過solc或者在線工具https://ethereum.github.io/browser-solidity 完成。由於solc只能在linux下編譯,當前個人實驗環境是windows,因此選擇了在線工具。
用瀏覽器打開在線工具,並將步驟一的合約粘貼入工具左側的文本區中,以下圖所示:
由於當前自動編譯選項爲勾選狀態,因此工具會對合約進行自動編譯。這時,咱們須要點擊「Details」按鈕,便會看到如下的對話框彈出:
紅框中的兩部分數據:bytecode和interface-abi即是咱們須要的二進制碼和abi接口定義。此時,咱們點擊界面上的複製按鈕,把數據複製到本地。
三、經過abiDefinition和bytecode實例化合約並進行佈署
// 如下兩段便是步驟二獲取的abiDefinition和bytecode數據 abi=[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
bytecode="0x6060604052341561000f57600080fd5b60b18061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a72305820e8baa72a4bd1ffe2e8fa51812e8d65fc7b145baf48382c4ae5039510fd35a6ff0029"
// 建立合約 var contract = eth.contract(abi); var initializer = {from: web3.eth.accounts[0], data: bytecode, gas: 300000}; var token = contract.new(initializer)
// 合約建立完成以後,打印token.address爲空 // 須要經過挖礦這一步驟,對合約地址進行確認 miner.start(4); admin.sleepBlocks(2); miner.stop();
到此爲止,合約的佈署已佈署到了區塊鏈上。
四、經過合約地址,實例化本身的合約,並進行調用
// 在合約調用以前,須要對用戶進行解鎖 personal.unlockAccount(eth.accounts[0],"123456") mycontract = contract.at(token.address) mycontract.multiply.call(2) // 到了這一步,咱們能夠獲得本身合約的返回值14
到這裏,合約的佈署與調用大功告成。若是有疑問的同窗,能夠一塊兒討論。
參考資料:
http://blog.csdn.net/Blossomps/article/details/59542586 以太坊私有鏈環境下智能合約部署流程
http://blog.csdn.net/super_wu1992/article/details/76919308 以太坊私有鏈建立及智能合約的部署和交互
http://blog.csdn.net/fidelhl/article/details/50481859 以太坊智能合約編程之菜鳥教程
http://8btc.com/article-4537-1.html 以太坊私鏈與智能合約部署入門教程
博主注:上面的文章,大部份只適用於舊版本的geth,給調通整個流程形成不小的障礙。不過依然感謝這些文章的做者,給後來的入門者提供參考的依據。雖然一路磕磕碰碰,但實驗最終順利經過,可喜可賀。
下一篇,咱們將一塊兒學習錢包帳戶的備份與轉移,但願你們能一塊兒進步:)