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 |
---|---|---|
| Fields to include in the block stream. |
[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