美文网首页
geth搭建私链小结

geth搭建私链小结

作者: kindol | 来源:发表于2018-09-21 15:46 被阅读0次

    写入创世区块

    geth --datadir data0 init genesis.json
    

    genesis.json作为区块链的头部,genesis.json部分内容举例如下

    {
      "config": {
            "chainId": 10, 
            "homesteadBlock": 0,
            "eip155Block": 0,
            "eip158Block": 0
        },
      "alloc"      : {},
      "coinbase"   : "0x0000000000000000000000000000000000000000",
      "difficulty" : "0x20000",
      "extraData"  : "",
      "gasLimit"   : "0x2fefd8",
      "nonce"      : "0x0000000000000042",
      "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
      "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
      "timestamp"  : "0x00"
    }
    

    字段解释:

    head.png

    --datadir data0表示存储私有链节点的文件夹,拷贝genesis.json到/home/kindol/eth 文件夹下,方便命令行操作

    在运行以上语句之后,会有在data文件夹下产生两个新的文件夹,geth和keystore两个文件夹,其中geth/chaindata目录中存放的是区块数据keystore存放的是账户数据

    启动私有链节点

    geth --datadir data0 --networkid 1108 console
    
    • 主要是geth console,表示启动节点并且进入交互式控制台
    • --networkid 1108表示这个私有链的网络id为1108,网络id在连接到其他节点的时候会用到以太坊公网的网络id是1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络id

    接着会进入一个交互式Javascript执行环境,这些对象主要包括:

    • eth:包含一些跟操作区块链相关的方法
    • net:包含以下查看p2p网络状态的方法
    • admin:包含一些与管理节点相关的方法
    • miner:包含启动&停止挖矿的一些方法
    • personal:主要包含一些管理账户的方法
    • txpool:包含一些查看交易内存池的方法
    • web3:包含了以上对象,还包含一些单位换算的方法

    geth console的使用

    • eth.accounts:查看所有私有链用户地址
    • personal.newAccount("password"):新建账户
    • eth.getBalance(eth.accounts[0]):通过账户地址查看账户余额(eth.accounts[0]可以替换为用户地址)
    • miner.start(2):开始挖矿,参数表示启动的线程数量,第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
    • miner.stop():停止挖矿

    挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做coinbase,默认情况下coinbase是本地账户中的第一个账户,使用

    • eth.coinbase:获得本地账户的第一个用户

    要想使挖矿奖励进入其他账户,通过miner.setEtherbase()将其他账户设置成coinbase即可:

    • miner.setEtherbase(eth.accounts[1])

    默认情况下,getBalance()返回值是wei,wei是以太币的最小单位,要查看有多少个以太币,可以使用如下换算:

    • web3.fromWei(eth.getBalance(eth.accounts[1]), 'ether');

    发起交易

    从user0转移5个以太币到user1中

    user0 = eth.accounts[0]
    "..."
    amount = web3.fromWei(5, 'ether')
    "..."
    personal.unlockAccount(user0)
    "..."
    eth.sendTransaction({from:user0, to:user1, value:amount})
    
    • personal.unlockAccount(user0):账户每隔一段时间就会被锁住,要发送交易,必须先解锁账户,由于我们要从账户0发送交易,所以要解锁账户0

    • eth.sendTransaction({from:user0, to:user1, value:amount}):固定格式,从user0发送amount比特币给user1

    • txpool.status:前面交易已经上交,但是还未处理,通过txpool查看

    > txpool.status
    {
      pending: 1,       //已经提交但还未被处理的交易
      queued: 0
    }
    

    要使交易被处理,必须要挖矿。这里我们启动挖矿,然后等待挖到一个区块之后就停止挖矿:

    miner.start(1); admin.sleepBlocks(1);miner.stop();
    

    结果如下:

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

    再次查看user1,发现已经获得了5个比特币

    web3.fromWei(eth.getBalance(user1), 'ether')
    5
    

    查看交易和区块

    • eth.blockNumber:查看当前的区块数量
    • eth.getTransaction("..."):通过交易hash查看交易
    • eth.getBlock(23):通过区块号查看区块

    创建私有链集群

    先启动一个节点,注意私有链的节点networkid必须一致

    geth --datadir data0 --networkid 1111 console
    
    • admin.nodeInfo.enode:获取节点实例的encode url

    再打开一个终端,初始化第二个节点:

    geth --datadir data1 --networkid 1111 init genesis.json
    geth --datair data1 --networkid 1111 --port 30304 --bootnodes "填入从另一个节点获得的encode url"
    

    注意当中的url的ip需要设置@[::]当中的内容为对应机子的ip

    • admin.nodeInfo:当前节点的信息,当中的enode即为encode url
    • admin.addPeer(encodeUrlOfFirst instance):也可以不在这里设置 --bootnodes,直接启动,进入命令行,通过命令把其他节点添加进来
    • net.peerCount:统计当前节点的邻居节点的数目
    • admin.peers:列举出其他节点的详细信息

    推荐阅读:

    https://blog.csdn.net/jomozz/article/details/79528741
    https://blog.csdn.net/w88193363/article/details/79402074
    

    注:区块链学习新人,若有不正确的地方,望指出

    相关文章

      网友评论

          本文标题:geth搭建私链小结

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