第02课:以太坊私链搭建

第02课:以太坊私链搭建 & 公链同步

上一篇内容我们介绍了以太坊 geth 节点的基本操作,本篇内容就带大家搭建不同环境下 geth 的服务、相关配置及操作流程。

dev 模式启动

dev 模式,也叫回归测试模式,主要用来给开发人员提供一个方便的开发测试环境。这样,我们可以轻松的获得以太币,方便发起交易,交易也会被快速的打包,节省时间方便验证;而且我们还可以利用 dev 模式进行区块孤立场景的测试。dev 模式的启动与上一篇所讲的启动命令有所区别,下面就带大家详细了解一下。

dev 模式默认启动

--dev  使用POA共识网络,默认预分配一个开发者账户并且会自动开启挖矿。

启动 dev 模式其实很简单,在我们上一篇内容中命令后面添加 -dev 即可。

>./geth --datadir /Users/zzs/develop/eth/geth/data-test --rpc --rpcapi "db,eth,net,web3,miner,personal" -dev

这样就启动了 dev 模式,我们来看一下启动日志信息:

WARN [04-02|09:04:34] No etherbase set and no accounts found as default
INFO [04-02|09:04:35] Using developer account                  address=0xADCE6e0E1eE491e7c1945e76d3dc5975418C4e45
INFO [04-02|09:04:35] Starting peer-to-peer node               instance=Geth/v1.7.3-stable-4bb3c89d/darwin-amd64/go1.9.2
INFO [04-02|09:04:35] Allocated cache and file handles         database=/Users/zzs/develop/eth/geth/data-test/geth/chaindata cache=128 handles=1024
INFO [04-02|09:04:35] Writing custom genesis block
INFO [04-02|09:04:35] Initialised chain configuration          config="{ChainID: 1337 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: 0 EIP155: 0 EIP158: 0 Byzantium: 0 Engine: clique}"
INFO [04-02|09:04:35] Initialising Ethereum protocol           versions="[63 62]" network=1
INFO [04-02|09:04:35] Loaded most recent local header          number=0 hash=419c07…e277dd td=1
INFO [04-02|09:04:35] Loaded most recent local full block      number=0 hash=419c07…e277dd td=1
INFO [04-02|09:04:35] Loaded most recent local fast block      number=0 hash=419c07…e277dd td=1
INFO [04-02|09:04:35] Regenerated local transaction journal    transactions=0 accounts=0
INFO [04-02|09:04:35] Starting P2P networking
INFO [04-02|09:04:35] started whisper v.5.0
INFO [04-02|09:04:35] RLPx listener up                         self="enode://e630c712e4c2f52f4d535a9ded1c7489a579abea4420753e4d6a899736ed512a4858684e24457484d61d3093a9b1882cc3d11e92241e1f91a1300f9aa117f671@[::]:52275?discport=0"
INFO [04-02|09:04:35] IPC endpoint opened: /Users/zzs/develop/eth/geth/data-test/geth.ipc
INFO [04-02|09:04:35] HTTP endpoint opened: http://127.0.0.1:8545
INFO [04-02|09:04:35] Transaction pool price threshold updated price=18000000000
INFO [04-02|09:04:35] Starting mining operation
INFO [04-02|09:04:35] Commit new mining work                   number=1 txs=0 uncles=0 elapsed=69.581µs
WARN [04-02|09:04:35] Block sealing failed                     err="waiting for transactions"
INFO [04-02|09:04:38] Mapped network port                      proto=tcp extport=52275 intport=52275 interface="UPNP IGDv1-IP1"

通过日志可以看到,在 dev 模式下,启动节点之后,会默认提供一个开发者账号:0xADCE6e0E1eE491e7c1945e76d3dc5975418C4e45,这个账号会作为当前的 coinbase 账号,在 keystore 目录下也有对应的加密私钥文件。

实战经验

默认启动模式在当前版本中是有一些迷惑人的地方,但请相信 geth 开发者的初衷是友好的。当启动节点之后,指定 miner.start() 命令并不会返回 true,进行挖矿。

> miner.start()
null

这样大家经常咨询的一个问题,为什么呢?其实,在 dev 默认模式启动的情况下,已经开启了挖矿,因此当再执行挖矿命令时会返回 null。以下是挖矿命令对应的源代码,也就是说无论是否成功挖矿都会返回 null。

func (s *Ethereum) StartMining(local bool) error {
    eb, err := s.Etherbase()
    if err != nil {
        log.Error("Cannot start mining without etherbase", "err", err)
        return fmt.Errorf("etherbase missing: %v", err)
    }
    if clique, ok := s.engine.(*clique.Clique); ok {
        wallet, err := s.accountManager.Find(accounts.Account{Address: eb})
        if wallet == nil || err != nil {
            log.Error("Etherbase account unavailable locally", "err", err)
            return fmt.Errorf("signer missing: %v", err)
        }
        clique.Authorize(eb, wallet.SignHash)
    }
    if local {
        // If local (CPU) mining is started, we can disable the transaction rejection
        // mechanism introduced to speed sync times. CPU mining on mainnet is ludicrous
        // so noone will ever hit this path, whereas marking sync done on CPU mining
        // will ensure that private networks work in single miner mode too.
        atomic.StoreUint32(&s.protocolManager.acceptTxs, 1)
    }
    go s.miner.Start(eb)
    return nil
}

交易模式

再看一下启动日志中的此行信息:

WARN [04-02|09:04:35] Block sealing failed                     err="waiting for transactions"

这是什么?这就是默认启动 dev 模式的一个特性之一。geth 节点的开发者为了给测试环境提供一个更友好的操作:只有你发过来交易我才会挖矿打包,如果未发送交易过来,就不会去挖矿打包。这样是不是很方便,不用被一些并没有交易的区块刷屏了。

但是此模式有一个弊端,那就是发送一笔交易想让它被确认多次是不是很费劲,还需要再在后面发送 N 次交易?这个不用担心,后面会讲到另外一种模式。

实战经验

有同学又问了,这种模式我想发起交易,可是没有以太币怎么办?因为只有发起了交易才能挖到以太币,而发起交易又需要以太币,这不是形成了一个死循环了吗?针对这个问题,不用担心,geth 节点已经为你想到了,我们来查询一下开发者账号里面的余额:

> eth.getBalance("0xadce6e0e1ee491e7c1945e76d3dc5975418c4e45")
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+77

看看里面的以太币是不是已经足够使用了?!

dev 之自动挖矿

在官方文档中我们可以看到如下参数,此参数默认为 0,也就是上面讲的被动挖矿的模式,当有 pending 交易到来才进行挖矿,同时它还有一个参数值 1,主动挖矿。

--dev.period value  开发者模式下挖矿周期 (0 = 有pending状态交易时进行挖矿) (默认: 0)

此时启动命令如下:

>./geth --datadir /Users/zzs/develop/eth/geth/data-test --rpc --rpcapi "db,eth,net,web3,miner,personal" -dev --dev.period 1

这样就回到常见的疯狂挖矿的模式了,当然此时还是可以执行 stop 命令来停止挖矿的。以下是挖矿时的日志输出:

``` INFO [04-02|09:33:59] Starting mining operation INFO [04-02|09:33:59] Commit new mining work number=1 txs=0 uncles=0 elapsed=103.436µs INFO [04-02|09:33:59] Successfully sealed new block number=1 hash=3fe3df…3a0a53 INFO [04-02|09:33:59]

上一篇
下一篇
内容互动
写评论
加载更多
评论文章