美文网首页
以太坊私链的搭建详情

以太坊私链的搭建详情

作者: CPinging | 来源:发表于2018-12-25 22:31 被阅读20次

    私链搭建过程

    这里我使用了JSON格式的搭建方法,并使用Geth来辅助搭建。

    注意:这里使用的是MacOs系统

    参考文章:https://www.cnblogs.com/lion.net/p/7809862.html

    第一步,我们需要下载geth源码并编译。

    1 首先打开https://github.com/ethereum/go-ethereum.git
    
    2 下载压缩包到某个文件夹下
    
    3 cd go-ethereum-master
    
    4 make geth
    
    5 make all
    

    然而,当我运行geth命令,我发现并不能成功:

    后来经过一番测试,我们要这样运行(找到源码的bin目录下的geth):

    image.png

    之后,我们需要在某个文件夹下创建xxx.json文件:

    image.png

    方法如下:

    cat > cp.json
    
    {
        "config": {
          "chainId": 15,
          "homesteadBlock": 0,
          "eip155Block": 0,
          "eip158Block": 0
        },
        "difficulty": "4",
        "gasLimit": "2100000",
        "alloc": {
          "7df9a875a174b3bc565e6424a0050ebc1b2d1d82": {
            "balance": "300000"
          },
          "f41c74c9ae680c1aa78f42e5647a62f353b7bdde": {
            "balance": "400000"
          }
    } }
    
    

    这里我们初始化了两个地址,并赋值了启动资金。

    "alloc": {
          "7df9a875a174b3bc565e6424a0050ebc1b2d1d82": {
            "balance": "300000"
          },
          "f41c74c9ae680c1aa78f42e5647a62f353b7bdde": {
            "balance": "400000"
          }
    

    之后,我们需要在拥有cp.json的文件夹下运行命令:

    geth init cp.json --datadir blockchainData
    
    

    之后我们在另外一个shell中运行:

    geth --networkid 123 --datadir blockchainData console
    

    以便打开终端。

    然后我们可以运行相应的命令:

    由于我们在这个地址下预存了部分钱,所以能够显示余额。

    image.png

    查看帐户,可以看到当前帐户是空的:

    web3.eth.accounts
    

    创建帐户的方式有两种,第一种创建帐户时直接初始化密码:

    web3.personal.newAccount("123456")
    
    image.png

    其中返回的0xb2d06dc22f1bcd9f8c2f7530d955480c49be40e5是帐户,123456是帐户的密码。

    第二种方法是先创建账户,然后输入密码:

    > web3.personal.newAccount()
    Passphrase:
    Repeat passphrase:
    

    此时我们查看账户情况:

    image.png

    这个时候,我们需要设置一个miner:

    miner.setEtherbase("0xb2d06dc22f1bcd9f8c2f7530d955480c49be40e5")。
    

    之后我们开始挖矿:

    得到:

    image.png

    之后我们编写智能合约:

    pragma solidity ^0.4.4;
                    
    contract test {
        function multiply(uint a) constant returns(uint d){
            return a * 7;
        }
    }
    

    之后我们需要获得:

    • 字节码
    image.png image.png
    > var bin = "0x6060604052341561000f57600080fd5b60b18061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a72305820b4a0d85170cc10fb54be34cdb092932573cb7cff24711610a0b1b71a06cc34c90029"
    undefined
    

    这里注意:0x

    之后我们输入bin

    image.png

    对于abi,我们需要借助网站:http://www.bejson.com/jsonviewernew/

    我们复制下面内容:

    image.png

    点击这个:


    得到:

    image.png

    继续点击去除转义:

    image.png

    得到:

    [{"constant":true,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
    

    复制到shell中,我们得到:

    > var ab = [{"constant":true,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
    
    image.png
    > abi
    [{
        constant: true,
        inputs: [{
            name: "a",
            type: "uint256"
        }],
        name: "multiply",
        outputs: [{
            name: "d",
            type: "uint256"
        }],
        payable: false,
        stateMutability: "view",
        type: "function"
    }]
    

    之后我们需要查询这个函数需要的gas值:

    web3.eth.estimateGas({data: bin})
    
    image.png

    之后

    > var my = eth.contract(abi)
    undefined
    > var contract = my.new({from:cp0,data:bin,gas:100000});
    INFO [12-25|21:07:30.564] Submitted contract creation              fullhash=0xbd82da7cfd303de1c5abcc74352bb09fb421b6329cca4583cd69ff5e14fc5d8d contract=0xA87B6429EC4A7bADDC033014B37b12B970bc1D5f
    undefined
    

    这里cp0我曾经运行过 cp0 = web3.eth.accounts[0]

    之后运行contract

    > contract
    {
      abi: [{
          constant: true,
          inputs: [{...}],
          name: "multiply",
          outputs: [{...}],
          payable: false,
          stateMutability: "view",
          type: "function"
      }],
      address: undefined,
      transactionHash: "0xbd82da7cfd303de1c5abcc74352bb09fb421b6329cca4583cd69ff5e14fc5d8d"
    }
    

    然而这个私链机制需要我们进行挖矿才能得到后续的动作:

    > miner.start()
    INFO [12-25|21:08:49.037] Updated mining threads                   threads=4
    INFO [12-25|21:08:49.037] Transaction pool price threshold updated price=1000000000
    null
    

    之后查看区块状态:

    > txpool.status
    {
      pending: 0,
      queued: 0
    }
    

    查看这个合约的地址:

    > eth.getCode(contract.address)
    "0x606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a72305820b4a0d85170cc10fb54be34cdb092932573cb7cff24711610a0b1b71a06cc34c90029"
    

    之后我们运行合约:

    image.png

    即部署成功。

    相关文章

      网友评论

          本文标题:以太坊私链的搭建详情

          本文链接:https://www.haomeiwen.com/subject/klbqlqtx.html