zoukankan      html  css  js  c++  java
  • 以太坊私链与智能合约部署学习(博主修正篇)—— 第四篇

        本篇的主要内容是,通过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,给调通整个流程造成不小的障碍。不过依然感谢这些文章的作者,给后来的入门者提供参考的依据。虽然一路磕磕碰碰,但实验最终顺利通过,可喜可贺。

    下一篇,我们将一起学习钱包账户的备份与转移,希望大家能一起进步:)

  • 相关阅读:
    小作业5
    小作业4
    Matplotlib基础
    Numpy学习笔记(下篇)
    Numpy学习笔记(上篇)
    机器学习的经典算法与应用
    opencv学习笔记D01
    Markdown新手入门
    python之生成器yeild
    pyinstaller打包.py程序为.exe操作指南
  • 原文地址:https://www.cnblogs.com/ddcoder/p/7879869.html
Copyright © 2011-2022 走看看