以太坊私链与智能合约部署入门教程


  • qtum team

    一、环境配置和程序安装

    1.1 安装 geth

    MAC OSX

    • 首先确保已安装 homebrew,没有安装过的可以在命令行下执行/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 进行安装
    • brew tap ethereum/ethereum
    • brew install ethereum

    Windows

    Linux

    在命令行下输入 geth -h , 有如下回显表示成功

    geth

    1.2 安装 solc

    • 首先确保安装过npm, 没有安装过的可以访问 npm网站下载安装
    • npm install -g solc
    • 在命令行下输入 solc --help , 有如下回显表示成功

    solc

    二、配置私链节点

    2.1 创世块设置

    新建文件夹,命名随意,在此文件夹下创建genesis.json文件和data文件夹
    genesis.json 的内容如下:

    {
    "config": {
            "chainId": 123456,
            "homesteadBlock": 0,
            "eip155Block": 0,
            "eip158Block": 0
    },
    "nonce": "0x0000000000000042",
    "difficulty": "0x020000",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
    "gasLimit": "0x4c4b40",
    "alloc": {}
    }
    

    2.2 初始化

    在命令行下进入刚才创建的文件夹,输入如下命令:
    geth --datadir data init genesis.json

    各参数代表的含义如下:

    • init 表示初始化区块,后面跟着创世块的配置文件genesis.json
    • datadir 数据存放的位置

    2.3 启动节点

    geth --datadir data --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console

    各参数代表的含义如下:

    • networkid 设置当前区块链的网络ID,用于区分不同的网络,1表示公链
    • rpc 表示启动rpc通信,可以进行智能合约的部署和调试
    • console 表示启动命令行模式,可以在Geth中执行命令

    执行成功后将进入区块链的JavaScript控制台环境
    geth-run

    2.4 Geth JavaScript控制台环境使用说明

    • 创建新账号
      personal.newAccount()
      或者 personal.newAccount("123456")

    • 查看节点信息
      admin.nodeInfo

    • 挖矿
      开始挖矿 miner.start(1)
      停止挖矿 miner.stop()

    • 查看当前矿工账号
      eth.coinbase 默认为第一个账户

    • 修改矿工账号
      miner.setEtherbase(eth.accounts[1])

    • 查看账户信息
      eth.accounts[0]

    • 查看账户余额
      eth.getBalance(eth.accounts[0])
      或者 web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")

    • 解锁账号
      personal.unlockAccount(eth.accounts[0])
      使用账户资金前都需要先解锁账号

    • 转账eth.sendTransaction({from:eth.accounts[0],to:"0x587e57a516730381958f86703b1f8e970ff445d9",value:web3.toWei(3,"ether")})
      使用 txpool.status 可以看到交易状态

    • 查看区块数据
      eth.blockNumber
      eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8ff5ec37fea6710adcab825")
      eth.getBlock(1) 通过区块号查看区块

    三、智能合约

    3.1 编辑合约代码

    创建一个 Token.sol 文件,内容如下:

    contract Token {
        address issuer;
        mapping (address => uint) balances;
    
        event Issue(address account, uint amount);
        event Transfer(address from, address to, uint amount);
    
        function Token() {
            issuer = msg.sender;
        }
    
        function issue(address account, uint amount) {
            if (msg.sender != issuer) throw;
            balances[account] += amount;
        }
    
        function transfer(address to, uint amount) {
            if (balances[msg.sender] < amount) throw;
    
            balances[msg.sender] -= amount;
            balances[to] += amount;
    
            Transfer(msg.sender, to, amount);
        }
    
        function getBalance(address account) constant returns (uint) {
            return balances[account];
        }
    }
    

    这份代码实现了一个简单的Token合约功能。
    issue 函数可以向充值以太到合约账户
    transfer 函数可以向其他账号发送token
    getBalance 函数可以获取某个账号的token余额

    3.2 编译与部署

    • 压缩合约代码
      命令行下执行 cat Token.sol | tr '\n' ' '
      这条命令将代码中的换行符替换成空格,这样我们的代码就只有一行了。命令执行成功后将回显复制下来。

    • 将合约代码保存为一个变量
      回到Geth JavaScript 控制台,执行如下命令,等于号后面的内容就是我们刚才复制下来的压缩后的合约代码。

      var tokenSource = 'contract Token { address issuer; mapping (address => uint) balances; event Issue(address account, uint amount); event Transfer(address from, address to, uint amount); function Token() { issuer = msg.sender; } function issue(address account, uint amount) { if (msg.sender != issuer) throw; balances[account] += amount; } function transfer(address to, uint amount) { if (balances[msg.sender] < amount) throw; balances[msg.sender] -= amount; balances[to] += amount; Transfer(msg.sender, to, amount); } function getBalance(address account) constant returns (uint) { return balances[account]; } }';

    • 编译
      var tokenCompiled = eth.compile.solidity(tokenSource);

      若不成功,请参考https://ethereum.stackexchange.com/questions/15435/how-to-compile-solidity-contracts-with-geth-v1-6提供的替代方案

    • 查看二进制代码
      tokenCompiled['<stdin>:Token'].code

    • 查看ABI
      tokenCompiled['<stdin>:Token'].info.abiDefinition

    • 创建合约对象
      var contract = eth.contract(tokenCompiled['<stdin>:Token'].info.abiDefinition);

      var initializer = {from: web3.eth.accounts[0], data: tokenCompiled['<stdin>:Token'].code, gas: 300000};

      var token = contract.new(initializer)

    输入命令 token 可以看到此时的token有transactionHash 但是没有address
    执行 miner.start(1) 一段时间后停止,我们的合约就发布到了链上

    3.3 与合约进行交互

    • 充值
      personal.unlockAccount(eth.accounts[0])
      token.issue.sendTransaction(eth.accounts[0], 100, {from: eth.accounts[0]});
      miner.start(1)
      miner.stop()

    • 发送 token
      token.transfer(eth.accounts[1], 30, {from: eth.accounts[0]})
      miner.start(1)
      miner.stop()

    • 查看余额
      token.getBalance()

    三、QTUM

    目前QTUM的智能合约完全兼容现有 solidity 语法,以太坊中的合约脚本可以轻松移植到QTUM中,新一代智能合约语言 eSML 也在稳步开发中。

    QTUM 将以太坊 EVM 搭建在比特币 UTXO 架构上,通过轻钱包就可以登录EVM。轻钱包采用SPV协议,用户可以与区块链网络互动,并验证各自交易信息,不用下载及同步完整区块链。合并改进版本的比特币核心基础架构和可以相互兼容的以太坊虚拟机版本,使得量子链既拥有比特币坚不可摧的区块链网络又能发挥智能合约的无限可能。

    四、参考文献



  • Windows 32位安装完成后启动节点miner.start(1)命令报错,错误提示“eterbase address must be explicitly specified”0_1496200173495_upload-ba5bc2d1-e8c3-47bd-ba13-c3bd066493a2


  • qtum team

    @传说 在start之前你必须先用 personal.newAccount() 命令创建至少一个账号。



  • 多久没更新了,现在编译直接报错了0_1501921234072_cdb95385-6441-44a8-94e6-8b62c4089d4e-image.png


  • qtum team

    @xiadmin 当时使用的solidity版本为0.4.11



  • @CodeFace said in 以太坊私链与智能合约部署入门教程:

    solc --help

    我是一個不會編程的人,雖然我有Mac但是對於這篇教學操作起來還是有很大的難度......
    有沒有位好心人士可以更詳盡的說明怎麼運行操作,最好可以搭配步驟圖文會好很多。

    help


Log in to reply
 

Looks like your connection to QTUM was lost, please wait while we try to reconnect.