以太坊环境搭建

Posted by “silsuer” on August 7, 2018

搭建以太坊客户端

1. 环境搭建

  • 克隆项目:

       git clone https://github.com/ethereum/go-ethereum
    
  • 编译项目

       cd go-ethereum
       make geth 
    

    这时会在 build/bin 目录下生成编译好的geth程序

    将这个程序存入环境变量,这样做的目的是为了可以在所有目录下直接使用geth命令

     vim ~/.bash_profile
     // 在 .base_profile 文件中添加一行,或者修改原本的$PATH
     export PATH="/Users/silsuer/go/src/go-ethereum/build/bin:${PATH}"
       
     // 然后退出,重新source一下
     source ~/.bash_profile
    
  • 验证安装

    在任意文件夹下使用geth version,如下结果证明安装成功:

    Geth
    Version: 1.8.14-unstable
    Git Commit: eef65b20fcb3408dad11ecc79cd5c914993e8ed2
    Architecture: amd64
    Protocol Versions: [63 62]
    Network Id: 1
    Go Version: go1.10.3
    Operating System: darwin
    GOPATH=
    GOROOT=/usr/local/Cellar/go/1.10.3/libexec
    

2. 基础命令

  1. 新建一条私有链

    创建新的区块链之前需要准备一个json文件,用来配置创世区块

    {
      "config": {
            "chainId": 10,  // 区块链的ID,在 geth 命令中的 --networkid 参数需要与 chainId 的值一致,以太坊公网的id是1,要避免与公网冲突
            "homesteadBlock": 0, // Homestead 硬分叉区块高度,不需要关注
            "eip155Block": 0, // EIP 155 硬分叉高度,不需要关注
            "eip158Block": 0  // EIP 158 硬分叉高度,不需要关注
        },
      "alloc"      : {},
      "coinbase"   : "0x0000000000000000000000000000000000000000", // 矿工账号,第一个区块挖出后将给这个矿工账号发送奖励的以太币
      "difficulty" : "0x20000", // 难度值,越大越难
      "extraData"  : "", // 附加信息随便填
      "gasLimit"   : "0x2fefd8", // gas 的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大
      "nonce"      : "0x0000000000000042",// 一个 64 位随机数
      "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",// 与 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash
      "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", // 上一个区块的 hash 值
      "timestamp"  : "0x00" // 预设账号以及账号的以太币数量,私有链挖矿比较容易可以不配置
    }
    

    使用 init 命令:

        geth --datadir $HOME/privateNet/bootnode init genesis.json
    

    --datadir指定存放数据库的目录, init后面跟着上面我们定义好的创世区块配置文件

    至此,第一条私链搭建成功

  2. 启动私有链节点

             geth --datadir data0 --networkid 1108 console
    

    命令完成后会进入交互控制台,在其中可以对数据进行操作

    上面命令的主体是geth console,表示启动节点并进入交互式控制台,–datadir选项指定使用data0作为数据目录,–networkid选项后面跟一个数字,这里是1108,表示指定这个私有链的网络id为1108。网络id在连接到其他节点的时候会用到,以太坊公网的网络id是1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络id

  3. 在控制台中进行基本交互

  • 创建账号:

    personal.newAccount()

    创建时需要两次输入账户密码

  • 查看账户列表

    eth.accounts

  • 查看账户余额

    eth.getBalance(eth.accounts[0])

    getBalance()返回值的单位是weiwei是以太币的最小单位,1个以太币=10的18次方个wei。要查看有多少个以太币,可以用web3.fromWei()将返回值换算成以太币

      web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
    
  • 启动&停止挖矿

    miner.start(10)

    10代表挖矿时启用的线程数,第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿

    停止挖矿: miner.stop()

  • 设置挖矿奖励账户: miner.setEtherbase(eth.accounts[1])

    查看挖矿奖励账户: eth.coinbase

  • 发送交易:

    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})

    有时会报错,因为账户每隔一段时间就会被锁住,要发送交易,必须先解锁账户,由于我们要从账户0发送交易,所以要解锁账户0:

    personal.unlockAccount(eth.accounts[0])

  • 查看区块总数:

    eth.blockNumber

  • 通过区块号查看区块

       eth.getBlock(66)
            
            
      {
        difficulty: 135266,
        extraData: "0xd783010802846765746886676f312e31308664617277696e",
        gasLimit: 3350537,
        gasUsed: 0,
        hash: "0x265dfcc0649bf6240812256b2b9b4e3ae48d51fd8e43e25329ac111556eacdc8",
        logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
        miner: "0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f",
        mixHash: "0xaf755722f62cac9b483d3437dbc795f2d3a02e28ec03d39d8ecbb6012906263c",
        nonce: "0x3cd80f6ec5c2f3e9",
        number: 66,
        parentHash: "0x099776a52223b892d13266bb3aec3cc04c455dc797185f0b3300d39f9fc0a8ec",
        receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
        sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
        size: 535,
        stateRoot: "0x0c9feec5a201c8c98618331aecbfd2d4d93da1c6064abd0c41ae649fc08d8d06",
        timestamp: 1520391527,
        totalDifficulty: 8919666,
        transactions: [],
        transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
        uncles: []
      }
    
    
  • 通过哈希查看交易:

     eth.getTransaction("0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6")
     
     {
       blockHash: "0x1cb368a27cc23c786ff5cdf7cd4351d48f4c8e8aea2e084a5e9d7c480449c79a",
       blockNumber: 463,
       from: "0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f",
       gas: 90000,
       gasPrice: 18000000000,
       hash: "0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6",
       input: "0x",
       nonce: 0,
       r: "0x31d22686e0d408a16497becf6d47fbfdffe6692d91727e5b7ed3d73ede9e66ea",
       s: "0x7ff7c14a20991e2dfdb813c2237b08a5611c8c8cb3c2dcb03a55ed282ce4d9c3",
       to: "0x46b24d04105551498587e3c6ce2c3341d5988938",
       transactionIndex: 0,
       v: "0x38",
       value: 10000000000000000000
     }

下次写简单的智能合约23333333