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

首先我们启动对应的main函数,对应的启动参数是--help,来查看该包下所有命令的使用,结果如下:
  1. NAME:
  2. ___go_build_main_go__1_ - devp2p simulation command-line client
  3. USAGE:
  4. ___go_build_main_go__1_ [global options] command [command options] [arguments...]
  5. VERSION:
  6. 0.0.0
  7. COMMANDS:
  8. show show network information
  9. events stream network events
  10. snapshot create a network snapshot to stdout
  11. load load a network snapshot from stdin
  12. node manage simulation nodes
  13. help, h Shows a list of commands or help for one command
  14. GLOBAL OPTIONS:
  15. --api value simulation API URL (default: "http://localhost:8888") [$P2PSIM_API_URL]
  16. --help, -h show help
  17. --version, -v print the version
该子包提供如何下的命令:
  1. p2psim show
  2. p2psim events [--current] [--filter=FILTER]
  3. p2psim snapshot
  4. p2psim load
  5. p2psim node create [--name=NAME] [--services=SERVICES] [--key=KEY]
  6. p2psim node list
  7. p2psim node show <node>
  8. p2psim node start <node>
  9. p2psim node stop <node>
  10. p2psim node connect <node> <peer>
  11. p2psim node disconnect <node> <peer>
  12. p2psim node rpc <node> <method> [<args>] [--subscribe]
要正常使用该子包下的命令,我们需要运行/p2p/simulations/examples/ping-pong.go的主函数来启动一个包含运行简单的节点的仿真网络.

正常启动后,你将看到:

  1. INFO [01-23|11:17:10] using sim adapter
  2. INFO [01-23|11:17:10] starting simulation server on 0.0.0.0:8888...
该服务启动后,提供如下的API,其作用等同于上面的命令,命令调用的实现其实就是调用API,访问的路径前缀就是0.0.0.0:8888:
  1. GET / Get network information
  2. POST /start Start all nodes in the network
  3. POST /stop Stop all nodes in the network
  4. GET /events Stream network events
  5. GET /snapshot Take a network snapshot
  6. POST /snapshot Load a network snapshot
  7. POST /nodes Create a node
  8. GET /nodes Get all nodes in the network
  9. GET /nodes/:nodeid Get node information
  10. POST /nodes/:nodeid/start Start a node
  11. POST /nodes/:nodeid/stop Stop a node
  12. POST /nodes/:nodeid/conn/:peerid Connect two nodes
  13. DELETE /nodes/:nodeid/conn/:peerid Disconnect two nodes
  14. GET /nodes/:nodeid/rpc Make RPC requests to a node via WebSocket
此处不深究API,仿真网络的服务已经起来了,下面开始p2psim包下命令的使用:

/p2psim

  • show

    1. function:显示当前仿真网络的状态
    2. args:""
    3. demo: show
    4. notice:
    5. success_result_demo:
    6. NODES 0
    7. 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}]}

  1. * node
  2. > * create
  1. function:创建一个节点
  2. args:[--name=NAME] [--services=SERVICES] [--key=KEY]
  3. demo: node create --name node1
  4. notice:
  5. success_result_demo:
  6. Created node1
  1. > * list
  1. function:列出当前仿真网络的节点信息
  2. args:""
  3. demo: node list
  4. notice:
  5. success_result_demo:
  6. NAME PROTOCOLS ID
  7. node1 085416957c3a0afef6aabe6c0d6b27b7cf8a61f28a3a5439010fcc9e49945a1818ea38946dda8c82004b231ab771450ee0d87886163b65eaa48ecfbcb85e871d
  8. node2 cedbaecccfe42d04b742d1be6e924e0654a7eb1aa584d497f98d24951b156ada84bcfc6455ff37ba1fc81179d0a7c3da1ba34945be19d1fe5cd4c8a32a659a7b
  1. > * show
  1. function:查看仿真网络中某个节点的具体信息
  2. args:<node>
  3. demo: node show node1
  4. notice:
  5. success_result_demo:
  6. NAME node1
  7. PROTOCOLS
  8. ID 085416957c3a0afef6aabe6c0d6b27b7cf8a61f28a3a5439010fcc9e49945a1818ea38946dda8c82004b231ab771450ee0d87886163b65eaa48ecfbcb85e871d
  9. ENODE enode://085416957c3a0afef6aabe6c0d6b27b7cf8a61f28a3a5439010fcc9e49945a1818ea38946dda8c82004b231ab771450ee0d87886163b65eaa48ecfbcb85e871d@127.0.0.1:30303
  1. > * start
  1. function:启动一个节点
  2. args:<node>
  3. demo: node start node1
  4. notice:
  5. success_result_demo:
  6. Started node1
  1. > * connect
  1. function:将一个节点连接到另外一个节点
  2. args:<node> <peer>
  3. demo: node connect node2 node1
  4. notice:
  5. success_result_demo:
  6. Connected node2 to node1
  1. > * disconnect
  1. function:节点断开连接
  2. args:<node> <peer>
  3. demo: node disconnect node2 node1
  4. notice:
  5. success_result_demo:
  6. Disconnected node2 from node1
  7. ```
  • stop
  1. ```
  2. function:停止一个节点
  3. args:<node>
  4. demo: node stop node2
  5. notice:
  6. success_result_demo:
  7. Stopped node2
  8. ```
  • rpc
  1. ```
  2. function:调用rpc接口
  3. args:<node> <method> [<args>] [--subscribe]
  4. demo: node rpc node1 admin
  5. notice:
  6. success_result_demo:
  7.  // TODO
  8. ```
参考资料