以太坊私有链搭建

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

搭建

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

配置文件

在喜欢的位置新建一个文件夹,并在进入该文件夹运行 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 的快速入门还是非常简单的,希望本片能够对大家产生一点点的帮助。

祝进步!

你可能感兴趣的:(以太坊)