NodeCreateTransaction - Test specification
Description:
This test specification for NodeCreateTransaction is to be one of many for testing the functionality of the Hedera SDKs. The SDK under test will use the language specific JSON-RPC server return responses back to the test driver.
Design:
Each test within the test specification is linked to one of the functions within NodeCreateTransaction. Each function is tested with a mix of boundaries. The inputs for each test are a range of valid, minimum, maximum, negative and invalid values for the method. The expected response of a passed test can be a correct error response code or seen as the result of node queries. A successful transaction (the transaction reached consensus and was applied to state) can be determined by getting a TransactionReceipt or TransactionRecord, or can be determined by using queries such as AddressBookQuery and investigating for the required changes (creations, updates, etc.). The mirror node can also be used to determine if a transaction was successful via its rest API. Error codes are obtained from the response code proto files.
Transaction properties:
https://docs.hedera.com/hedera/sdks-and-apis/sdks/node-service
Node protobufs:
https://github.com/hashgraph/hedera-protobufs/blob/main/services/node_create.proto
Response codes:
https://github.com/hashgraph/hedera-protobufs/blob/main/services/response_code.proto
Mirror Node APIs:
https://docs.hedera.com/hedera/sdks-and-apis/rest-api
JSON-RPC API Endpoint Documentation
Method Name
createNode
Input Parameters
| Parameter Name | Type | Required/Optional | Description/Notes |
|---|---|---|---|
| accountId | string | optional | The account ID that will be associated with the new node. |
| description | string | optional | A short description of the node (max 100 bytes). |
| gossipEndpoints | array of service endpoints | optional | List of service endpoints for gossip (max 10 entries). |
| serviceEndpoints | array of service endpoints | optional | List of service endpoints for gRPC calls (max 8 entries). |
| gossipCaCertificate | string | optional | Certificate used to sign gossip events (DER encoding). |
| grpcCertificateHash | string | optional | Hash of the node gRPC TLS certificate (SHA-384). |
| grpcWebProxyEndpoint | service endpoints | optional | Proxy endpoint for gRPC web calls. |
| adminKey | string | optional | Administrative key controlled by the node operator. |
| declineReward | boolean | optional | Whether the node declines rewards. |
| commonTransactionParams | json object | optional | Common transaction parameters. |
Output Parameters
| Parameter Name | Type | Description/Notes |
|---|---|---|
| nodeId | string | The node ID of the created node. |
| status | string | The status of the submitted transaction (from a TransactionReceipt). |
Additional Notes
The tests contained in this specification will assume that valid accounts were already successfully created. <CREATED_ACCOUNT_ID> will denote the ID of the account associated with the node, and <CREATED_ACCOUNT_PRIVATE_KEY> will denote the private key of the account as a DER-encoded hex string. Tests will assume valid admin keys have already been generated. <CREATED_ADMIN_KEY> will denote the admin key as a DER-encoded hex string. <VALID_GOSSIP_CERTIFICATE> will denote a valid DER-encoded certificate for gossip signing.
Property Tests
AccountId:
| Test no | Name | Input | Expected response | Implemented (Y/N) |
|---|---|---|---|---|
| 1 | Creates a node with valid account ID | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 2 | Fails with empty account ID | accountId="", gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
| 3 | Fails with non-existent account ID | accountId="123.456.789", gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an INVALID_ACCOUNT_ID response code. | Y |
| 4 | Fails with invalid account ID | accountId="invalid.account.id", gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
| 5 | Fails with no account ID | gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
Description:
| Test no | Name | Input | Expected response | Implemented (Y/N) |
|---|---|---|---|---|
| 1 | Creates a node with valid description | accountId=<CREATED_ACCOUNT_ID>, description="Test Node Description", gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 2 | Creates a node with empty description | accountId=<CREATED_ACCOUNT_ID>, description="", gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 3 | Creates a node with description exactly 100 bytes | accountId=<CREATED_ACCOUNT_ID>, description="a".repeat(100), gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 4 | Fails with description exceeding 100 bytes | accountId=<CREATED_ACCOUNT_ID>, description="a".repeat(101), gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails internal SDK error. | Y |
| 5 | Creates a node with description containing special characters | accountId=<CREATED_ACCOUNT_ID>, description="Node with special chars: !@#$%^&*()", gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds. | Y |
| 6 | Creates a node with description containing only whitespace | accountId=<CREATED_ACCOUNT_ID>, description=" ", gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds. | Y |
| 7 | Creates a node with description containing unicode characters | accountId=<CREATED_ACCOUNT_ID>, description="测试文件备注 🚀", gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds. | Y |
| 8 | Creates a node with invalid description | accountId=<CREATED_ACCOUNT_ID>, description="Test\0description", gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with a INVALID_NODE_DESCRIPTION response code from the network. | Y |
GossipEndpoints:
| Test no | Name | Input | Expected response | Implemented (Y/N) |
|---|---|---|---|---|
| 1 | Creates a node with single IP address endpoint | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 2 | Creates a node with domain name endpoint | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{domainName="node.example.com", port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 3 | Creates a node with multiple gossip endpoints | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}, {ipAddressV4=<VALID_HEX_IP_ADDRESS_2>, port=50212}, {domainName="node.example.com", port=50213}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 4 | Creates a node with maximum allowed gossip endpoints (10) | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[10 endpoints], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 5 | Fails with no gossip endpoints | accountId=<CREATED_ACCOUNT_ID>, gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with internal SDK error. | Y |
| 6 | Fails with too many gossip endpoints (11) | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[11 endpoints], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with internal SDK error. | Y |
| 7 | Fails with missing port in endpoint | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails a INVALID_ENDPOINT response code from the network. | Y |
| 8 | Fails with both IP and domain in same endpoint | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, domainName="node.example.com", port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
| 9 | Fails with invalid IP address format | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<INVALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with a INVALID_IPV4_ADDRESS status from the network. | Y |
| 10 | Fails with invalid port number (negative) | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=-1}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
| 11 | Fails with invalid port number (too high) | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=65536}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
ServiceEndpoints:
| Test no | Name | Input | Expected response | Implemented (Y/N) |
|---|---|---|---|---|
| 1 | Creates a node with service endpoints | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], serviceEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50212}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 2 | Creates a node with domain name service endpoint | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], serviceEndpoints=[{domainName="service.example.com", port=50212}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 3 | Creates a node with multiple service endpoints | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], serviceEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50212}, {domainName="service.example.com", port=50213}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 4 | Creates a node with maximum allowed service endpoints (8) | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], serviceEndpoints=[8 endpoints], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 5 | Fails with no service endpoints | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an INVALID_SERVICE_ENDPOINTS response code. | Y |
| 6 | Fails with too many service endpoints (9) | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], serviceEndpoints=[9 endpoints], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an INVALID_SERVICE_ENDPOINTS response code. | Y |
| 7 | Fails with invalid service endpoint (missing port) | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], serviceEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
| 8 | Fails with both IP and domain in same service endpoint | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], serviceEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, domainName="service.example.com", port=50212}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
| 9 | Fails with invalid IP address format in service endpoint | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], serviceEndpoints=[{ipAddressV4="invalid_ip", port=50212}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
| 10 | Fails with invalid port number (negative) in service endpoint | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], serviceEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=-1}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
| 11 | Fails with invalid port number (too high) in service endpoint | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], serviceEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=65536}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
GossipCaCertificate:
| Test no | Name | Input | Expected response | Implemented (Y/N) |
|---|---|---|---|---|
| 1 | Creates a node with valid DER-encoded certificate | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 2 | Fails with empty gossip certificate | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate="", adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails internal SDK error. | Y |
| 3 | Fails with missing gossip certificate | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an INVALID_GOSSIP_CA_CERTIFICATE response code. | Y |
| 4 | Fails with invalid gossip certificate format | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate="ffff", adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an INVALID_GOSSIP_CA_CERTIFICATE response code. | Y |
| 5 | Fails with malformed hex string | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate="not_hex_string", adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an INVALID_GOSSIP_CA_CERTIFICATE response code. | Y |
GrpcCertificateHash:
| Test no | Name | Input | Expected response | Implemented (Y/N) |
|---|---|---|---|---|
| 1 | Creates a node with valid gRPC certificate hash | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, grpcCertificateHash="a1b2c3d4e5f6", adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 2 | Creates a node with empty certificate hash | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, grpcCertificateHash="", adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds. | Y |
| 3 | Creates a node without gRPC certificate hash | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 4 | Fails with malformed hex string | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, grpcCertificateHash="not_hex_string", adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
GrpcWebProxyEndpoint:
| Test no | Name | Input | Expected response | Implemented (Y/N) |
|---|---|---|---|---|
| 1 | Fails with no domain name gRPC web proxy endpoint | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, grpcWebProxyEndpoint={ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50213}, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | Node creation fails with INVALID_SERVICE_ENDPOINT status from the network | Y |
| 2 | Creates a node with domain-based gRPC web proxy endpoint | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, grpcWebProxyEndpoint={domainName="proxy.example.com", port=50213}, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 3 | Fails with invalid gRPC web proxy endpoint (missing port) | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, grpcWebProxyEndpoint={ipAddressV4=<VALID_HEX_IP_ADDRESS>}, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
AdminKey:
| Test no | Name | Input | Expected response | Implemented (Y/N) |
|---|---|---|---|---|
| 1 | Creates a node with valid ED25519 public key as admin key | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<VALID_ED25519_PUBLIC_KEY>, commonTransactionParams.signers=[<CORRESPONDING_ED25519_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 2 | Creates a node with valid ECDSAsecp256k1 public key as admin key | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<VALID_ECDSA_SECP256K1_PUBLIC_KEY>, commonTransactionParams.signers=[<CORRESPONDING_ECDSA_SECP256K1_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 3 | Creates a node with valid ED25519 private key as admin key | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<VALID_ED25519_PRIVATE_KEY>, commonTransactionParams.signers=[<CORRESPONDING_ED25519_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 4 | Creates a node with valid ECDSAsecp256k1 private key as admin key | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<VALID_ECDSA_SECP256K1_PRIVATE_KEY>, commonTransactionParams.signers=[<CORRESPONDING_ECDSA_SECP256K1_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 5 | Creates a node with valid KeyList of ED25519 and ECDSAsecp256k1 keys as admin key | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<VALID_KEYLIST>, commonTransactionParams.signers=[<CORRESPONDING_ED25519_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 6 | Creates a node with valid nested KeyList (three levels) as admin key | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<VALID_NESTED_KEYLIST>, commonTransactionParams.signers=[<CORRESPONDING_ED25519_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 7 | Creates a node with valid ThresholdKey of ED25519 and ECDSAsecp256k1 keys as admin key | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<VALID_THRESHOLD_KEY>, commonTransactionParams.signers=[<CORRESPONDING_ED25519_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 8 | Fails with invalid admin key format | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey="invalid_key", commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
| 9 | Fails when adminKey is missing | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation fails with an SDK internal error. | Y |
| 10 | Fails with valid admin key without signing with the new key | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<VALID_KEY> | The node creation fails with an INVALID_SIGNATURE response code. | Y |
| 11 | Fails with valid public key as admin key and signs with incorrect private key | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<VALID_PUBLIC_KEY>, commonTransactionParams.signers=[<INCORRECT_PRIVATE_KEY>] | The node creation fails with an INVALID_SIGNATURE response code. | Y |
DeclineReward:
| Test no | Name | Input | Expected response | Implemented (Y/N) |
|---|---|---|---|---|
| 1 | Creates a node that accepts rewards (default) | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 2 | Creates a node that declines rewards | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, declineReward=true, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
| 3 | Creates a node with explicit declineReward: false | accountId=<CREATED_ACCOUNT_ID>, gossipEndpoints=[{ipAddressV4=<VALID_HEX_IP_ADDRESS>, port=50211}], gossipCaCertificate=<VALID_GOSSIP_CERTIFICATE>, adminKey=<CREATED_ADMIN_KEY>, declineReward=false, commonTransactionParams.signers=[<CREATED_ACCOUNT_PRIVATE_KEY>] | The node creation succeeds and returns a new nodeId. | Y |
JSON Request Example
{
"jsonrpc": "2.0",
"id": 12345,
"method": "createNode",
"params": {
"accountId": "0.0.1234",
"description": "Test Node",
"gossipEndpoints": [
{
"ipAddressV4": <VALID_HEX_IP_ADDRESS>,
"port": 50211
}
],
"serviceEndpoints": [
{
"ipAddressV4": <VALID_HEX_IP_ADDRESS>,
"port": 50212
}
],
"gossipCaCertificate": "3082052830820310a003020102020101300d06092a864886f70d01010c05003010310e300c060355040313056e6f646533",
"grpcCertificateHash": "a1b2c3d4e5f6",
"grpcWebProxyEndpoint": {
"ipAddressV4": <VALID_HEX_IP_ADDRESS>,
"port": 50213
},
"adminKey": "3030020100300706052b8104000a04220420e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35",
"declineReward": false,
"commonTransactionParams": {
"signers": [
"3030020100300706052b8104000a04220420e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35"
]
}
}
}
JSON Response Example
{
"jsonrpc": "2.0",
"id": 12345,
"result": {
"nodeId": "1",
"status": "SUCCESS"
}
}