?? ?? 由此,找到提示所在的代码,是
?? ?? state/execution.go:229:logger.Info("Executed block", "height", block.Height, "validTxs", validTxs, "invalidTxs", invalidTxs)
?? ?? 这里对应的函数是execBlockOnProxyApp,这个函数,是先向abci提交block,然后再执行block,再跟投票节点更新validator。
?? 5.2 execBlockOnProxyApp在state/execution.go:409被执行,此处函数名ExecCommitBlock,它做5.1的执行动作,然后向 链 提交block。
?? 5.3 ExecCommitBlock在consensus/replay.go:344被执行,此处函数名replayBlocks。
?? 5.4 replayBlocks又被同名首字母大写ReplayBlocks函数调用
?? 5.5 ReplayBlocks被Handshake函数调用,
?? 5.6 Handshake被proxy/multi_app_conn.go:108被调用,在接口里实现了multiAppConn的OnStart函数。NewMultiAppConn创建一组链接。
?? 5.7 NewMultiAppConn被NewAppConns调用
?? 5.8 NewAppConns被node/node.go:164 调用,也就是NewNode函数
?? 5.9 NewNode函数被node/node.go:78调用,也就是DefaultNewNode
?? 5.10 DefaultNewNode在cmd/tendermint/main.go:35调用
?? 5.11 在main函数,cobra有一个NewRunNodeCmd操作DefaultNewNode,主要是为了创建新节点。
?? 5.12 如果是本地运行,node init已经执行,然后运行 tendermint node --proxy_app=dummy,则进入AddNodeFlags函数设置参数,proxy_app对应config.ProxyApp,ProxyApp的默认值是"tcp://127.0.0.1:46658",
?? 5.13??
6. 调试 dummy app的运行过程
?? node --proxy_app=dummy
?? 运行到run_node.go的n, err := nodeProvider(config, logger)就开始输出commit state信息了。nodeProvider就是 nm.NodeProvider
?? 再到 node.go的NewNode
?? 再到 blockStoreDB, err := dbProvider(&DBContext{"blockstore", config})
?? 再到 DefaultDBProvider
?? 再到 proxyApp.Start(),开始启动服务,出现committed state
?? 再到NewNode完成各种行为,
?? NewNode函数最重要。
7. tendermint node --proxy_app=dummy运行机制
?? 7.1 这个过程,首先会启动一个进程内的dummy app,这个dummy app是一个client,每一秒向tendermint的共识引擎发送一次请求。client的代码在tendermint/abci/client.go和proxy/client.go里。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-85575-3.html
他还敢来吗