• 【区块链】以太坊Geth私有链条(单节点多节点)


    原文:https://blog.csdn.net/yinanmo5569/article/details/80339031

    以太坊官方网络(Official Network)

    以太坊官方网络有两种:

    • 生产环境网络(又称主网络)
    • 测试网络TestNet

    主网络是产生真正有价值的以太币的网络,是全球化,部署在Internet环境上的.智能合约的代码,执行,区块的调用,都可以清晰地查看到.而所有节点都是全球化的,速度较慢. 
    TestNet是专供用户来开发,调试和测试的.如果开发简单的智能合约的话,用测试网络就足够了,用户可以把更多的精力集中在智能合约的编写.但是由于网路是官方提供的,因此对于以太坊技术的底层实现,Geth的各种参数接口,整个以太坊技术真是性能的理解就会弱很多.所以从开发者的角度来说,一个更好的选择是Private Network,可以从技术的底层去深入理解以太坊.

    以太坊私有网络(Private Network)

    以太坊私有网络,就是由用户自己通过Geth创建的私有网络,是一个非常适合开发,调试和测试的网路.私有网路可以方便开发者深入理解以太坊的技术底层.

    ㈠安装虚拟机

    Root密码:123456
    Root密码:123456

    Admin密码:1234
    Admin密码:1234

    ㈡虚拟机联网

    vmware netword adapter vmnet8主机ipv4的IP地址为:192.168.2.3
    vmware netword adapter vmnet8主机ipv4的IP地址为:192.168.2.3

    虚拟机ip地址为:192.168.2.12
    虚拟机ip地址为:192.168.2.12

    ㈢安装Go语言环境

    1.10.3

    由于后面会出现版本兼容问题,因此此处需要将golong版本更改采用新版的:官网地址
    比如2018.6.18我下载1.10.3:1.10.3
    1、下载复制放到:opt/ethfan目录:

    1.1
    1.2
    如果之前安装过就删除无效的go
    1.3
    2、解压 tar -xvf
    文件名:tar -xvf go1.10.3.linux-amd64.tar.gz
    2.1 解压
    3、配置环境:gedit /etc/profile
    3.1
    4、查看版本
    版本

    1.8.1

    旧版参照1.8.1安装:访问go官网下载
    下载复制放到:opt/ethfan目录

    下载
    解压 tar -xvf 文件名
    解压
    配置GOPATH环境变量
    ①
    ②
    ③
    ④

    ㈣配置yum

    如果没有配置yum就要先配置yum

    ㈤下载和编译Geth

    安装C的编译器,但是:centos7中没有这个apt-get install -y build-essential
     我安装的是:yum -y install gcc

    ①
     克隆Github项目
    git clone https://github.com/ethereum/go-ethereum.git
    ②
     进入到文件目录,源码安装
    cd go-ethereum
    make geth
    
    错误说明

    错误说明我的版本是:1.8.1 不符合,应当改成至少是1.9
    解决方法:要么更改golong版本,要么更改geth版本
    更改golong版本为1.10.3:就好啦

    ③

     检验是否安装成功

    查看命令:build/bin/geth –help
    检查版本:build/bin/geth version
    ④
     配置geth环境
    ⑤
    source /etc/profile
    ⑥ 查看geth version
    ⑥ 查看geth version

    Geth搭建私有网络

    Step1:定义私有genesis state

    [admin@localhost ~]$ cd Code/blockchain
    [admin@localhost blockchain]$ mkdir go-ethereum

    [admin@localhost blockchain]$ gedit genesis.json

    [admin@localhost blockchain]$ mkdir privateNetwork

    创建一个新的文件夹privateNetwork,用来存储genesis.json文件和之后的私有链

    将下面的内容复制到genesis.json中:

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

    或者内容为:
    {
      "config": {
            "chainId": 22,
            "homesteadBlock": 0,
            "eip155Block": 0,
            "eip158Block": 0
        },
      "alloc"      : {},
      "coinbase"   : "0x0000000000000000000000000000000000000000",
      "difficulty" : "0x400",
      "extraData"  : "",
      "gasLimit"   : "0x2fefd8",
      "nonce"      : "0x0000000000000032",
      "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
      "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
      "timestamp"  : "0x00"
    }

    官方文档中的chainId为0,应该修改为非0的值,不然会导致 insufficient funds for gas * price + value 
    difficulty表示挖矿的难度值,官方文档中为0x20000,由于测试机器配置低,修改为0x05000。

    Step2:建立创世区块

    运行如下指令:

    [admin@localhost blockchain]$ geth --datadir "./privateNetwork" init go-ethereum/genesis.json

    结果如下:

    然后在privateNetwork中能发现geth和keystore两个新文件.

    • geth保存的是区块链的相关信息
    • keystore中保存的是该链条中的用户信息

    Step3:创建自己的私有链条

    运行如下命令:

    [admin@localhost privateNetwork]$ geth --networkid 14 --nodiscover --datadir "data/chain0" --rpc --rpcapi net,eth,web3,personal --rpcaddr localhostconsole 2>>geth.log

    nodiscover的意思是不被其他节点自动发现(可以手动添加节点) 
    或者命令类似为:geth --identity "TestNode" --rpc --rpcport "8545" --datadir /opt/ethfan/path/to/datadir --port "30303" --nodiscover console

    console是启动geth控制台,不加该选项,geth启动之后成为一个后台进程不会自动结束 
    最后把geth中的log信息导入geth.log中,方便了解geth运行的情况。 
    注意路径要加引号,不然会出问题.

    --nodiscover 关闭p2p网络的自动发现,需要手动添加节点,这样有利于我们隐藏私有网络
    --datadir 区块链数据存储目录
    --networkid 网络标识,私有链取一个大于4的随意的值
    --rpc 启用ipc服务,默认端口号8545
    --rpcapi 表示可以通过ipc调用的对象
    --rpcaddr ipc监听地址,默认为127.0.0.1,只能本地访问
    console 打开一个可交互的javascript环境
    更多参数:https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

    运行后面的再进入是这样的:

    进入geth

    创建账号:语法这里采用的是javascript输入两次密码123456,显示生成的账号

    创建新用户,密码是”ycx”,地址是"0x41b80248049bfa17e30beaa16c9f0e6b0e98fa6e"

    >personal.newAccount("ycx")

    Step4:在自己的私有链条上创建用户

    查看私有链已有账户,已经有账户(我创建过两次).

    >eth.accounts

    查看账户余额

    Step5:尝试挖矿

    继续在console中输入:

    >miner.start()

    开始挖矿,查看终端geth.log,如下:

    过了一段时间之后,再停止挖矿,查看账户,只要不为0则挖矿成功

    Geth搭建多节点私有链条

    搭建0号节点

    参照:上文

    搭建1号节点

    [root@localhost admin]# cd Code/blockchain/
    [admin@localhost blockchain]$ mkdir data

    创建步骤与之前是一样的,要保证两个节点在同一个区块链上工作的话首先要保证genesis创世区块链是一样的,所以注意使用同样的genesis.json文件来创建.用两个端口分别创建

    [root@localhost blockchain]$ geth --datadir "data/chain0" init go-ethereum/genesis.json
    [root@localhost blockchain]$ geth --datadir "data/chain1" init go-ethereum/genesis.json
    如果报错:

    启动0号,1号节点

    为了使两个节点同时启动,注意使用不同的port和rpc port.

    启动0号节点:

    geth --networkid 14 --nodiscover --datadir "data/chain0" --rpc --rpcapi net,eth,web3,personal --rpcaddr localhost console 2>>geth0.log

    如果报错:可以查看端口https://www.cnblogs.com/chinas/p/4553179.html

    geth --networkid 14 --nodiscover --datadir "data/chain0" --port 30303--rpc --rpcapi net,eth,web3,personal --rpcport 8545--rpcaddr localhost console 2>>geth0.log

    启动1号节点:

    geth --networkid 14 --nodiscover --datadir "data/chain1" --port 55554 --rpc --rpcapi net,eth,web3,personal --rpcport 8101 --rpcaddr localhost console 2>>geth1.log

    参数解释:

    --nodiscover 关闭p2p网络的自动发现,需要手动添加节点,这样有利于我们隐藏私有网络
    --datadir 区块链数据存储目录
    --port  网络监听端口,默认30303
    --networkid 网络标识,私有链取一个大于4的随意的值
    --rpc 启用ipc服务
    --rpcport ipc服务端口,默认端口号8545
    --rpcapi 表示可以通过ipc调用的对象
    --rpcaddr ipc监听地址,默认为127.0.0.1,只能本地访问
    console 打开一个可交互的javascript环境

    添加节点

    通过addPeer来添加节点.关于Geth JavaScript console的具体api可以在查询官方文档:https://github.com/ethereum/go-ethereum/wiki/Management-APIs

    首先查看1号节点的enode

    在0号节点的console,添加1号节点

    查看是否添加成功

    查看连接的节点数量和连接的节点列表:

    net.peerCount
    admin.peers

  • 相关阅读:
    【Python编程:从入门到实践】chapter6 字典
    【Python编程:从入门到实践】chapter5 if语句
    【Linux_Unix系统编程】Chapter9 进程凭证
    【Linux_Unix系统编程】Chapter10 时间
    【Linux_Unix系统编程】Chapter8 用户和组
    【Linux_Unix系统编程】chapter7 内存分配
    【Linux_Unix系统编程】chapter6 进程
    书籍 人生
    流程图软件
    技术文章,iOS,iOS开发系列 数学函数
  • 原文地址:https://www.cnblogs.com/ycx95/p/9181941.html
Copyright © 2020-2023  润新知