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"
  }
}