Hedera
The following JSON-RPC methods offer native integration into Hedera utilizing the Hedera APIs and the Hedera SDKs.
Hedera documentation can be found at docs.hedera.com.
The following resources provide specific information referenced in the methods below.
- The Hedera network structure is summarized by Mainnet Nodes
- The full list of Hedera functionality is described by the protobuf definitions: Hedera Functionality
- Further details about these methods can be found in the accompanying Hedera Improvement Proposal: HIP-820
- The
signerAccountId
utilized in the methods below is specified by HIP-30 - A Hedera Transaction ID is composed of the account id that pays for a transaction and the valid start timestamp in nanoseconds: Hedera Transaction ID
- There are pre-processing validation response codes returned by the network: ResponseCodeEnum
Hedera has a separate open-source project implementing parts of the Ethereum JSON-RPC standard which is not covered in this documentation.
Methods
hedera_signAndExecuteTransaction
hedera_signTransaction
hedera_executeTransaction
hedera_signAndExecuteQuery
hedera_signMessage
hedera_getNodeAddresses
hedera_signAndExecuteTransaction
The hedera_signAndExecuteTransaction
method is a generic method for executing a transaction on the Hedera network. A dApp can begin by constructing a transaction with one of the Hedera SDKs or by constructing the raw protobuf messages and may select one or more consensus nodes that are authorized to execute the transaction.
The dApp then constructs a list of valid transaction bytes that differ only in the node account id and serializes the list, for example by using the toBytes()
method of an SDK. Finally, the dApp base64 encodes the resulting bytes. This final base64 encoded string of bytes is sent as a method param titled transactionList
to the wallet.
Wallets and SDKs must take special care to deserialize the list of transactions and validate that each transaction in the list differs only in the node authorized to receive the transaction and does NOT differ in intent before submitting to an end user for approval and ultimately signing.
Parameters
Object
- signAndExecuteTransaction parameters 1.1.signerAccountId
:String
- Hedera account id in the format<network>:<shard>.<realm>.<num><-optional-checksum>
1.2.transactionList
:String
- Base64 encoded string of TransactionList bytes
Returns
Object
- Result of transaction submission to Hedera network 1.1.nodeId
:String
- The Hedera node the transaction was submitted to 1.2.transactionHash
:String
- The hash of the transaction 1.3.transactionId
:String
- Transaction ID, which includes the payer account id and the valid start timestamp
Error
In certain conditions, the Hedera network will return a response that signifies a pre-processing validation error, for example, when the transaction has expired. In these cases, wallets will return an error with the following format:
Object
- Result of transaction submission to Hedera network 1.1.code
: 9000 - The reserved WalletConnect error code for unknown errors or errors not related to the WalletConnect protocol 1.2.message
:String
- A human readable string describing the nature of the failure 1.3.data
:Number
- An integer representing the ResponseCodeEnum value returned from the Hedera Node, which indicates the reason for the failure
Example
Request
{
"id": 1,
"jsonrpc": "2.0",
"method": "hedera_signAndExecuteTransaction",
"params": {
"signerAccountId": "hedera:testnet:0.0.12345",
"transactionList": "Co8BKowBCocBChoKDAjchKWmBhDW..."
}
}
Result
{
"id": 1,
"jsonrpc": "2.0",
"result": {
"nodeId": "0.0.3",
"transactionHash": "252b8fd...",
"transactionId": "0.0.12345678@1689281510.675369303"
}
}
Error
{
"id": 1,
"jsonrpc": "2.0",
"error": {
"code": 9000,
"message": "The transaction failed with precheck code...",
"data": 6
}
}
hedera_signTransaction
The hedera_signTransaction
signs a TransactionBody
and returns a SignatureMap
to the caller.
Parameters
Object
- signTransaction parameters 1.1signerAccountId
:String
- Hedera account id in the format<network>:<shard>.<realm>.<num><-optional-checksum>
1.2transactionBody
:String
- Base64 encoded string representation of TransactionBody
Returns
Object
- SignatureMap of related signed TransactionBody 1.1signatureMap
:String
- Base64 encoded string of SignatureMap
Example
Request
{
"id": 1,
"jsonrpc": "2.0",
"method": "hedera_signTransaction",
"params": {
"signerAccountId": "hedera:testnet:0.0.12345",
"transactionBody": "Co8BKowBCocBChoKDAjchKWmBhDW..."
}
}
Result
{
"id": 1,
"jsonrpc": "2.0",
"result": {
"signatureMap": "VGhpcyBpcyBqdXN0IHNvbWUgc3R1..."
}
}
hedera_executeTransaction
When a dApp only requires the services of the controller to act as a relay to the Hedera network for submitting an already signed transaction, it can use the hedera_executeTransaction
method.
Parameters
Object
- executeTransaction parameters 1.1transactionList
:String
Base64 encoded TransactionList
Returns
Object
- Result of transaction submission to the Hedera network 1.1.nodeId
:String
- The Hedera node the transaction was submitted to 1.1.transactionHash
:String
- The hash of the transaction 1.1.transactionId
:String
- Transaction ID, which includes the payer account id and the valid start timestamp
Error
In certain conditions, the Hedera network with return a response that signifies a pre-processing validation error, for example, when the transaction has expired. In these cases, wallets will return an error with the following format:
Object
- Result of transaction submission to the Hedera network 1.1.code
: 9000 - The reserved WalletConnect error code for unknown errors or errors not related to the WalletConnect protocol 1.1.message
:String
- A human readable string describing the nature of the failure 1.1.data
:Number
- An integer representing the ResponseCodeEnum value returned from the Hedera Node, which indicates the reason for the failure
Example
Request
{
"id": 1,
"jsonrpc": "2.0",
"method": "hedera_executeTransaction",
"params": {
"transactionList": "Co8BKowBCocBChoKDAjchKWmBhDW..."
}
}
Result
{
"id": 1,
"jsonrpc": "2.0",
"result": {
"nodeId": "0.0.3",
"transactionHash": "252b8fd...",
"transactionId": "0.0.12345678@1689281510.675369303"
}
}
Error
{
"id": 1,
"jsonrpc": "2.0",
"error": {
"code": 9000,
"message": "The transaction failed with precheck code...",
"data": 6
}
}
hedera_signAndExecuteQuery
This method provides functionality to perform a query on a Hedera consensus node. Many Queries against consensus nodes have a transaction fee Learn more about Queries.
Most requests that do not change network state can be performed against a Mirror Node and for many use cases calling a mirror node endpoint is the recommended approach.
Parameters
Object
- signAndExecuteQuery parameters 1.1signerAccountId
:String
- Hedera account id in the format<network>:<shard>.<realm>.<num><-optional-checksum>
1.2query
:String
- base64 encoded Query
Returns
Object
- Result of the Query submitted to a Hedera consensus node 1.1.response
:String
- Base64 encoding of the Hedera API response
hedera_signMessage
This method accepts a plain text string value as input. If approved by the user, the controller UTF-8 encodes this message prepended with "\x19Hedera Signed Message:\n" plus the length of the message and signs the resulting bytes in the same manner as HAPI transactions are signed. The resulting signature(s) are transmitted back to the user encoded in a SignatureMap structure. The pseudo code for computing the signature is as follows:
<Ed25519 or ECDSA Key>.sign("\x19Hedera Signed Message:\n" + len(message) + message)
Parameters
Object
- signMessage parameters 1.1signerAccountId
:String
- Hedera account id in the format<network>:<shard>.<realm>.<num><-optional-checksum>
1.2message
:String
Returns
Object
- signMessage result 1.1signatureMap
:String
- Base64 encoded SignatureMap
Example
Request
{
"id": 1,
"jsonrpc": "2.0",
"method": "hedera_signMessage",
"params": {
"signerAccountId": "hedera:testnet:0.0.12345"
"message": "Co8BKowBCocBChoKDAjchKWmBhDW..."
}
}
Result
{
"id": 1,
"jsonrpc": "2.0",
"result": {
"signatureMap": "CAAQABjMrxoYABIGCAAQABgHGIDIr..."
}
}
hedera_getNodeAddresses
While constructing a transaction for transmission to a controller, a dApp needs to choose which Hedera Network node shall receive the transaction prior to signing (this is a requirement of the Hedera API Protocol). While a dApp can easily obtain a list of potential Hedera Nodes, a controller may not have an all-inclusive list nor a path to the node’s gRPC endpoint. The hedera_getNodeAddresses
method allows a dApp to request a list of node wallet addresses known to the controller. The controller should only include nodes in this list that it is willing and able to submit transactions to at the time of the request.
Returns
Object
- signMessage result 1.1nodes
:Array
- an array of strings in<shard>.<realm>.<num><-optional-checksum>
format, each identifying a node by its Hedera Address
Example
Request
{
"id": 1,
"jsonrpc": "2.0",
"method": "hedera_getNodeAddresses",
}
Result
{
"id": 1,
"jsonrpc": "2.0",
"result": {
"nodes": ["0.0.3", "0.0.4"]
}
}