以太坊-搭建私有链

私有链跟联盟链具体的概念请自行Google
无论私有链或者联盟链都是区块链,那么区块链总是要有创世区块,那么创世区块应该定义哪些东西呢?以太坊根据自己创建一个genesis.json(名字可以自定义,不过后面使用时要与这保持一致就OK)的配置。此文件就是一个内容格式为json的文本文件。

json文件的内容格式大致如下

{
 "alloc": {},
 "config": {
   "chainID": 888,
   "homesteadBlock": 0,
   "eip155Block": 0,
   "eip158Block": 0
 },
 "nonce": "0x0000000000000000",
 "difficulty": "0x4000",
 "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
 "coinbase": "0x0000000000000000000000000000000000000000",
 "timestamp": "0x00",
 "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
 "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
 "gasLimit": "0xffffffff"
}
参数名 参数描述
nonce nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
mixhash 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
difficulty 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
alloc 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
coinbase 矿工的账号,随便填
timestamp 设置创世块的时间戳
parentHash 上一个区块的hash值,因为是创世块,所以这个值是0
extraData 附加信息,随便填,可以填你的个性信息
gasLimit 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。
  • 搭建私有链
      1. 准备
        //创建一个文件夹作为私有链的根目录,我这在桌面进行创建prv-blockchain
        mkdir prv-blockchain
        //进入根目录
        cd prv-blockchain
        //创建一个 genesis.json文件
        touch genesis.json
        //按照以上说明添加相关信息,具体见[源码]()
    
      1. 初始化创世区块
      geth init ./genesis.json --datadir ./datas 
      /*
      说明:
          geth 使用geth客户端 
          init 初始化
         ./genesis.json 指定当前文件夹下的genesis.json文件为初始化配置文件
        --datadir  指定初始化出的数据路径,我指定的是当前文件夹下的datas路径(文件夹不存在自动创建)
    */
    

    执行完成结果如图,在datas文件夹下生成了geth和keystore两个文件夹,geth存放区块信息,keystore存放账户信息


    blockchain.png
      1. 启动私有链
        回到私有链的根目录,执行以下命令如图:
    //创建日志文件
    touch geth_out.log
    //启动私有链
    geth --datadir ./datas --nodiscover console 2>>geth_out.log
    

结果如图说明启动成功


res.png

私有链启动后使用Geth javascript console中操作账户、交易和挖矿等操作

  • 账户常用操作
    下面创建了两个账户,用于后面交易演示
//创建一个新的账户 123456是账户密码,在后续的交易会用到请牢记
  >personal.newAccount("123456")
"0x2dd39908a1292eea0863370942f17c6b44153afb"
//查看账户
> eth.accounts
["0x2dd39908a1292eea0863370942f17c6b44153afb"]
> personal.newAccount("1234567")
"0xf932088265ad297f4fa09ae849a01bb282f0cf3b"
> eth.accounts
["0x2dd39908a1292eea0863370942f17c6b44153afb", "0xf932088265ad297f4fa09ae849a01bb282f0cf3b"]
  • 开始/停止挖矿
//启动挖矿
> miner.start()
null
//查询区块数,如下如果一直在增加,说明正在挖矿
> eth.blockNumber
77
> eth.blockNumber
149
//停止挖矿
> miner.stop()
true
  • 查询账户余额

注:挖矿所得会默认保存到创建的第一个帐户

我们会发现挖矿地址和第一个地址是一样的
> eth.coinbase
"0x2dd39908a1292eea0863370942f17c6b44153afb"
> eth.accounts[0]
"0x2dd39908a1292eea0863370942f17c6b44153afb"

//查看账户余额,第一个账户是我们挖矿所得,第二个余额为0
> eth.getBalance(eth.accounts[0])
845000000000000000000
> eth.getBalance(eth.accounts[1])
0
//以上是以太币的最小单位Wei  使用这个方法可以查看格式化的以太币
> web3.fromWei(web3.eth.getBalance(eth.accounts[0]))
845
  • 交易(转账)
  //交易前我们需要解锁账户,不然会报如下错误
  Error: authentication needed: password or unlock
      at web3.js:3143:20
      at web3.js:6347:15
      at web3.js:5081:36
      at :1:1
//解锁账户,后面123456和1234567各自对应的是创建账户的时候所设置的密码
> personal.unlockAccount(eth.accounts[0],"123456")
true
>
//发送交易 输出的是交易的哈希
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(10,"ether")})
"0x98ba0ca7772cdbdf36278258780b7966c594bbc8208f6f8b9e64c0693b327c51"

> web3.fromWei(web3.eth.getBalance(eth.accounts[0]))
845
> web3.fromWei(web3.eth.getBalance(eth.accounts[1]))
0
//你会发现并没有转账成功,这是因为,没有人进行挖矿(其实挖矿就是校验和写入交易数据的过程),在下面我们启动挖矿
> miner.start()
null
//查看区块是否有增加
> eth.blockNumber
213
//停止挖矿
> miner.stop()
true

//你会发现第一个账户余额不减反多了,这是因为挖矿获得了新的以太币,你可以自己再多新建个账户,在第二和第三个账户间测试交易
> web3.fromWei(web3.eth.getBalance(eth.accounts[0]))
1125
> web3.fromWei(web3.eth.getBalance(eth.accounts[1]))
10
  • 其他常用命令
  //查看交易状态
  txpool.status
//查看待办
  eth.getBlock("pending",  true)
  • 参考:
    • https://mshk.top/2017/11/go-ethereum-1-7-2/#5

你可能感兴趣的:(以太坊-搭建私有链)