以太坊私链搭建

Posted by 谢智健 on October 10, 2018

You may find interesting:


2018.1.18区块链论文讨论班通知


Nothing at stake problem of PoS

参考地址

因为本人最近项目负责以太坊智能合约的测试需要搭建测试环境,目前采用的方法是私链+truffle,要实现如下目标

  1. 搭建一条以太坊的私链
  2. 将爬虫爬到的合约(https://etherscan.io)部署到私有链中

本人部署使用的环境

  • Ubuntu18.04
  • Geth 1.7.3-stable
  • Truffle v4.1.14(core:4.1.14)
  • Solidity v0.4.25(直接编译二进制包)

搭建私有连

  1. 创建目录ethTest :mkdir ethTest
  2. 编写创世区块,放入ethTest目录下,命名为genesis.json
    {
      "config": {
     "chainId": 10,
     "homesteadBlock": 0,
     "eip155Block": 0,
     "eip158Block": 0
      },
      "alloc"      : {},
      "coinbase"   : "0x0000000000000000000000000000000000000000",
      "difficulty" : "0x20000",
      "extraData"  : "",
      "gasLimit"   : "0xffffffff",
      "nonce"      : "0x0000000000000042",
      "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
      "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
      "timestamp"  : "0x00"
    }
    

解释一下参数

  • chainId:是EIP155(EIP是以太方改进建议)里定义的发送交易到哪种链的方式。这里设置为10,truffle.js(truffle的初始化文件)的network_id也得是10,否则truffle将无法找到创建的私链
  • lloc:用来预设账号和账号的以太币数量,此处不预设,需要时候自己创建
  • gasLimit:gas的限制,私链测试时尽量设值加大,避免部署失败
  • difficulty:挖矿的难度,测试链尽量降低
CHAIN_ID Chain(s)
1 Ethereum mainnet
2 Morden (disused), Expanse mainnet
3 Ropsten
4 Rinkeby
30 Rootstock mainnet
31 Rootstock testnet
42 Kovan
61 Ethereum Classic mainnet
62 Ethereum Classic testnet
1337 Geth private chains (default)
  1. 创建创世块:geth –datadir “./” init genesis.json1.
    • datadir:是指定区块连数据和账户的存储目录。
    • 这句话的意思是创建2个数据库chaindata和lightchaindata,并把genesis.json的数据分别写入这两个leveldb中。
  2. 启动以太坊,同时进入js交互控制台:geth –datadir “./” –rpc –rpccorsdomain=”*” console
    • rpccorsdomain是允许chrome插件MetaMask,remix等跨域访问web3接口
  3. 在启动矿工进行挖矿之前我们必须创建一个账户,并将其设为ether base账户(默认第一个创建的账户为基础账户,挖到的以太币会自动保存到此账户)–在geth客户端里面操作
    • 具体步骤
    • 创建账户:personal.newAccount(“密码”)
    • 返回一个账户地址:0xad30387c05b527a85f45186c2b8aab5e1af2f227
    • 这个账户将会保存在 ./datadir/keystore 文件下
  4. 将某个账号设置为矿工etherbase(一般默认第一个账户eth.accounts[0]为矿工无需设置):miner.setEtherbase(eth.accounts[0])

自此私链搭建完毕