美文网首页
以太坊私有链搭建

以太坊私有链搭建

作者: bei6 | 来源:发表于2019-03-18 00:06 被阅读0次

    以太坊私有链的搭建和运行

    搭建

    私有链的搭建主要就是一个配置文件,其他的没什么。

    配置文件

    在喜欢的位置新建一个文件夹,并在进入该文件夹运行 terminal。
    例如:/home/robinu/workspace/private.chaincode
    编辑一个文件:

    gedit gensis.json
    

    写入该配置信息:

    {
        "config": {
            "chainId": 10,
            "homesteadBlock": 0,
            "eip155Block": 0,
            "eip158Block": 0
        },
        "alloc": {
            "0xc9228294cc6bc3e3fcdba0f5d393d68f920c7789": {
                "balance": "999000000000000000000"
            }
        },
        "nonce": "0x0000000000000001",
        "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "difficulty": "0x01",
        "coinbase": "0x0000000000000000000000000000000000000000",
        "timestamp": "0x00",
        "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "extraData": "",
        "gasLimit": "0xffffffff"
    }
    

    保存并关闭。

    参数说明

    参数 说明
    config.cainId 区块链网络 id(以太坊公网 id 是 1)
    config.homesteadBlock homestead 算法块
    config.eip155Block eip155 算法块
    config.eip158Block eip158 算法块
    alloc 预设账户
    nonce 挖矿用的随机数
    mixhash 与 nonce 配合挖矿,与上一个区块的 hash 有关
    difficulty 挖矿难度
    coinbase 矿工账号
    timestamp 时间戳
    extraData 块额外信息,挖出块的矿工可随便写点什么
    gasLimit 汽油费最大限制

    初始化网络

    /home/robinu/workspace/private.chaincode 目录新建一个存放初始化文件的文件夹。
    姑且叫做 db

    mkdir db
    

    执行初始化命令:

    geth --datadir ./db init gensis.json
    

    初始化脚本执行后目录结构如下:

    .
    ├── db
    │   ├── geth
    │   │   ├── chaindata
    │   │   │   ├── 000002.ldb
    │   │   │   ├── 000003.log
    │   │   │   ├── CURRENT
    │   │   │   ├── CURRENT.bak
    │   │   │   ├── LOCK
    │   │   │   ├── LOG
    │   │   │   └── MANIFEST-000004
    │   │   └── lightchaindata
    │   │       ├── 000002.ldb
    │   │       ├── 000003.log
    │   │       ├── CURRENT
    │   │       ├── CURRENT.bak
    │   │       ├── LOCK
    │   │       ├── LOG
    │   │       └── MANIFEST-000004
    │   └── keystore
    └── gensis.json
    
    • chaindata:存放区块数据。
    • keystore:存放账户数据。

    运行

    启动网络

    geth --datadir ./db/ --port 10000 --networkid 100 --nodiscover --rpc --rpcaddr 0.0.0.0 --rpcport 10001 --rpcapi eth,net,web3,personal,admin,shh,txpool,debug,miner --rpccorsdomain "*"
    

    参数说明

    参数 说明
    datadir 指定当前区块链 private key 和 net data 存放位置
    port 指定网络端口
    networkid 网络 id(1:公链;3:测试链;其他的随意;)
    nodiscover 关闭节点发现
    rpc 开启 rpc
    rpcaddr rpc ip(0.0.0.0 允许所有)
    rpcport rpc port
    rpcapi 设置允许连接的客户端
    rpccorsdomain 允许的访问源
    console 如果加上该参数,则执行后立即进入 console

    进入终端

    保持启动网络的 terminal 不要关闭,重新在当前目录启动一个 terminal,执行以下命令进入终端。

    geth --datadir ./db/ attach ipc:./db/geth.ipc
    

    该终端可以执行 JavaScript 命令,语法也是一样的。

    退出终端只需要输入: exit 即可。

    转账案例

    以下确保都在终端中执行。

    新建账户

    转账至少需要 2 个账户,因此首先创建两个账户:

    personal.newAccount('123456')
    personal.newAccount('123456')
    

    括号里面的是密码。

    这时候查看用户:

    eth.accounts
    

    可以看到有 2 个地址了。

    查看余额

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

    返回的余额都是 0
    由于新的账户都是没有余额的,因此,我们需要通过挖矿产生一些余额以便于转账交易。

    挖矿

    设置矿工账户

    在终端执行挖矿需要提前设置好矿工地址(账户),之后挖到矿的奖励都会发送到该账户。
    通过该命令设置第 0 个账户接受挖矿奖励:

    miner.setEtherbase(eth.accounts[0])
    

    返回 true 表示设置成功。
    也可以自己确认一下哦:

    eth.accounts
    

    获得全部用户(应该有两个)

    eth.coinbase
    

    应该输出了上边的第一个地址。

    开始挖矿

    矿工账户设置好了以后就可以挖矿啦:

    miner.start(1)
    

    请保持挖矿这个终端不要关闭哦

    查看块高

    然后在新打开一个终端,同样进入 geth 的 JavaScript 终端。

    多次执行 eth.blockNumber 观察块高。可以看到会不断的增长。这表示一直有矿被挖到。

    停止挖矿

    挖矿终端 执行:

    miner.stop()
    

    停止挖矿。

    这时候再去查看块高的终端查看块高,可以观察到块高已经不再变化啦。

    没有特殊需要的话,可以关闭查看块高的终端啦。

    此时只需要保持 启动网络的终端挖矿终端 即可。

    查看余额
    balance = web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether')
    

    根据挖出的块的数量,可能会有不同的余额值。

    解锁账户

    使用矿工账户(因为只有他有钱)发起交易,需要首先 解锁账户,因为能解锁,代表你有权利操作该账户嘛。

    personal.unlockAccount(eth.accounts[0], '123456')
    

    返回 true

    发起转账

    eth.sendTransaction({ from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, 'ether') })
    

    返回交易 hash

    由于现在没有人在挖矿,因此交易信息永远不会被打包到区块链,处于挂起(pending)的状态。可以通过如下命令查看:

    txpool.inspect.pending
    
    > txpool.inspect.pending
    {
      0x203c5370135851c800049e9D7eA3C598317446a7: {
        0: "0x438b39e5B6a23003ea5BF49435A0107d43303F72: 1000000000000000000 wei + 90000 gas × 1000000000 wei"
      }
    }
    

    返回值表明了交易转账了 1 eth 也就是 十的八次方 wei,并且给出 90000 gas × 1000000000 wei 汽油费。

    所以说现在又需要执行挖矿啦

    再次挖矿

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

    这个命令会在挖出一个区块后直接停止挖矿。
    再次查看挂起的交易,已经空空如也了。

    txpool.inspect.pending
    

    查看余额

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

    acounts[1] 现在已经有 1 个币了。

    结束语

    以太坊 基于 geth 的快速入门还是非常简单的,希望本片能够对大家产生一点点的帮助。

    祝进步!

    相关文章

      网友评论

          本文标题:以太坊私有链搭建

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