以太坊中私有链的搭建

一. 安装环境

  1. Ubuntu 64位 阿里云服务器
  2. geth 在线安装

    $ sudo add-apt-repository -y ppa:ethereum/ethereum
    $ sudo apt-get update
    $ sudo apt-get install ethereum
    • 1
    • 2
    • 3

二. 准备创世区块配置文件

  1. 将下面内容保存在一个json格式的配置文件 中,命名为genesis.json

    {
    "coinbase"   : "0x0000000000000000000000000000000000000000",
    "difficulty" : "0x400", "extraData" : "0x0", "gasLimit" : "0x2fefd8", "nonce" : "0xdeadbeefdeadbeef", "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp" : "0x00", "alloc" : {} }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

三. 初始化:写入创世区块

  1. 新建一个目录来存放区块链数据,假设新建的数据目录为~/privatechain/data0,genesis.json保存在~/privatechain中,此时目录结构应该是这样的:

    privatechain  
    ├── data0  
    └── genesis.json  
    • 1
    • 2
    • 3
  2. 进入privatechain中,执行初始化命令,其中–datadir选项后面跟一个目录名,这里为data0,表示指定数据存放目录为data0

    $ cd privatechain  
    $ geth --datadir data0 init genesis.json 
    • 1
    • 2

    当看到如下输出时,则说明初始化成功

    I0322 10:52:44.585282 cmd/geth/chaincmd.go:131] successfully wrote genesis block and/or chain rule set: b240e0678c2a8f87cf350225b528e3d97688aad6d4d84ee84e405c7fc9e37e4e 
    • 1
  3. 初始化成功后,会在数据目录data0中生成geth和keystore两个文件夹,此时目录结构如下:其中geth/chaindata中存放的是区块数据,keystore中存放的是账户数据。

    privatechain  
    ├── data0  
    │   ├── geth  
    │   │   └── chaindata  
    │   │       ├── 000002.log  
    │   │       ├── CURRENT  
    │   │       ├── LOCK  
    │   │       ├── LOG  
    │   │       └── MANIFEST-000003  
    │   └── keystore  
    └── genesis.json  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

四. 启动私有链节点

  1. 输入以下命令启动第一个节点,–datadir选项指定使用data0作为数据目录,–networkid选项后面跟一个数字,这里是314590,表示指定这个私有链的网络id。在多个节点私有网络中,id应该相同。

    geth --datadir data0 --networkid 314590 --ipcdisable --port 61910 --rpcport 8200 console
    • 1

    ps:用以上命令启动,因为geth版本原因,在后面挖矿时,会输出null,因此可以在启动命令后加–dev –dev.period 1。一般不需要,可以先检查一下当前系统中是否已经有用户。

  2. 当看到以下信息时,区块链节点运行成功

    Welcome to the Geth JavaScript console!  
    instance: Geth/v1.5.6-stable/linux/go1.7.3 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal: 1.0 rpc:1.0 txpool:1.0 web3:1.0 
    • 1
    • 2
    • 3

五. 账户的创建和管理

  1. eth.accounts 看当前节点上的所有用户
  2. 新建账户,输入密码,最后返回新建用户的id(公钥,账户地址)

    personal.newAccount()  
    Passphrase:   
    Repeat passphrase:   
    "0xc232e2add308136571bb8f9197ba4ae4e5ba9836"  
    • 1
    • 2
    • 3
    • 4
  3. 查看账户余额 eth.getBalance(eth.accounts[0])

六. 启动和停止挖矿

  1. 使用miner.start() 来启动挖矿,其中start的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。

    miner.start(1) 
    • 1
  2. 停止挖矿 miner.stop()

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

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

七. 发送交易

  1. 创建交易

    amount = web3.toWei(5,'ether')
    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}) 
    • 1
    • 2
  2. 账户解锁操作,账户每隔一段时间就会被锁住,要发送交易,必须先解锁账户,然后重新发送交易

    personal.unlockAccount(eth.accounts[0])  
    • 1
  3. 查看区块链中交易情况,有一条pending的交易,pending表示已提交但还未被处理的交易。

    txpool.status  
    {  
    pending: 1, queued: 0 } 
    • 1
    • 2
    • 3
    • 4
    • 5
  4. 使交易被处理,必须要挖矿。这里我们启动挖矿,然后等待挖到一个区块之后就停止挖矿:

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

八. 查看交易和区块

  1. 查看当前区块总数 eth.blockNumber
  2. 通过交易hash查看交易

    eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8f f5ec37fea6710adcab825")  
    • 1
  3. 通过区块号查看区块 eth.getBlock(33)

九. 连接到其它节点

  1. 查看当前节点信息 admin.nodeInfo.enode
  2. 可以在同一个服务器上建立另一个节点,在privatechain下,建立文件夹data1,然后输入初始化和启动命令.–bootndoes 是设置当前节点启动后,直接通过设置–bootndoes 的值来链接第一个节点, –bootnoedes 的值可以通过在第一个节的命令行中,输入:admin.nodeInfo.enode命令打印出来.

    geth --datadir data01 init ./genesis.json geth --datadir data01 --networkid 314590 --ipcdisable --port 61911 --rpcport 8101 --bootnodes "enode://ad307e052d0e04af519b8999fa870800df8a7a0cc2a91e6aea30e879b75c344dfa12c773a63a71677c2a3ea1254cf982815817f7ff58bd79e5837ea44d791a2d@192.168.1.2:61910" console
    • 1
    • 2
  3. 另一种添加节点的方法 在节点一上admin.addPeer(),就可以连接到节点二

    admin.addPeer("enode://9e86289ea859ca041f235aed87a091d0cd594b377cbe13e1c5f5a08a8a280e62d4019ac54063ed6a1d0e3c3eaedad0b73c40b99a16a176993f0373ffe92be672@127.0.0.1:61910")
    • 1
  4. 通过net.peerCount可以查看已连接到的节点数量

  5. 如果在不同服务器上搭建节点,则需要安装geth,重新开始前面的步骤

猜你喜欢

转载自www.cnblogs.com/qizhuocai/p/8927004.html