跳轉至

Public Mempool

接口說明

用於訂閱BSC高性能網絡中的交易數據流,方法名NewTxs

端點

地區可用區(AWS)Relay地址
法蘭克福euc1-az235.157.64.49:50051
東京apne1-az454.249.93.63:50051
愛爾蘭euw1-az13.248.65.151:50051
弗吉尼亞use1-az452.205.173.134:50051

流控說明

Tier 4 Tier 3 Tier 2 Tier 1 Tier 0
並行數據流 - 1 5 10 30

請求參數

參數必選格式示例備注
NodeValidationbooleanfalse該字段目前僅支持設置為false,relay會以更低延遲推送全部新交易(未經校驗)

請求示例

https://github.com/BlockRazorinc/relay_example

{% tabs %} {% tab title="Go" %}

package main

import (
    "context"
    "fmt"

    // directory of the generated code using the provided relay.proto file
    pb "github.com/BlockRazorinc/relay_example/protobuf"
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/ethereum/go-ethereum/rlp"
    "google.golang.org/grpc"
)

// auth will be used to verify the credential
type Authentication struct {
    apiKey string
}

func (a *Authentication) GetRequestMetadata(context.Context, ...string) (map[string]string, error) {
    return map[string]string{"apiKey": a.apiKey}, nil
}

func (a *Authentication) RequireTransportSecurity() bool {
    return false
}

func main() {

    // BlockRazor relay endpoint address
    blzrelayEndPoint := "ip:port"

    // auth will be used to verify the credential
    auth := Authentication{
        "your auth token",
    }

    // open gRPC connection to BlockRazor relay
    var err error
    conn, err := grpc.Dial(blzrelayEndPoint, grpc.WithInsecure(), grpc.WithPerRPCCredentials(&auth), grpc.WithWriteBufferSize(0), grpc.WithInitialConnWindowSize(128*1024))
    if err != nil {
        fmt.Println("error: ", err)
        return
    }

    // use the Gateway client connection interface
    client := pb.NewGatewayClient(conn)

    // create context and defer cancel of context
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    // create a subscription using the stream-specific method and request
    stream, err := client.NewTxs(ctx, &pb.TxsRequest{NodeValidation: false})
    if err != nil {
        fmt.Println("failed to subscribe new tx: ", err)
        return
    }

    for {
        reply, err := stream.Recv()
        if err != nil {
            fmt.Println("stream recieve error: ", err)
        }
        tx := &types.Transaction{}

        err = rlp.DecodeBytes(reply.Tx.RawTx, tx)
        if err != nil {
            continue
        }

        fmt.Println("recieve new tx, tx hash is ", tx.Hash().String())

    }
}

{% endtab %} {% endtabs %}

Proto

The code of relay.proto is as follows:

syntax = "proto3";

package blockchain;

option go_package = "/Users/code/relay/grpcServer"; 
service Gateway {
  rpc SendTx (SendTxRequest) returns (SendTxReply) {}
  rpc SendTxs (SendTxsRequest) returns (SendTxsReply) {}
  rpc NewTxs (TxsRequest) returns (stream TxsReply){}
  rpc NewBlocks (BlocksRequest) returns (stream BlocksReply){}
}

message TxsRequest{
  bool node_validation = 1;
}

message Tx{
  bytes from = 1;
  int64 timestamp = 2;
  bytes raw_tx = 3;
}

message TxsReply{
   Tx tx = 1;
}

message BlocksRequest{
  bool node_validation = 1;
}

message BlockHeader{
  string parent_hash = 1;
  string sha3_uncles = 2;
  string miner = 3;
  string state_root = 4;
  string transactions_root = 5;
  string receipts_root = 6;
  string logs_bloom = 7;
  string difficulty = 8;
  string number = 9;
  uint64 gas_limit = 10;
  uint64 gas_used = 11;
  uint64 timestamp = 12;
  bytes extra_data = 13;
  string mix_hash = 14;
  uint64 nonce = 15;
  uint64 base_fee_per_gas = 16;
  string withdrawals_root = 17;
  uint64 blob_gas_used = 18;
  uint64 excess_blob_gas = 19;
  string parent_beacon_block_root = 20;
}

message NextValidator{
  string block_height = 1;
  string coinbase = 2;
}

message BlocksReply{
  string hash = 1;
  BlockHeader header = 2;
  repeated NextValidator nextValidator = 3;
  repeated Tx txs = 4;
}

message Transaction {
  string content = 1;
}

message Transactions {
  repeated Transaction transactions = 1;
}

message SendTxRequest {
  string transaction = 1;
}

message SendTxsRequest {
  string transactions = 1;
}

message SendTxReply {
  string tx_hash = 1;
}

message SendTxsReply {
  repeated string tx_hashs = 1;
}

返回示例

正常

{
  "tx":[
     {
     "raw_tx":"+QH0gjOthDuaygCDBrbAlKoP7P6dEOH8IzwtDAw9whDVeHKRhwFrzEHpAAC5AYTVQ9H9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmsrt4HBPm7jWohanh7XmbX9S/gRLrth87fXF3H2gC0FAAAAAAAAAAAAAAAAbsa1rd5IJ6lr43ixr1+LWmT/OhgAAAAAAAAAAAAAAABV05gyb5kFn/d1SFJGmZAnsxl5VQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVkLNFR0SQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZ7qkBM09jlPtkQprbOV2bITVAfdbvzTltwBYjUJu6OIzF3aAAAAAAAAAAAAAAAAHqXLqcmW4qO1ZEAZXn2nYI/dKV1AAAAAAAAAAAAAAAAVdOYMm+ZBZ/3dUhSRpmQJ7MZeVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASvCnY7scAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABme6pAgZOgy2LsKlIqPeeM7d520T3eAwIVk9O+vY4wT+zifYp0GGOgTY7Z5J3zs/YCj1HvVXOZF9Q2rj5x421GBG9CrKmxVGo="
     }
   ]
}

异常

rpc error: code = Unknown desc = data streams have exceeded its max limit [5]