For the complete documentation index, see llms.txt. This page is also available as Markdown.

GetVoteOnHash - Polygon gRPC

Example code for the GetVoteOnHash grpc method. Сomplete guide on how to use GetVoteOnHash grpc in GetBlock.io Web3 documentation.

Returns whether the local Bor node accepts a milestone proposal — given a proposed hash for a block range [startBlockNumber, endBlockNumber] and a milestone ID. The response is a boolean: true if the local Bor node's computation of the range's hash matches the proposed hash (meaning the local node votes yes on the milestone), false otherwise. This is the primary voting input Heimdall uses to determine whether to include a milestone signature.

Request Parameters

Parameter
Type
Required
Description

startBlockNumber

uint64

Yes

First Bor block in the milestone range (inclusive)

endBlockNumber

uint64

Yes

Last Bor block in the milestone range (inclusive)

hash

string

Yes

The proposed hash to vote on (hex-encoded)

milestoneId

string

Yes

Unique milestone identifier (from Heimdall's milestone module)

Request Example

grpcurl -H 'x-access-token: <ACCESS_TOKEN>' \
        -d '{"startBlockNumber": 90387782, "endBlockNumber": 90387784, "hash": "0x1314b80a2536c8a5853b0ea7dfc1089ee3e51618bda46bd349bb6bfe64f58d10", "milestoneId": "test-milestone-1"}' \
        shared.ap-southeast-1.getblock.io:443 \
        bor.BorApi/GetVoteOnHash
import * as grpc from '@grpc/grpc-js';
import protoLoader from '@grpc/proto-loader';

const GRPC_TARGET = 'shared.ap-southeast-1.getblock.io:443';
const ACCESS_TOKEN = '<ACCESS-TOKEN>';
const PROTO_PATH = './protos/bor/bor.proto';

const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
    keepCase: true,
    longs: String,
    enums: String,
    defaults: true,
    oneofs: true,
    includeDirs: ['./protos'],
});
const proto = grpc.loadPackageDefinition(packageDefinition);
const BorApiClient = proto.bor.BorApi;
const client = new BorApiClient(GRPC_TARGET, grpc.credentials.createSsl());

const metadata = new grpc.Metadata();
metadata.add('x-access-token', ACCESS_TOKEN);

const request = {"startBlockNumber": 90387782, "endBlockNumber": 90387784, "hash": "0x1314b80a2536c8a5853b0ea7dfc1089ee3e51618bda46bd349bb6bfe64f58d10", "milestoneId": "test-milestone-1"};

client.GetVoteOnHash(request, metadata, (err, response) => {
    if (err) {
        console.error('gRPC error:', err.code, err.message);
        return;
    }
    console.log(JSON.stringify(response, null, 2));
});

Response Example

{
    "response": true
}

H160 and H256 encoding. In JSON representations of protobuf messages, common.H160 (20-byte addresses) and common.H256 (32-byte hashes) are shown here as hex strings for readability. The actual JSON wire format from grpcurl or MessageToJson reflects the message structure defined in common/common.proto — typically a nested object encoding. Applications using the typed generated clients receive H160/H256 as strongly-typed message objects, not strings.

Response Fields

Field
Type
Description

response

bool

true = local node's computed hash matches the proposed hash (vote yes); false = mismatch (vote no)

Use Cases

  • Heimdall milestone acknowledgement voting (the primary consumer)

  • Debugging why a milestone failed to reach 2/3 validator acknowledgement

  • Cross-node consistency verification during milestone proposition

Error Handling

gRPC Status (Code)
Message
Cause

UNAUTHENTICATED (16)

missing or invalid x-access-token

Access token missing from x-access-token gRPC metadata or invalid

PERMISSION_DENIED (7)

access denied

Access token doesn't have permission for this method or endpoint

INVALID_ARGUMENT (3)

invalid request

Request message is malformed or fails validation (e.g. invalid block number tag)

INTERNAL (13)

internal error

Server-side error while processing the request

UNAVAILABLE (14)

service unavailable

Bor node is temporarily unavailable (syncing, restart, or overload)

DEADLINE_EXCEEDED (4)

deadline exceeded

Request took longer than the client-configured timeout

RESOURCE_EXHAUSTED (8)

rate limit exceeded

Rate limit exceeded for your plan

INVALID_ARGUMENT (3)

invalid milestone parameters

Block range or hash format is malformed

SDK Integration

Last updated

Was this helpful?