兄弟连区块链教程以太坊源码分析CMD深入分析(一)

栏目: 编程工具 · 发布时间: 6年前

内容简介:兄弟连区块链教程以太坊源码分析CMD深入分析。cmd下面总共有13个子包,除了util包之外,每个子包都有一个主函数,每个主函数的init方法中都定义了该主函数支持的命令,如其中Name是对应命令的指令,action是调用该指令去完成的动作,usage表示用途,arguUsage显示该命令后面跟的参数个数以及每个参数的意义,

兄弟连区块链教程以太坊源码分析CMD深入分析。

cmd包分析

cmd下面总共有13个子包,除了util包之外,每个子包都有一个主函数,每个主函数的init方法中都定义了该主函数支持的命令,如

geth包下面的:

func init() {
    // Initialize the CLI app and start Geth
    app.Action = geth
    app.HideVersion = true // we have a command to print the version
    app.Copyright = "Copyright 2013-2017 The go-ethereum Authors"
    app.Commands = []cli.Command{
        // See chaincmd.go:
        initCommand,
        importCommand,
        exportCommand,
        copydbCommand,
        removedbCommand,
        dumpCommand,
        // See monitorcmd.go:
        monitorCommand,
        // See accountcmd.go:
        accountCommand,
        walletCommand,
        // See consolecmd.go:
        consoleCommand,
        attachCommand,
        javascriptCommand,
        // See misccmd.go:
        makecacheCommand,
        makedagCommand,
        versionCommand,
        bugCommand,
        licenseCommand,
        // See config.go
        dumpConfigCommand,
    }
    sort.Sort(cli.CommandsByName(app.Commands))
}

再单独分析initCommand:

