github.com/turingchain2020/turingchain@v1.1.21/types/proto/p2p.proto (about)

     1  syntax = "proto3";
     2  
     3  import "transaction.proto";
     4  import "common.proto";
     5  import "blockchain.proto";
     6  
     7  package types;
     8  option go_package = "github.com/turingchain2020/turingchain/types";
     9  
    10  service p2pgservice {
    11      //广播交易
    12      rpc BroadCastTx(P2PTx) returns (Reply) {}
    13      //广播区块
    14      rpc BroadCastBlock(P2PBlock) returns (Reply) {}
    15  
    16      // PING
    17      rpc Ping(P2PPing) returns (P2PPong) {}
    18  
    19      //获取地址
    20      rpc GetAddr(P2PGetAddr) returns (P2PAddr) {}
    21  
    22      rpc GetAddrList(P2PGetAddr) returns (P2PAddrList) {}
    23  
    24      //版本
    25      rpc Version(P2PVersion) returns (P2PVerAck) {}
    26      //获取p2p协议的版本号
    27      rpc Version2(P2PVersion) returns (P2PVersion) {}
    28      //获取软件的版本号
    29      rpc SoftVersion(P2PPing) returns (Reply) {}
    30      //获取区块,最高200
    31      rpc GetBlocks(P2PGetBlocks) returns (P2PInv) {}
    32  
    33      //获取mempool
    34      rpc GetMemPool(P2PGetMempool) returns (P2PInv) {}
    35  
    36      //获取数据
    37      rpc GetData(P2PGetData) returns (stream InvDatas) {}
    38  
    39      //获取头部
    40      rpc GetHeaders(P2PGetHeaders) returns (P2PHeaders) {}
    41  
    42      //获取 peerinfo
    43      rpc GetPeerInfo(P2PGetPeerInfo) returns (P2PPeerInfo) {}
    44  
    45      // grpc server 读客户端发送来的数据
    46      rpc ServerStreamRead(stream BroadCastData) returns (ReqNil) {}
    47  
    48      // grpc server 发送数据给客户端
    49      rpc ServerStreamSend(P2PPing) returns (stream BroadCastData) {}
    50  
    51      // grpc 收集inpeers
    52      rpc CollectInPeers(P2PPing) returns (PeerList) {}
    53      rpc CollectInPeers2(P2PPing) returns (PeersReply) {}
    54  }
    55  
    56  /**
    57   * 请求获取远程节点的节点信息
    58   */
    59  message P2PGetPeerInfo {
    60      /// p2p版本
    61      int32 version = 1;
    62  }
    63  
    64  /**
    65   * 节点信息
    66   */
    67  message P2PPeerInfo {
    68      ///节点的IP地址
    69      string addr = 1;
    70      ///节点的外网端口
    71      int32 port = 2;
    72      ///节点的名称
    73      string name = 3;
    74      /// mempool 的大小
    75      int32 mempoolSize = 4;
    76      ///节点当前高度头部数据
    77      Header header         = 5;
    78      string version        = 6;
    79      string localDBVersion = 7;
    80      string storeDBVersion = 8;
    81  }
    82  
    83  /**
    84   * p2p节点间发送版本数据结构
    85   */
    86  message P2PVersion {
    87      ///当前版本
    88      int32 version = 1;
    89      ///服务类型
    90      int64 service = 2;
    91      ///时间戳
    92      int64 timestamp = 3;
    93      ///数据包的目的地址
    94      string addrRecv = 4;
    95      ///数据发送的源地址
    96      string addrFrom = 5;
    97      ///随机数
    98      int64 nonce = 6;
    99      ///用户代理
   100      string userAgent = 7;
   101      ///当前节点的高度
   102      int64 startHeight = 8;
   103  }
   104  
   105  /**
   106   * P2P 版本返回
   107   */
   108  message P2PVerAck {
   109      int32 version = 1;
   110      int64 service = 2;
   111      int64 nonce   = 3;
   112  }
   113  
   114  /**
   115   * P2P 心跳包
   116   */
   117  message P2PPing {
   118      ///随机数
   119      int64 nonce = 1;
   120      ///节点的外网地址
   121      string addr = 2;
   122      ///节点的外网端口
   123      int32 port = 3;
   124      //签名
   125      Signature sign = 4;
   126  }
   127  
   128  /**
   129   * 心跳返回包
   130   */
   131  message P2PPong {
   132      int64 nonce = 1;
   133  }
   134  
   135  /**
   136   * 获取对方节点所连接的其他节点地址的请求包
   137   */
   138  message P2PGetAddr {
   139      int64 nonce = 1;
   140  }
   141  
   142  /**
   143   * 返回请求地址列表的社保
   144   */
   145  message P2PAddr {
   146      int64 nonce = 1;
   147      ///对方节点返回的其他节点信息
   148      repeated string addrlist = 2;
   149  }
   150  /**
   151   * 返回包括地址以及响应地址高度的列表信息
   152   **/
   153  
   154  message P2PAddrList {
   155      int64    nonce                = 1;
   156      repeated P2PPeerInfo peerinfo = 2;
   157  }
   158  
   159  /**
   160   * 节点外网信息
   161   */
   162  message P2PExternalInfo {
   163      ///节点的外网地址
   164      string addr = 1;
   165      //节点是否在外网
   166      bool isoutside = 2;
   167  }
   168  
   169  /**
   170   * 获取区间区块
   171   */
   172  message P2PGetBlocks {
   173      int32 version     = 1;
   174      int64 startHeight = 2;
   175      int64 endHeight   = 3;
   176  }
   177  
   178  /**
   179   * 获取mempool
   180   */
   181  message P2PGetMempool {
   182      int32 version = 1;
   183  }
   184  
   185  message P2PInv {
   186      repeated Inventory invs = 1;
   187  }
   188  
   189  // ty=MSG_TX MSG_BLOCK
   190  message Inventory {
   191      //类型,数据类型,MSG_TX MSG_BLOCK
   192      int32 ty = 1;
   193      ///哈希
   194      bytes hash = 2;
   195      //高度
   196      int64 height = 3;
   197  }
   198  
   199  /**
   200   * 通过invs 下载数据
   201   */
   202  message P2PGetData {
   203      /// p2p版本
   204      int32 version = 1;
   205      /// invs 数组
   206      repeated Inventory invs = 2;
   207  }
   208  
   209  //
   210  message P2PRoute {
   211      int32 TTL = 1;
   212  }
   213  
   214  /**
   215   * p2p 发送交易协议
   216   */
   217  message P2PTx {
   218      Transaction tx    = 1;
   219      P2PRoute    route = 2;
   220  }
   221  
   222  /**
   223   * p2p 发送区块协议
   224   */
   225  message P2PBlock {
   226      Block block = 1;
   227  }
   228  
   229  /**
   230   * p2p 轻量级区块, 广播交易短哈希列表
   231   */
   232  message LightBlock {
   233  
   234      int64       size          = 1;
   235      Header      header        = 2;
   236      Transaction minerTx       = 3;
   237      repeated string sTxHashes = 4;
   238  }
   239  
   240  // 轻量级交易广播
   241  message LightTx {
   242      bytes    txHash = 1;
   243      P2PRoute route  = 2;
   244  }
   245  
   246  // 请求完整交易数据
   247  message P2PTxReq {
   248      bytes txHash = 1;
   249  }
   250  
   251  // 请求区块内交易数据
   252  message P2PBlockTxReq {
   253      string   blockHash       = 1;
   254      repeated int32 txIndices = 2;
   255  }
   256  
   257  // 区块交易数据返回
   258  message P2PBlockTxReply {
   259      string   blockHash       = 1;
   260      repeated int32 txIndices = 2;
   261      repeated Transaction txs = 3;
   262  }
   263  
   264  /* 节点收到区块或交易hash,
   265   * 当在本地不存在时,需要请求重发完整交易或区块
   266   * 采用统一结构减少消息类型
   267   */
   268  message P2PQueryData {
   269      oneof value {
   270          P2PTxReq      txReq      = 1;
   271          P2PBlockTxReq blockTxReq = 2;
   272      }
   273  }
   274  /**
   275   * p2p 协议和软件版本
   276   */
   277  message Versions {
   278      int32  p2pversion  = 1;
   279      string softversion = 2;
   280      string peername    = 3;
   281  }
   282  
   283  /**
   284   * p2p 广播数据协议
   285   */
   286  message BroadCastData {
   287      oneof value {
   288          P2PTx           tx       = 1;
   289          P2PBlock        block    = 2;
   290          P2PPing         ping     = 3;
   291          Versions        version  = 4;
   292          LightTx         ltTx     = 5;
   293          LightBlock      ltBlock  = 6;
   294          P2PQueryData    query    = 7;
   295          P2PBlockTxReply blockRep = 8;
   296      }
   297  }
   298  
   299  /**
   300   * p2p 获取区块区间头部信息协议
   301   */
   302  message P2PGetHeaders {
   303      int32 version     = 1;
   304      int64 startHeight = 2;
   305      int64 endHeight   = 3;
   306  }
   307  
   308  /**
   309   * p2p 区块头传输协议
   310   */
   311  message P2PHeaders {
   312      repeated Header headers = 1;
   313  }
   314  
   315  /**
   316   * inv 请求协议
   317   */
   318  message InvData {
   319      oneof value {
   320          Transaction tx    = 1;
   321          Block       block = 2;
   322      }
   323      int32 ty = 3;
   324  }
   325  
   326  /**
   327   * inv 返回数据
   328   */
   329  message InvDatas {
   330      repeated InvData items = 1;
   331  }
   332  
   333  /**
   334   * peer 信息
   335   */
   336  message Peer {
   337      string addr           = 1;
   338      int32  port           = 2;
   339      string name           = 3;
   340      bool   self           = 4;
   341      int32  mempoolSize    = 5;
   342      Header header         = 6;
   343      string version        = 7;
   344      string localDBVersion = 8;
   345      string storeDBVersion = 9;
   346  }
   347  
   348  /**
   349   * peer 列表
   350   */
   351  message PeerList {
   352      repeated Peer peers = 1;
   353  }
   354  
   355  /**
   356   * p2p get peer req
   357   */
   358  message P2PGetPeerReq {
   359      string p2pType = 1;
   360  }
   361  
   362  /**
   363   * p2p get net info req
   364   */
   365  message P2PGetNetInfoReq {
   366      string p2pType = 1;
   367  }
   368  
   369  /**
   370   *当前节点的网络信息
   371   */
   372  message NodeNetInfo {
   373      string externaladdr = 1;
   374      string localaddr    = 2;
   375      bool   service      = 3;
   376      int32  outbounds    = 4;
   377      int32  inbounds     = 5;
   378      int32  routingtable = 6;
   379      int32  peerstore    = 7;
   380      string ratein       = 8;
   381      string rateout      = 9;
   382      string ratetotal    = 10;
   383  }
   384  
   385  /**
   386   * p2p节点扫描返回的结构数据
   387   */
   388  
   389  message PeersReply {
   390      repeated PeersInfo peers = 1;
   391  }
   392  
   393  message PeersInfo {
   394      string name        = 1;
   395      string ip          = 2;
   396      int32  port        = 3;
   397      string softversion = 4;
   398      int32  p2pversion  = 5;
   399  }