zoukankan      html  css  js  c++  java
  • 以太坊私链搭建

    安装Geth

    通过PPA在Ubuntu上安装

    在基于Ubuntu的发行版上安装go-ethereum的最简单方法是使用内置的启动板PPA(个人软件包档案)。我们提供的是包含了我们的稳定和开发版本的Ubuntu版本的单PPA仓库trusty,xenial,zesty和artful。

    要启用我们的启动板存储库,请运行:

    sudo add-apt-repository -y ppa:ethereum/ethereum

    然后安装稳定版的go-ethereum:

    sudo apt-get update
    sudo apt-get install ethereum

    安装golang

    sudo apt-get install golang

    搭建私链

    创建创世区块文件genesis.json

    {
      "config": {
        "chainId": <arbitrary positive integer>,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0
      },
      "alloc": {},
      "coinbase": "0x0000000000000000000000000000000000000000",
      "difficulty": "0x20000",
      "extraData": "",
      "gasLimit": "0x2fefd8",
      "nonce": "0x0000000000000042",
      "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "timestamp": "0x00"
    }

     这里可以先创建新账户,会生成一个以太坊地址

    # data为指定的文件夹
    geth account new --datadir data

    # 可以在创世区块中的 "alloc": {} 字段中预设一些地址中默认拥有多少以太币

    启动私链节点

    初始化节点0的创世区块

    # data0 节点所在文件目录
    geth --datadir data0 init genesis.json

    下面命令的主体是geth console,表示启动节点并进入交互式控制台,–datadir选项指定使用data0作为数据目录;–networkid选项后面跟一个数字,这里是1997,表示指定这个私有链的网络id为1997。网络id在连接到其他节点的时候会用到,以太坊公网的网络id是1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络id;console 2>> ./data0/01.log 的作用是将日志写入文件中,以免在控制台中刷屏;

    这两个参数不需要添加,可能会无法同步: --netrestrict 127.0.0.1/16 表示限制网络,只能与给定的IP网络(CIDR掩码)通信; --nodiscover 表示禁用对等发现机制(手动对等添加)。

    geth --datadir data0 --networkid 1997 --port 30301 --netrestrict 127.0.0.1/16 --nodiscover console 2>> ./data0/01.log

    运行上面的命令后,就启动了区块链节点并进入了Javascript Console:

    这是一个交互式的Javascript执行环境,在这里面可以执行Javascript代码,其中>是命令提示符。在这个环境里也内置了一些用来操作以太坊的Javascript对象,可以直接使用这些对象。这些对象主要包括:

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

    新增其他节点

    geth --datadir data1 init genesis.json
    
    geth --datadir data1 --networkid 1997 --port 30302 --netrestrict 127.0.0.1/16 --nodiscover console 2>> ./data1/01.log

    创建账户

    账户默认会保存在数据目录的keystore文件夹中。

    # 查看账户
    eth.accounts
    # 创建新账户
    personal.newAccount('你的密码1')
    # 可以创建多个账户
    personal.newAccount('你的密码2')

    查看账户余额(此时单位是wei)

    eth.getBalance(eth.accounts[0])
    eth.getBalance(eth.accounts[1])

     将余额转换成以太币(ether),1个以太币=10的18次方个wei

    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')

    启动/停止挖矿

    # 括号中的参数为挖矿的线程数,可以不设置,默认全力挖矿
    miner.start(10)
    # 第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
    
    # 停止挖矿
    miner.stop()
    # 输入的字符会被挖矿刷屏信息冲掉,没有关系,只要输入完整的miner.stop()之后回车,即可停止挖矿

    矿工的账户,叫做coinbase,默认情况下coinbase是本地账户中的第一个账户

    # 查看账户
    eth.coinbase
    
    # 修改账户
    miner.setEtherbase(eth.accounts[1])

     转账(账户每隔一段时间就会被锁定,需要先解锁)

    # 解锁
    personal.unlockAccount(eth.accounts[0])
    
    # 这里也可以使用web3.toWei(10,'ether')代替10000000000000000000
    eth.sendTransaction({from:"0x3e89eb888b8e98bfaeed304a4b71513ca1b17cac", to:"0x15c80a97e22ac48fdca0ef82c23eb2dd74ffc8d2",value:"10000000000000000000"})

    此时交易已经提交但还未被处理,使用 txpool.status 命令查看交易状态,miner.start(1)开始挖矿后即可处理

    # 查看交易池
    txpool.status

    启动挖矿,然后等待挖到一个区块之后就停止挖矿

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

    注意交易中会收取gas费

    查看区块

    # 查看区块数量
    eth.blockNumber
    
    # 根据区块编号
    eth.getBlock(48)

    # 根据交易哈希查看交易 eth.getTransaction(
    "0x31f2ce696a7de72e2d7d633c1926a7753ff36e38aba3b94e3670a7ca256405ba")

    手动连接其他节点

    # 参数为要连接节点的enode,在该节点使用命令admin.nodeInfo.enode
    获取
    admin.addPeer()

    作者:mhly

    博客:https://www.cnblogs.com/mhly

    本文采用BY-NC-SA许可协议,转载请注明出处

  • 相关阅读:
    redis接入sentinelPool的配置
    02.Redis主从集群的Sentinel配置
    淘宝大秒系统设计详解
    关于Thread.currentThread()和this的差异
    App开放接口api安全性—Token签名sign的设计与实现
    使用Spring Session做分布式会话管理
    PowerDesigner 15.1 安装步骤详细图解及破解
    解密ThreadLocal
    深入分析 ThreadLocal 内存泄漏问题
    一个经典例子让你彻彻底底理解java回调机制
  • 原文地址:https://www.cnblogs.com/mhly/p/14006871.html
Copyright © 2011-2022 走看看