跳轉至

Send RawTx

接口說明

{% hint style="info" %} 該接口不具備MEV保護能力,通過該接口發送的交易會在公開mempool廣播。 {% endhint %}

本接口用於在BSC高性能网络上廣播单笔rawtx,方法名SendTx ,支持HTTP和gRPC協議。其中基於HTTP協議發送交易面向Tier 1等級或以上用戶開放,請在訂閱後和我們聯繫

端點

地區可用區(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
TPS 10 Txs / 5s 10 Txs / 5s 50 Txs / 5s 100 Txs / 5s 200 Txs / 5s
每日交易上限 10 Txs 10 Txs 不限 不限 不限

請求參數

參數必選格式示例描述
TransactionString"0xf8……8219"經過簽名的rawtx

請求示例

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

package main

import (
    "context"
    "encoding/hex"
    "fmt"
    "math/big"

    // directory of the generated code using the provided relay.proto file
    pb "github.com/BlockRazorinc/relay_example/protobuf"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/ethereum/go-ethereum/crypto"
    "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
    ctx := context.Background()

    // replace with your address
    from_private_address := "42b565……44d05c"
    to_public_address := "0x4321……3f1c66"

    // replace with your transaction data
    nonce := uint64(1)
    toAddress := common.HexToAddress(to_public_address)
    var data []byte
    gasPrice := big.NewInt(1e9)
    gasLimit := uint64(22000)
    value := big.NewInt(0)
    chainid := types.NewEIP155Signer(big.NewInt(56))

    // create new transaction
    tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, data)

    privateKey, err := crypto.HexToECDSA(from_private_address)
    if err != nil {
        fmt.Println("fail to casting private key to ECDSA")
        return
    }

    // sign transaction by private key
    signedTx, err := types.SignTx(tx, chainid, privateKey)
    if err != nil {
        fmt.Println("fail to sign transaction")
        return
    }

    // use rlp to encode your transaction
    body, _ := rlp.EncodeToBytes([]types.Transaction{*signedTx})

    // encode []byte to string
    encode_tx := hex.EncodeToString(body)

    // send raw tx by BlockRazor
    res, err := client.SendTx(ctx, &pb.SendTxRequest{Transaction: encode_tx})

    if err != nil {
        fmt.Println("failed to send raw tx: ", err)
        return
    } else {
        fmt.Println("raw tx sent by BlockRazor, tx hash is ", res.TxHash)
    }

}

{% endtab %}

{% tab title="HTTP" %}

curl <Endpoint_URL> \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x02f8……869514"],"id":1}'

{% endtab %} {% endtabs %}

返回示例

正常

{
 "tx_hash":"0x2944……b2188f"
}

异常

rpc error: code = Unknown desc = invalid transaction format

Proto

relay.proto文件代碼如下:

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;
}

代码示例

https://github.com/BlockRazorinc/relay_example