Skip to content

Commit 916eb8e

Browse files
committed
feat: add example
Signed-off-by: dosi <dosi.kolev@limechain.tech>
1 parent b2658f3 commit 916eb8e

1 file changed

Lines changed: 202 additions & 0 deletions

File tree

examples/registered_node/main.go

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"net"
6+
"os"
7+
"time"
8+
9+
hiero "github.com/hiero-ledger/hiero-sdk-go/v2/sdk"
10+
)
11+
12+
// Registered Node Lifecycle
13+
//
14+
// Walks through the full lifecycle of a registered node:
15+
// 1. Generate an admin key.
16+
// 2. Create a registered node with a block node service endpoint.
17+
// 3. Query the RegisteredNodeAddressBook to confirm it appears.
18+
// 4. Update the registered node with a new description and a second endpoint.
19+
// 5. Associate the registered node with an existing consensus node.
20+
// 6. Delete the registered node.
21+
//
22+
// Environment:
23+
//
24+
// HEDERA_NETWORK — e.g. "previewnet", "testnet", or "mainnet"
25+
// OPERATOR_ID — e.g. "0.0.2"
26+
// OPERATOR_KEY — DER-encoded private key
27+
// CONSENSUS_NODE_ID — numeric consensus node ID to associate (optional; step 5 is skipped if unset)
28+
// CONSENSUS_NODE_ADMIN_KEY — DER-encoded admin key for that consensus node (optional; required if CONSENSUS_NODE_ID is set)
29+
func main() {
30+
client, err := hiero.ClientForName(os.Getenv("HEDERA_NETWORK"))
31+
if err != nil {
32+
panic(fmt.Sprintf("%v : error creating client", err))
33+
}
34+
35+
operatorAccountID, err := hiero.AccountIDFromString(os.Getenv("OPERATOR_ID"))
36+
if err != nil {
37+
panic(fmt.Sprintf("%v : error parsing OPERATOR_ID", err))
38+
}
39+
40+
operatorKey, err := hiero.PrivateKeyFromString(os.Getenv("OPERATOR_KEY"))
41+
if err != nil {
42+
panic(fmt.Sprintf("%v : error parsing OPERATOR_KEY", err))
43+
}
44+
45+
client.SetOperator(operatorAccountID, operatorKey)
46+
47+
// Step 1 — generate the registered node admin key.
48+
adminKey, err := hiero.PrivateKeyGenerateEd25519()
49+
if err != nil {
50+
panic(fmt.Sprintf("%v : error generating admin key", err))
51+
}
52+
fmt.Printf("Generated registered-node admin key: %s\n", adminKey.PublicKey().String())
53+
54+
// Step 2 — build the initial block node service endpoint (IP + TLS + two APIs).
55+
primaryEndpoint := &hiero.BlockNodeServiceEndpoint{}
56+
primaryEndpoint.
57+
SetIPAddress(net.IPv4(192, 168, 1, 1).To4()).
58+
SetPort(50211).
59+
SetRequiresTls(true).
60+
SetEndpointApis([]hiero.BlockNodeApi{
61+
hiero.BlockNodeApiSubscribeStream,
62+
hiero.BlockNodeApiStatus,
63+
})
64+
65+
// Step 3 — submit the create transaction.
66+
createTx, err := hiero.NewRegisteredNodeCreateTransaction().
67+
SetAdminKey(adminKey).
68+
SetDescription("My Block Node").
69+
SetServiceEndpoints([]hiero.RegisteredServiceEndpoint{primaryEndpoint}).
70+
FreezeWith(client)
71+
if err != nil {
72+
panic(fmt.Sprintf("%v : error freezing create tx", err))
73+
}
74+
75+
createResp, err := createTx.Sign(adminKey).Execute(client)
76+
if err != nil {
77+
panic(fmt.Sprintf("%v : error executing create tx", err))
78+
}
79+
80+
createReceipt, err := createResp.SetValidateStatus(true).GetReceipt(client)
81+
if err != nil {
82+
panic(fmt.Sprintf("%v : error fetching create receipt", err))
83+
}
84+
85+
// Step 4 — verify the assigned registeredNodeId.
86+
registeredNodeId := createReceipt.RegisteredNodeId
87+
if registeredNodeId == 0 {
88+
panic("expected a non-zero registeredNodeId in the receipt")
89+
}
90+
fmt.Printf("Created registered node with id: %d\n", registeredNodeId)
91+
92+
// Wait for it
93+
time.Sleep(time.Second * 5)
94+
95+
// Step 5 — query the address book and confirm the new node is present.
96+
book, err := hiero.NewRegisteredNodeAddressBookQuery().
97+
SetRegisteredNodeId(registeredNodeId).
98+
Execute(client)
99+
if err != nil {
100+
panic(fmt.Sprintf("%v : error executing address book query", err))
101+
}
102+
103+
found := false
104+
for _, n := range book.RegisteredNodes {
105+
if n.RegisteredNodeID == registeredNodeId {
106+
found = true
107+
fmt.Printf("Address book returned registered node: id=%d description=%q\n",
108+
n.RegisteredNodeID, n.Description)
109+
break
110+
}
111+
}
112+
if !found {
113+
panic("registered node was not found in the address book")
114+
}
115+
116+
// Step 6 — build the second endpoint (domain name, TLS, STATUS only).
117+
secondaryEndpoint := &hiero.BlockNodeServiceEndpoint{}
118+
secondaryEndpoint.
119+
SetDomainName("block.example.com").
120+
SetPort(50212).
121+
SetRequiresTls(true).
122+
SetEndpointApis([]hiero.BlockNodeApi{hiero.BlockNodeApiStatus})
123+
124+
// Step 7 — update the registered node with a new description and both endpoints.
125+
updateTx, err := hiero.NewRegisteredNodeUpdateTransaction().
126+
SetRegisteredNodeId(registeredNodeId).
127+
SetDescription("My Updated Block Node").
128+
SetServiceEndpoints([]hiero.RegisteredServiceEndpoint{primaryEndpoint, secondaryEndpoint}).
129+
FreezeWith(client)
130+
if err != nil {
131+
panic(fmt.Sprintf("%v : error freezing update tx", err))
132+
}
133+
134+
updateResp, err := updateTx.Sign(adminKey).Execute(client)
135+
if err != nil {
136+
panic(fmt.Sprintf("%v : error executing update tx", err))
137+
}
138+
139+
updateReceipt, err := updateResp.SetValidateStatus(true).GetReceipt(client)
140+
if err != nil {
141+
panic(fmt.Sprintf("%v : error fetching update receipt", err))
142+
}
143+
fmt.Printf("Update receipt status: %s\n", updateReceipt.Status)
144+
145+
// Step 8 — associate with an existing consensus node (optional).
146+
if consensusNodeIDStr := os.Getenv("CONSENSUS_NODE_ID"); consensusNodeIDStr != "" {
147+
var consensusNodeID uint64
148+
if _, err := fmt.Sscanf(consensusNodeIDStr, "%d", &consensusNodeID); err != nil {
149+
panic(fmt.Sprintf("%v : error parsing CONSENSUS_NODE_ID", err))
150+
}
151+
152+
consensusAdminKey, err := hiero.PrivateKeyFromString(os.Getenv("CONSENSUS_NODE_ADMIN_KEY"))
153+
if err != nil {
154+
panic(fmt.Sprintf("%v : error parsing CONSENSUS_NODE_ADMIN_KEY", err))
155+
}
156+
157+
nodeUpdateTx, err := hiero.NewNodeUpdateTransaction().
158+
SetNodeID(consensusNodeID).
159+
AddAssociatedRegisteredNode(registeredNodeId).
160+
FreezeWith(client)
161+
if err != nil {
162+
panic(fmt.Sprintf("%v : error freezing node update tx", err))
163+
}
164+
165+
nodeUpdateResp, err := nodeUpdateTx.Sign(consensusAdminKey).Execute(client)
166+
if err != nil {
167+
panic(fmt.Sprintf("%v : error executing node update tx", err))
168+
}
169+
170+
nodeUpdateReceipt, err := nodeUpdateResp.SetValidateStatus(true).GetReceipt(client)
171+
if err != nil {
172+
panic(fmt.Sprintf("%v : error fetching node update receipt", err))
173+
}
174+
fmt.Printf("Consensus node %d updated with associated registered node %d: %s\n",
175+
consensusNodeID, registeredNodeId, nodeUpdateReceipt.Status)
176+
} else {
177+
fmt.Println("CONSENSUS_NODE_ID not set — skipping consensus-node association step")
178+
}
179+
180+
// Step 9 — delete the registered node.
181+
deleteTx, err := hiero.NewRegisteredNodeDeleteTransaction().
182+
SetRegisteredNodeId(registeredNodeId).
183+
FreezeWith(client)
184+
if err != nil {
185+
panic(fmt.Sprintf("%v : error freezing delete tx", err))
186+
}
187+
188+
deleteResp, err := deleteTx.Sign(adminKey).Execute(client)
189+
if err != nil {
190+
panic(fmt.Sprintf("%v : error executing delete tx", err))
191+
}
192+
193+
deleteReceipt, err := deleteResp.SetValidateStatus(true).GetReceipt(client)
194+
if err != nil {
195+
panic(fmt.Sprintf("%v : error fetching delete receipt", err))
196+
}
197+
fmt.Printf("Delete receipt status: %s\n", deleteReceipt.Status)
198+
199+
if err := client.Close(); err != nil {
200+
panic(fmt.Sprintf("%v : error closing client", err))
201+
}
202+
}

0 commit comments

Comments
 (0)