newBlocks
Available on Gateway and Cloud API
Note: Gateway must have a node connection to both Consensus Layer and Execution Layer as well as be using the eth-ws-uri
startup argument (see How to connect Go-Gateway to consensus layer).
Name: newBlocks
newBlocks
is a stream of all new blocks as they are propagated in the BDN.
Options
Key
Description
Values
include
Fields to include in the block stream.
hash,header,transactions,future_validator_info,withdrawals
[Default: all] future_validator_info contains validator addresses for future blocks and indicates whether the validators are connected to the BDN (currently only supported in BSC) withdrawals
contains withdrawals for ETH block
Examples (Websocket)
Cloud-API
## ETH Example
wscat -c wss://virginia.eth.blxrbdn.com/ws --header "Authorization: <YOUR-AUTHORIZATION-HEADER>"
> {"jsonrpc": "2.0", "id": 1, "method": "subscribe", "params": ["newBlocks", {"include": ["hash"]}]}
< ......
## BSC Example
wscat -c wss://virginia.bsc.blxrbdn.com/ws --header "Authorization: <YOUR-AUTHORIZATION-HEADER>"
> {"jsonrpc": "2.0", "id": 1, "method": "subscribe", "params": ["newBlocks", {"include": ["hash"], "blockchain_network": "BSC-Mainnet"}]}
< ......
var fs = require('fs');
const WebSocket = require('ws');
// Enterprise users can follow line 5-16
const ws = new WebSocket(
'wss://virginia.eth.blxrbdn.com/ws', // for ETH
// use 'wss://virginia.bsc.blxrbdn.com/ws', //for BSC
{
headers: {
"Authorization" : <YOUR-AUTHORIZATION-HEADER>
},
// Add the following line if you work with IP instead of DNS
// rejectUnauthorized: false,
}
);
// Non Enterprise users should follow line 19-27
// 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": "subscribe", "params": ["newBlocks", {"include": ["hash"]}]}`);
// BSC Example (only available at endpoint wss://<region>.bsc.blxrbdn.com/ws)
// ws.send(`{"jsonrpc": "2.0", "id": 1, "method": "subscribe", "params": ["newBlocks", {"include": ["hash"], "blockchain_network": "BSC-Mainnet"}]}`);
}
function handle(nextNotification) {
console.log(nextNotification.toString()); // or process it generally
}
ws.on('open', proceed);
ws.on('message', handle);
# Python version 3.7 or higher required
import asyncio, json, websockets
async def main():
try:
# Enterprise users and above
uri = "wss://virginia.eth.blxrbdn.com/ws"
# Non Enterprise users
# uri="wss://api.blxrbdn.com/ws"
auth_key = "YOUR_AUTHORIZATION_HEADER"
async with websockets.connect(
uri,
header=["Authorization:{}".format(auth_key)],
# Add the following line if you work with IP instead of DNS
# sslopt={"cert_reqs": ssl.CERT_NONE}
) as websocket:
# ETH Example
subscription_request = json.dumps({
"jsonrpc": "2.0",
"method": "subscribe",
"params": ["newBlocks", {"include": ["hash"]}],
"id": 1,
})
# BSC Example (only available at endpoint wss://<region>.bsc.blxrbdn.com/ws)
# subscription_request = json.dumps({"id": 1, "jsonrpc": "2.0","newBlocks", "method": "subscribe","params": ["newBlocks", {"include": ["hash"]}], "blockchain_network": "BSC-Mainnet"})
await websocket.send(subscription_request)
while True:
response = await websocket.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() {
dialer := websocket.DefaultDialer
// Add the following lines if you work with IP instead of DNS
// tlsConfig := &tls.Config{
// Certificates: []tls.Certificate{cert},
// InsecureSkipVerify: true,
// }
// dialer.TLSClientConfig = tlsConfig
// Enterprise users can follow line 20
wsSubscriber, _, err := dialer.Dial("wss://virginia.eth.blxrbdn.com/ws", http.Header{"Authorization": []string{<YOUR-AUTHORIZATION-HEADER>}})
// Non Enterprise users can follow line 23
// 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
subRequest := `{"id": 1, "method": "subscribe", "params": ["newBlocks", {"include": ["hash"]}]}`
// BSC Example (only available at endpoint wss://<region>.bsc.feed.blxrbdn.com:28333)
// subRequest := `{"id": 1, "method": "subscribe", "params": ["newBlocks", {"include": ["hash"], "blockchain_network": "BSC-Mainnet"}]}`
err = wsSubscriber.WriteMessage(websocket.TextMessage, []byte(subRequest))
if err != nil {
fmt.Println(err)
return
}
for {
_, nextNotification, err := wsSubscriber.ReadMessage()
if err != nil {
fmt.Println(err)
}
fmt.Println(string(nextNotification)) // or process it generally
}
}
Response (Block Event)
<<< {"jsonrpc": "2.0", "id": null, "method": "subscribe",
"params": {"subscription": "213883fe-b3e2-4da2-b9ba-196a82df8628",
"result": {"hash": "0x079b7f1b5a68d4301cf97df2f81c406aa598dd508e2d1908974b95ddd61a4156",
"header": {"parentHash": "0xafef6c6bd1049febe85834aa84735f81f2e81efd55d85a1076aae0adceba16de",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"miner": "0xea674fdde714fd979de3edf0f56aa9716b898ec8",
"stateRoot": "0x13f4a37eb7d0ca8ea309a631e51cca86eaa1b9765a2e6a9eb1614ddcf4ea57e4",
"transactionsRoot": "0x33d0f3c1ce4e3be6346738465cafc727f3500990c881d6fe4821567504badfd5",
"receiptsRoot": "0xad4fe2b36823a0b57f1c640d115eacc8cc1e64c73e49f89a131f206457afbf9f",
"logsBloom": "0x3862455e6027e5863992de359e89bd33e91312891441903f715503c922420904c00e77b054483930423b7a0b5aa4433342b5c096fb3a0883a970d882b9ac02104582cab5eb046e62c9ca17acba8268e25c103107216cec48bc432d78b54927991c5147080a5781c028102040a28ab8d016439e6f8a4804b44c15c3fa85873c204ab8938d450f702ec2444f5a83028586683439ff6de3e57be46c295514527dbcc717f08804c1ac022fcccac7c058d447122e109294a38c3b1a2a676c9814c6913200414e638eb046ed244035875a0c2e446132bd450223952a9bbcd694666884a03db1340b8010dfaae464948a9b4ae524ff8a942258445c73ce176bee981b7d",
"difficulty": "0xc39780fb04af3",
"number": "0xab05c3",
"gasLimit": "0xbdfca5",
"gasUsed": "0xbdb8e3",
"timestamp": "0x5fa62290",
"extraData": "0x65746865726d696e652d6575312d36",
"mixHash": "0x3cd96f6536c1cc745ce9a4f767d65a94b64392bc787e029e7c16339641265b0a",
"nonce": "0x327b58b8b7216cf5",
"blobGasUsed": "0xa0000",
"excessBlobGas": "0x4b40000",
"parentBeaconBlockRoot": "0x14e886e6...908fe06ba3c"
},
"future_validator_info":[{"block_height":22460216,
"wallet_id":"0x295e26495cef6f69dfa69911d9d8e4f3bbadb89b",
"accessible":true},
{"block_height":22460217,
"wallet_id":"0x2d4c407bbe49438ed859fe965b140dcf1aab71a9",
"accessible":false}],
"transactions": [{"from": "0xea674fdde714fd979de3edf0f56aa9716b898ec8",
"gas": "0xc350",
"gasPrice": "0x3b9aca00",
"hash": "0x587a2db59d1af16aa03521a711c3db5b443e5d05cfc72eccadb89c99380f7da0",
"input": "0x",
"nonce": "0x1b8a09b",
"value": "0x54fbe53cd2d1338",
"v": "0x25",
"r": "0x41f3261e25a3e77abd4b0bd4f21cfc2d92ca2d52ff9c663c9a68c6a382115dac",
"s": "0x4350bb6f770bb3363094774fe36478b20013c705f4041fc1bcd0f9fe520c9a23",
"to": "0x190aab185dbf089b1c5cf06a4f13421c14fc18fa"},
...
{"from": "0xc88f7666330b4b511358b7742dc2a3234710e7b1",
"gas": "0x5208",
"gasPrice": "0x7aef40a00",
"hash": "0x92df6598e3a2bc9550898fd7b3322594228e513c0098333bbefd6784a1aa90db",
"input": "0x",
"nonce": "0x6827c",
"value": "0x36e9c396c89e000",
"v": "0x25",
"r": "0x1653aae7a09b85b923b4602f69886c816f470f9b5167d16f2cbb963d00345583",
"s": "0x2c429419c8f23172d4fe4177f796daacf6cfccd9d1545d62957e13fa4af933db",
"to": "0x844359bf8d5fa20f32b0d679527adb93d6255abf"}],
"withdrawals": [
{
"index": "0x1506516",
"validatorIndex": "0x18ea9",
"address": "0x8e609ac80f4324e499a6efd24f221a2caa868224",
"amount": "0x379ea6b",
},
{
"index": "0x1506517",
"validatorIndex": "0x18eaa",
"address": "0x8e609ac80f4324e499a6efd24f221a2caa868224",
"amount": "0x102d9b3",
}
],
"uncles": []}}}
Examples - gRPC
package main
import (
"context"
"fmt"
pb "github.com/bloXroute-Labs/gateway/v2/protobuf"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"time"
)
type blxrCredentials struct {
authorization string
}
func (bc blxrCredentials) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
return map[string]string{
"authorization": bc.authorization,
}, nil
}
func (bc blxrCredentials) RequireTransportSecurity() bool {
return false
}
func main() {
// gRPC server default values
gatewayHostIP := "localhost"
gatewayGRPCPort := 5001
// this will use localhost CA to verify the certificate
creds := credentials.NewClientTLSFromCert(nil, "")
// Open gRPC connection to Gateway.
conn, _ := grpc.Dial(
fmt.Sprintf("%v:%v", gatewayHostIP, gatewayGRPCPort),
grpc.WithTransportCredentials(creds),
grpc.WithPerRPCCredentials(blxrCredentials{authorization: "<YOUR-AUTHORIZATION-HEADER>"}),
)
// 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()
// Create a subscription using the stream-specific method and request.
stream, _ := client.NewBlocks(callContext, &pb.BlocksRequest{})
for {
subscriptionNotification, err := stream.Recv()
if err == nil {
fmt.Println(subscriptionNotification) // or process it generally
}
}
}
Response (Block Event)
{
"future_validator_info": [],
"transaction": [
{
"from": "",
"local_region": false,
"time": "0",
"raw_tx": "+I6DAlTHhQHc1lHAglnYlBXsRrWI...3SFs7n3n3UUCAVX1weV6HLAcAKuA"
},
....
{
"from": "",
"local_region": false,
"time": "0",
"raw_tx": "AviPgkJogwkGOoQ7mso...3Z99ZUu1/Jc0B9ytQ="
}
],
"withdrawals": [
{
"address": "0x9baA3244565d51D9C7897c0EB6679eD4890e536E",
"amount": "0x60077b",
"index": "0x104ed81",
"validator_index": "0x1ee90"
},
....
{
"address": "0x9baA3244565d51D9C7897c0EB6679eD4890e536E",
"amount": "0x604095",
"index": "0x104ed90",
"validator_index": "0x1ee9f"
}
],
"hash": "0xd9cfa479b98ae15...a7e629fe3435e6169abca",
"subscriptionID": "c5451b97-c82c-47e2-a70e-74e3256584e6",
"header": {
"parent_hash": "0xf3fd6b6011eed8d...f482e9345a3fe5dfe9e26c1db",
"sha3_uncles": "0x1dcc4de8dec75d7aa...48a7413f0a142fd40d49347",
"miner": "0x0c10000000756...7f022929a97bda45",
"state_root": "0xf074e94fc3d700a8f....9ea3280595bd5acd5d97d0",
"transactions_root": "0xedade2fe2198c....ccf38eeaacb2ccaa92e60",
"receipts_root": "0x2ff34bb52237c31b8...78e0ac369028cb63f",
"logs_bloom": "0x4c0008000804...00402004048",
"difficulty": "0x0",
"number": "0x107336",
"gas_limit": "0x1c9c380",
"gas_used": "0x11bc8e3",
"timestamp": "0x65e73b50",
"extra_data": "0xd883010d0e846....2312e37856c696e7578",
"mix_hash": "0xf6743b00bce48fc1617acf...84d781807a3866ab",
"nonce": "0x0000000000000000",
"base_fee_per_gas": "59",
"withdrawals_root": "0x5e9855e2716a2b4793d4e...9faa41d9c876fcff1b",
"blob_gas_used": "0x80000",
"excess_blob_gas": "0x4b20000",
"parent_beacon_root": "0xe83661292da71373c38...3a91a5e27ac4a59ea3c"
}
}
Last updated