Public Mempool
最後更新於
這有幫助嗎?
這有幫助嗎?
package main
import (
"context"
"encoding/hex"
"fmt"
// directory of the generated code using the provided relay.proto file
pb "github.com/BlockRazorinc/eth_relay_example/protobuf"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
// 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.NewClient(blzrelayEndPoint, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithPerRPCCredentials(&auth), grpc.WithWriteBufferSize(0), grpc.WithInitialConnWindowSize(128*1024))
if err != nil {
fmt.Println("error: ", err)
return
}
defer conn.Close()
// use the Relay client connection interface
client := pb.NewRelayClient(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.NewTxsRequest{IncludeRawTx: true})
if err != nil {
fmt.Println("failed to subscribe new tx: ", err)
return
}
for {
reply, err := stream.Recv()
if err != nil {
fmt.Println("stream receive error: ", err)
return
}
fmt.Println("receive new tx, tx hash is ", reply.TxHash, " source is ", reply.Source)
if len(reply.RawTx) > 0 {
fmt.Println("raw tx is 0x" + hex.EncodeToString(reply.RawTx))
}
}
}
syntax = "proto3";
package relay.v1;
option go_package = "github.com/BlockRazorinc/eth_relay_example/protobuf";
service Relay {
rpc SendTx(SendTxRequest) returns (SendTxReply);
rpc NewTxs(NewTxsRequest) returns (stream NewTx);
rpc NewBlocks(NewBlocksRequest) returns (stream NewBlock);
}
message SendTxRequest {
bytes raw_tx = 1;
}
message SendTxReply {
string tx_hash = 1;
}
message NewTxsRequest {
bool include_raw_tx = 1;
}
message NewTx {
string tx_hash = 1;
bytes raw_tx = 2;
int64 first_seen_unix_ns = 3;
string source = 4;
}
message NewBlocksRequest {
bool parsed_txs = 1;
}
message NewBlock {
string hash = 1;
BlockHeader header = 2;
repeated BlockTransaction transactions = 3;
repeated Withdrawal withdrawals = 4;
}
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;
string gas_limit = 10;
string gas_used = 11;
string timestamp = 12;
string extra_data = 13;
string mix_hash = 14;
string nonce = 15;
string base_fee_per_gas = 16;
string withdrawals_root = 17;
string blob_gas_used = 18;
string excess_blob_gas = 19;
string parent_beacon_block_root = 20;
}
message BlockTransaction {
bytes raw_tx = 1;
bytes from = 2;
}
message Withdrawal {
string address = 1;
string amount = 2;
string index = 3;
string validator_index = 4;
}
{
"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]