以太坊私鏈與智能合約部署學習(博主修正篇)—— 第四篇


    本篇的主要內容是,通過geth發布自定義的智能合約,並進行合約調用。

    在最新的geth中,取消了eth.complie,所以網上很多資料都不能用了,但總體來說還是很有參考價值的。一路兜兜轉轉,終於調通了整個流程,特此分享。

    整個合約布署,整體看來分為以下四個步驟:

    1、用Solidity語言編寫合約內容。(今天只入門hello world級別的合約,后續文章會對這個語言進行深入討論)

    2、對合約類進行編譯,獲得abiDefinition和bytecode。(因為新版geth1.6中已取消了eth.compile,所以編譯工作只能交由solc或https://ethereum.github.io/browser-solidity進行編譯)

    3、通過abiDefinition和bytecode實例化合約並進行布署。

    4、通過合約地址,實例化自己的合約,並進行調用。

    現在圍繞着這四個步驟展開描述,各位讀者根據以下步驟可以調通整個過程,如果發現有不足之處,請及時指出。(注:本次實驗基於windows進行)

 

    1、用Solidity語言編寫合約內容

pragma solidity ^0.4.0;

contract test {
    function multiply(uint a) public returns(uint d) {
        return a * 7;
    }
}

    現在請先別糾結合約的語法。只要初步認識,這個合約傳出一個整型數a,並返回a*7的結果。

 

    2、對合約類進行編譯,獲得abiDefinition和bytecode

    因為geth 1.6已經取消了eth.complie,所以合約的編譯不能在geth中完成。只能通過solc或者在線工具https://ethereum.github.io/browser-solidity 完成。因為solc只能在linux下編譯,當前我的實驗環境是windows,所以選擇了在線工具。

    用瀏覽器打開在線工具,並將步驟一的合約粘貼入工具左側的文本區中,如下圖所示:

    因為當前自動編譯選項為勾選狀態,所以工具會對合約進行自動編譯。這時,我們需要點擊“Details”按鈕,便會看到以下的對話框彈出:

    

    紅框中的兩部分數據:bytecode和interface-abi便是我們需要的二進制碼和abi接口定義。此時,我們點擊界面上的復制按鈕,把數據復制到本地。

 

    3、通過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();

    到此為止,合約的布署已布署到了區塊鏈上。

 

    4、通過合約地址,實例化自己的合約,並進行調用

// 在合約調用之前,需要對用戶進行解鎖
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,給調通整個流程造成不小的障礙。不過依然感謝這些文章的作者,給后來的入門者提供參考的依據。雖然一路磕磕碰碰,但實驗最終順利通過,可喜可賀。

 

下一篇,我們將一起學習錢包賬戶的備份與轉移,希望大家能一起進步:)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM