Rest の/node/unlockedaccount
と同等の値を取得してみましょう。
これは他と違いconfig-node.properties
のtrustedHosts
に羅列された IP からのみ参照できます。つまり、他のノードの委任者情報は本来勝手に見ることは出来ないものなのです。今回はローカルにあるノードに対してアクセするので、設定の変更は不要です。
委任者情報の取得
ノードへリクエスト
パケットタイプは、0x304
です。ペイロードはありません。
Catapult.ts
/** パケットタイプ */
private PacketType = {
CHAIN_STATISTICS: 0x0_05,
NODE_DISCOVERY_PULL_PING: 0x1_11,
TIME_SYNC_NETWORK_TIME: 0x1_20,
FINALIZATION_STATISTICS: 0x1_32,
UNLOCKED_ACCOUNTS: 0x3_04,
}
/**
* /node/unlockedAccount 同等の値を持つクラスを取得
* @returns NodeUnlockedAccount
*/
async getNodeUnlockedAccount() {
console.info('NodeUnlockedAccount')
let nodeUnlockedAccount: NodeUnlockedAccount | undefined
try {
// ピア問合せ
const socketData = await this.request(this.PacketType.UNLOCKED_ACCOUNTS)
if (socketData)
nodeUnlockedAccount = NodeUnlockedAccount.deserialize(socketData)
this.close()
} catch (e) {
if (e instanceof Error) console.error(e.message)
else console.error(e)
}
return nodeUnlockedAccount
}
レスポンスデータの解析
シリアライズされたデータが返ってくるので、デシリアライズします。
項目 | 長さ |
---|---|
unlockedAccount | 32 バイト |
委任者のリモートアカウントの公開鍵が委任者数分連なって返ってきます。
src/models/NodeUnlockedAccount.ts
import { PacketBuffer } from '../PacketBuffer.js'
export class NodeUnlockedAccount {
constructor(public unlockedAccount: string[] = []) {}
static deserialize(payload: Uint8Array) {
const nodeBufferView = new PacketBuffer(Buffer.from(payload))
const unlockedAccount = []
while (nodeBufferView.index < nodeBufferView.length) {
unlockedAccount.push(nodeBufferView.readHexString(32).toUpperCase())
}
return new NodeUnlockedAccount(unlockedAccount)
}
toJson() {
return {
unlockedAccount: [...this.unlockedAccount],
}
}
}
メインの作成
実行するコードを作成します。
src/mainNodeUnlockedAccount.ts
import { Catapult } from './Catapult.js'
const catapult = new Catapult(
'cert/ca.crt.pem',
'cert/node.crt.pem',
'cert/node.key.pem',
'localhost'
)
const nodeUnlockedAccount = await catapult.getNodeUnlockedAccount()
if (nodeUnlockedAccount) console.log(nodeUnlockedAccount)
実行
yarn tsx .\src\mainNodeUnlockedAccount.ts
実行すると以下の様にアンロックされているアカウント情報が出力されます。
NodeUnlockedAccount
socket connected.
NodeUnlockedAccount {
unlockedAccount: [
'C02D3D1820E897DD1CB06D20335D6B5B43FCE9BAF7BDBC850CE6E954E3563C7F'
]
}
socket close: 772
バックナンバー