以太同步数据库多大 第02课:以太坊私链搭建&公链同步

入门知识 2周前 (06-21) 19次浏览 0个评论

在上一篇文章中,我们介绍了以太坊geth节点的基本操作。在本文中,我们将向您展示如何在不同环境下构建geth服务、相关配置和操作流程。

开发模式启动

开发模式,也叫回归测试模式,主要用于为开发者提供一个方便的开发和测试环境。这样我们就可以轻松获取以太币,方便发起交易,交易快速打包,节省时间,方便验证;并且我们也可以使用 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:  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模式下,启动节点以太同步数据库多大,会默认提供一个开发者账号:45,这个账号会作为当前账号使用,还有对应的加密私钥文件在目录中。

实践经验

默认启动模式在当前版本中有点混乱,但请相信 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"

这是什么?这是默认启用的开发模式的功能之一。为了给测试环境提供更友好的操作,geth节点的开发者:你发交易我只会挖矿打包。如果交易没有发送,我不会挖矿和打包。是不是很方便,不用被一些没有交易的区块筛选?

但是这种模式有一个缺点,就是发送一笔交易想要多次确认是不是很费力,而且后面还需要发送N笔交易?这个不用担心,后面会讨论另一种模式。

实践经验

有同学又问了,我想用这种模式发起交易以太同步数据库多大,但是没有ether怎么办?因为以太币只有在发起交易后才能开采,而发起交易需要以太币。这不是形成无限循环吗?对于这个问题,别着急,geth节点已经为你想好了,我们来看看开发者账户的余额:

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

看看里面是否有足够的以太? !

开发者的自动挖掘

在官方文档中,我们可以看到以下参数。该参数默认为0,也就是上面提到的被动挖矿模式。仅当待处理的交易到达时才执行挖掘。同时它还有一个参数值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

这将回到常见的疯狂挖矿模式。当然,此时你仍然可以执行停止命令停止挖矿。以下是挖矿时的日志输出:

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] 

挖矿网Ethos中文站简单易用的挖矿系统,为挖矿产业提供教程软件以及矿机测评交易信息等,挖矿网各种数字货币挖矿收益对比计算,挖矿网介绍挖矿的工具,以及矿场的最新消息等。http://www.ethospool.com/

喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址