Sending Transactions
Use this endpoint to send a single transaction faster than the p2p network using the BDN.
Method:
blxr_tx
Parameter | Description | Instructions & Notes |
---|---|---|
transaction | Raw transactions bytes without 0x prefix. | |
blockchain_network | Blockchain network name. | Optional. Default: Mainnet Available options are: Mainnet for ETH Mainnet, BSC-Mainnet , and Polygon-Mainnet *Use with Cloud-API when working with BSC. |
validators_only | Used for sending semi-private transactions on all networks. | Available only with Cloud-API
Optional. |
next_validator | Used for sending semi-private transactions on BSC & Polygon. | Available only with Cloud-API
Optional. |
fall_back | The duration of time (in ms) that your transaction will be delayed before propagation by the BDN as a normal transaction | Available only when using next_validator Default: 0 If the value is 0, the transaction will never be propagated by the BDN as a normal transaction. |
node_validation | Transaction is sent to the blockchain node for validation, and the Gateway returns any error message received in response. | Available only with Gateway API Optional Default: False |
- The WebSocket endpoint for sending transactions is
wss://api.blxrbdn.com/ws
. All users sending transactions via a WebSocket connection should use this endpoint. - The HTTPS POST endpoint is
https://api.blxrbdn.com
.
Sending transactions via WebSocket instead of HTTPS can lead to a latency improvement of up to 10ms.
Examples
wscat WS
Node.js WS
Python WS
golang WS
HTTPS POST
# ETH Example
wscat -c wss://api.blxrbdn.com/ws --header "Authorization: <YOUR-AUTHORIZATION-HEADER>"
> {"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params":
{"transaction": "f86b0184...e0b58219"}}
< ......
# BSC Example
wscat -c wss://api.blxrbdn.com/ws --header "Authorization: <YOUR-AUTHORIZATION-HEADER>"
> {"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params":
{"transaction": "f86b0184...e0b58219",
"blockchain_network": "BSC-Mainnet"}}
< ....
const WebSocket = require('ws');
const ws = new WebSocket(
"wss://api.blxrbdn.com/ws",
{
headers: {
"Authorization" : <YOUR-AUTHORIZATION-HEADER>
},
rejectUnauthorized: false,
}
);
function proceed() {
// ETH Example
ws.send(`{"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219"}}`);
// BSC Example
// ws.send(`{"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219", "blockchain_network": "BSC-Mainnet"}}`);
//
// or use a variable for the transaction string:
// rawTx = "f86b0184...e0b58219";
// ws.send(`{"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params": {"transaction": "${rawTx}"}}`);
}
function handle(response) {
console.log(response.toString()); // or process it generally
}
ws.on('open', proceed);
ws.on('message', handle);
# Python 3.7 or higher required due to the use of asyncio.run()
import asyncio, json, ssl
from websocket import create_connection
async def main():
try:
ws = create_connection('wss://api.blxrbdn.com/ws',
header=["Authorization:{}".format("YOUR_AUTHORIZATION_HEADER")],
sslopt={"cert_reqs": ssl.CERT_NONE})
# ETH Example
request = json.dumps({"id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219"}})
# BSC Example
request = json.dumps({"id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219", "blockchain_network": "BSC-Mainnet"}})
ws.send(str(request))
while True:
response = json.loads(ws.recv())
print(response) # or process it generally
except Exception as e:
print(f'Connection failed, Reason: {e}')
if __name__ == '__main__':
asyncio.run(main()
package main
import (
"crypto/tls"
"fmt"
"github.com/gorilla/websocket"
"net/http"
)
func main() {
tlsConfig := &tls.Config{
InsecureSkipVerify: true,
}
dialer := websocket.DefaultDialer
dialer.TLSClientConfig = tlsConfig
wsSubscriber, _, err := dialer.Dial("wss://api.blxrbdn.com/ws", http.Header{"Authorization": []string{<YOUR-AUTHORIZATION-HEADER>}})
if err != nil {
fmt.Println(err)
return
}
// ETH Example
request := `{"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219"}}`
// BSC Example
// request := `{"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219", "blockchain_network": "BSC-Mainnet"}}`
err = wsSubscriber.WriteMessage(websocket.TextMessage, []byte(request))
if err != nil {
fmt.Println(err)
return
}
_, response, err := wsSubscriber.ReadMessage()
if err != nil {
fmt.Println(err)
}
fmt.Println(string(response)) // or process it generally
}
# ETH Example
curl https://api.blxrbdn.com \
-X POST \
-H "Content-Type: application/json" \
-H "Authorization: <YOUR-AUTHORIZATION-HEADER>" \
-d '{"method": "blxr_tx", "id": "1", "params": {"transaction": "f86b0184...e0b58219"}}'
# BSC Example
curl https://api.blxrbdn.com \
-X POST \
-H "Content-Type: application/json" \
-H "Authorization: <YOUR-AUTHORIZATION-HEADER>" \
-d '{"method": "blxr_tx", "id": "1", "params": {"transaction": "f86b0184...e0b58219",
"blockchain_network": "BSC-Mainnet"}}'
- Gateway WebSocket endpoint:
ws://127.0.0.1:28333/ws
- We assume the WebSocket port
28333
.
wscat
Node.js
Python
golang
# ETH Example
wscat -c ws://127.0.0.1:28333/ws --header "Authorization: <YOUR-AUTHORIZATION-HEADER>"
> {"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params":
{"transaction": "f86b0184...e0b58219"}}
< ......
# BSC Example
wscat -c ws://127.0.0.1:28333/ws --header "Authorization: <YOUR-AUTHORIZATION-HEADER>"
> {"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params":
{"transaction": "f86b0184...e0b58219",
"blockchain_network": "BSC-Mainnet"}}
< ......
const WebSocket = require('ws');
const ws = new WebSocket(
"ws://127.0.0.1:28333/ws",
{
headers: {
"Authorization" : <YOUR-AUTHORIZATION-HEADER>
},
rejectUnauthorized: false,
}
);
function proceed() {
// ETH Example
ws.send(`{"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219"}}`);
// BSC Example
// ws.send(`{"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219", "blockchain_network": "BSC-Mainnet"}}`);
//
// or use a variable for the transaction string:
// rawTx = "f86b0184...e0b58219";
// ws.send(`{"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params": {"transaction": "${rawTx}"}}`);
}
function handle(response) {
console.log(response.toString()); // or process it generally
}
ws.on('open', proceed);
ws.on('message', handle);
# Python 3.7 or higher required due to the use of asyncio.run()
import asyncio, json, ssl
from websocket import create_connection
async def main():
try:
ws = create_connection('ws://127.0.0.1:28333/ws',
header=["Authorization:{}".format("YOUR_AUTHORIZATION_HEADER")],
sslopt={"cert_reqs": ssl.CERT_NONE})
# ETH Example
request = json.dumps({"id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219"}})
# BSC Example
request = json.dumps({"id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219", "blockchain_network": "BSC-Mainnet"}})
ws.send(str(request))
while True:
response = json.loads(ws.recv())
print(response) # or process it generally
except Exception as e:
print(f'Connection failed, Reason: {e}')
package main
import (
"crypto/tls"
"fmt"
"github.com/gorilla/websocket"
"net/http"
)
func main() {
tlsConfig := &tls.Config{
InsecureSkipVerify: true,
}
dialer := websocket.DefaultDialer
dialer.TLSClientConfig = tlsConfig
wsSubscriber, _, err := dialer.Dial("ws://127.0.0.1:28333/ws", http.Header{"Authorization": []string{<YOUR-AUTHORIZATION-HEADER>}})
if err != nil {
fmt.Println(err)
return
}
// ETH Example
request := `{"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219"}}`
// BSC Example
// request := `{"jsonrpc": "2.0", "id": 1, "method": "blxr_tx", "params": {"transaction": "f86b0184...e0b58219", "blockchain_network": "BSC-Mainnet"}}`
err = wsSubscriber.WriteMessage(websocket.TextMessage, []byte(request))
if err != nil {
fmt.Println(err)
return
}
_, response, err := wsSubscriber.ReadMessage()
if err != nil {
fmt.Println(err)
}
fmt.Println(string(response)) // or process it generally
}
Result Field | Description |
---|---|
tx_hash | Transaction hash |
Response
{
"jsonrpc": "2.0",
"id": "1",
"result": {
"tx_hash": "ffd59870844e5...bfa54a69"
}
}
Gateway-API
package main
import (
"context"
"fmt"
pb "github.com/bloXroute-Labs/bxgateway-private-go/bxgateway/v2/protobuf"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"time"
)
func main() {
// gRPC server default values
gatewayHostIP := "127.0.0.1"
gatewayGRPCPort := 5001
// Open gRPC connection to Gateway.
conn, _ := grpc.Dial(
fmt.Sprintf("%v:%v", gatewayHostIP, gatewayGRPCPort),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
// Use the Gateway client connection interface.
client := pb.NewGatewayClient(conn)
// create context and defer cancel of context
callContext, cancel := context.WithTimeout(context.Background(), 24*time.Hour)
defer cancel()
// send tx
reply, err := client.BlxrTx(callContext, &pb.BlxrTxRequest{AuthHeader: "<YOUR-AUTHORIZATION-HEADER>", Transaction: "f86b0184...e0b58219"})
if err != nil {
print(err)
return
}
txHash := reply.TxHash
print(txHash) // or process it generally
}
Sending Transactions to the Cloud-API or Gateway-API requires you to register an account on the bloXroute portal. During the registration process, a certificate, private key, and secret hash will be generated for your account. The certificate and key will be used to authenticate your account.
The bloXroute best practice is for users to send transactions to both the Gateway-API and to their blockchain node. You should send transactions in parallel to the Gateway and to your blockchain node as a backup.
Users should not send transactions to the transactions streams WebSocket endpoint
wss://<REGION>.<NETWORK>.blxrbdn.com/ws
(e.g.wss://virginia.eth.blxrbdn.com/ws
) which is for streaming only and doesn't support sending transactions.Last modified 15d ago