3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

nem / symbolAdvent Calendar 2024

Day 15

Windows と TypeScript ではじめる Symbol 通信 05【委任者情報】

Last updated at Posted at 2024-12-14

Rest の/node/unlockedaccountと同等の値を取得してみましょう。
これは他と違いconfig-node.propertiestrustedHostsに羅列された 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

バックナンバー

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?