initCommand = cli.Command{
Action: utils.MigrateFlags(initGenesis),
Name: "init",
Usage: "Bootstrap and initialize a new genesis block",
ArgsUsage: "<genesisPath>",
Flags: []cli.Flag{
utils.DataDirFlag,
utils.LightModeFlag,
},
Category: "BLOCKCHAIN COMMANDS",
Description: `
The init command initializes a new genesis block and definition for the network.
This is a destructive action and changes the network in which you will be
participating.

其中Name是对应命令的指令,action是调用该指令去完成的动作,usage表示用途,arguUsage显示该命令后面跟的参数个数以及每个参数的意义,

该init方法其实就是去初始化创世块,flags代表的是这个子命令额外可以执行的命令,如改init命令可以携带两个参数,点进去utils.DataDirFlag可以看到:

// General settings
DataDirFlag = DirectoryFlag{
Name: "datadir",
Usage: "Data directory for the databases and keystore",
Value: DirectoryString{node.DefaultDataDir()},
}
  • 可以用 --datadir [dir]来指定数据库的路径,如果没有指定由于该参数有value所以会启用默认的路径,也是home目录下面的.ethereum.
  • /cmd/wnode/main.go通过连接其他节点启动
  • /cmd/geth /cmd/swarm都是定义了很多命令

eth下cmd的rlpdump子包,该包的主要作用从给定文件中转储RLP数据以可读的形式.如果文件名被省略,数据将从stdin中读取

/rlpdump

解码rlp的数据

rlpdump的command的help

Usage: /tmp/___cmd_rlpdump_test [-noascii] [-hex <data>] [filename]
-hex string
  dump given hex data
-noascii
  don't print ASCII strings readably
-single
  print only the first element, discard the rest

Dumps RLP data from the given file in readable form.
If the filename is omitted, data is read from stdin.

example1:

demo command: --hex f872f870845609a1ba64c0b8660480136e573eb81ac4a664f8f76e4887ba927f791a053ec5ff580b1037a8633320ca70f8ec0cdea59167acaa1debc07bc0a0b3a5b41bdf0cb4346c18ddbbd2cf222f54fed795dde94417d2e57f85a580d87238efc75394ca4a92cfe6eb9debcc3583c26fee8580
success_result_demo:
[
[
5609a1ba,
"d",
[],
0480136e573eb81ac4a664f8f76e4887ba927f791a053ec5ff580b1037a8633320ca70f8ec0cdea59167acaa1debc07bc0a0b3a5b41bdf0cb4346c18ddbbd2cf222f54fed795dde94417d2e57f85a580d87238efc75394ca4a92cfe6eb9debcc3583c26fee85,
"",
],
]

example2:

demo command: --noascii --hex CE0183FFFFFFC4C304050583616263
success_result_demo:
[
01,
ffffff,
[
[
04,
05,
05,
],
],
616263,
]

cmd包下的p2psim子包的分析, p2psim is a command line client for the HTTP API

首先我们启动对应的main函数,对应的启动参数是 --help ,来查看该包下所有命令的使用,结果如下:

NAME:
___go_build_main_go__1_ - devp2p simulation command-line client

USAGE:
___go_build_main_go__1_ [global options] command [command options] [arguments...]

VERSION:
0.0.0

COMMANDS:
show show network information
events stream network events
snapshot create a network snapshot to stdout
load load a network snapshot from stdin
node manage simulation nodes
help, h Shows a list of commands or help for one command

GLOBAL OPTIONS:
--api value simulation API URL (default: "http://localhost:8888") [$P2PSIM_API_URL]
--help, -h show help
--version, -v print the version

该子包提供如何下的命令:

p2psim show
p2psim events [--current] [--filter=FILTER]
p2psim snapshot
p2psim load
p2psim node create [--name=NAME] [--services=SERVICES] [--key=KEY]
p2psim node list
p2psim node show <node>
p2psim node start <node>
p2psim node stop <node>
p2psim node connect <node> <peer>
p2psim node disconnect <node> <peer>
p2psim node rpc <node> <method> [<args>] [--subscribe]

要正常使用该子包下的命令,我们需要运行 /p2p/simulations/examples/ping-pong.go 的主函数来启动一个包含运行简单的节点的仿真网络.

正常启动后,你将看到:

INFO [01-23|11:17:10] using sim adapter
INFO [01-23|11:17:10] starting simulation server on 0.0.0.0:8888...

该服务启动后,提供如下的API,其作用等同于上面的命令,命令调用的实现其实就是调用API,访问的路径前缀就是 0.0.0.0:8888 :

GET / Get network information
POST /start Start all nodes in the network
POST /stop Stop all nodes in the network
GET /events Stream network events
GET /snapshot Take a network snapshot
POST /snapshot Load a network snapshot
POST /nodes Create a node
GET /nodes Get all nodes in the network
GET /nodes/:nodeid Get node information
POST /nodes/:nodeid/start Start a node
POST /nodes/:nodeid/stop Stop a node
POST /nodes/:nodeid/conn/:peerid Connect two nodes
DELETE /nodes/:nodeid/conn/:peerid Disconnect two nodes
GET /nodes/:nodeid/rpc Make RPC requests to a node via WebSocket

此处不深究API,仿真网络的服务已经起来了,下面开始p2psim包下命令的使用:

/p2psim

  • show
function:显示当前仿真网络的状态
args:""
demo: show
notice:
success_result_demo:
NODES 0
CONNS 0
  • snapshot
function:导出当前仿真网络的节点信息
args:""
demo: shapshot
notice:
success_result_demo:
{"nodes":[{"node":{"config":{"id":"085416957c3a0afef6aabe6c0d6b27b7cf8a61f28a3a5439010fcc9e49945a1818ea38946dda8c82004b231ab771450ee0d87886163b65eaa48ecfbcb85e871d","private_key":"3480d230f453e7c207bbd3b770bf774dc8a17e599394f9283147a35c3ead561c","name":"node1","services":["ping-pong"]},"up":true}},{"node":{"config":{"id":"cedbaecccfe42d04b742d1be6e924e0654a7eb1aa584d497f98d24951b156ada84bcfc6455ff37ba1fc81179d0a7c3da1ba34945be19d1fe5cd4c8a32a659a7b","private_key":"b7592cdeee6195c4486fcdd8007e1aedfd3a49e6c9f53e0845bf977d4ad043cc","name":"node2","services":["ping-pong"]},"up":false}}],"conns":[{"one":"cedbaecccfe42d04b742d1be6e924e0654a7eb1aa584d497f98d24951b156ada84bcfc6455ff37ba1fc81179d0a7c3da1ba34945be19d1fe5cd4c8a32a659a7b","other":"085416957c3a0afef6aabe6c0d6b27b7cf8a61f28a3a5439010fcc9e49945a1818ea38946dda8c82004b231ab771450ee0d87886163b65eaa48ecfbcb85e871d","up":false}]}
  • node
  • create
function:创建一个节点
args:[--name=NAME] [--services=SERVICES] [--key=KEY]
demo: node create --name node1
notice:
success_result_demo:
Created node1
  • list
function:列出当前仿真网络的节点信息
args:""
demo: node list
notice:
success_result_demo:
NAME PROTOCOLS ID
node1 085416957c3a0afef6aabe6c0d6b27b7cf8a61f28a3a5439010fcc9e49945a1818ea38946dda8c82004b231ab771450ee0d87886163b65eaa48ecfbcb85e871d
node2 cedbaecccfe42d04b742d1be6e924e0654a7eb1aa584d497f98d24951b156ada84bcfc6455ff37ba1fc81179d0a7c3da1ba34945be19d1fe5cd4c8a32a659a7b
  • show
function:查看仿真网络中某个节点的具体信息
args:<node>
demo: node show node1
notice:
success_result_demo:
NAME node1
PROTOCOLS
ID 085416957c3a0afef6aabe6c0d6b27b7cf8a61f28a3a5439010fcc9e49945a1818ea38946dda8c82004b231ab771450ee0d87886163b65eaa48ecfbcb85e871d
ENODE enode://085416957c3a0afef6aabe6c0d6b27b7cf8a61f28a3a5439010fcc9e49945a1818ea38946dda8c82004b231ab771450ee0d87886163b65eaa48ecfbcb85e871d@127.0.0.1:30303
  • start
function:启动一个节点
args:<node>
demo: node start node1
notice:
success_result_demo:
Started node1
  • connect
function:将一个节点连接到另外一个节点
args:<node> <peer>
demo: node connect node2 node1
notice:
success_result_demo:
Connected node2 to node1
  • disconnect
function:节点断开连接
args:<node> <peer>
demo: node disconnect node2 node1
notice:
success_result_demo:
Disconnected node2 from node1
  • stop
function:停止一个节点
args:<node>
demo: node stop node2
notice:
success_result_demo:
Stopped node2
  • rpc
function:调用rpc接口
args:<node> <method> [<args>] [--subscribe]
demo: node rpc node1 admin
notice:
success_result_demo:
 // TODO

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构与算法分析(Java版)(英文原版)

数据结构与算法分析(Java版)(英文原版)

(美)Clifford A.Shaffer / 电子工业出版社 / 2002-5 / 39.00元

《数据结构与算法分析(C++版)(第2版)》采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型的数据结构和排序、检索的各种方法。作者非常注意对每一种数据结构的不同存储方法及有关算法进行分析比较。书中还引入了一些比较高级的数据结构与先进的算法分析技术,并介绍了可计算性理论的一般知识。本版的重要改进在于引入了参数化的模板,从而提......一起来看看 《数据结构与算法分析(Java版)(英文原版)》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具