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 16

Windows と TypeScript ではじめる Symbol 通信 06【アナウンス1】

Last updated at Posted at 2024-12-15

ノードへトランザクションをアナウンス

ノードリクエスト

Catapult.ts
/** パケットタイプ */
private PacketType = {
  CHAIN_STATISTICS: 0x0_05,
  PUSH_TRANSACTIONS: 0x0_09,
  NODE_DISCOVERY_PULL_PING: 0x1_11,
  TIME_SYNC_NETWORK_TIME: 0x1_20,
  FINALIZATION_STATISTICS: 0x1_32,
  UNLOCKED_ACCOUNTS: 0x3_04,
}

/**
 * トランザクションアナウンス
 * @param payload トランザクションペイロード
 */
async announceTx(payload: Uint8Array): Promise<boolean> {
  console.info('announceTx')
  try {
    await this.request(this.PacketType.PUSH_TRANSACTIONS, payload, false)
  } catch {
    return false
  } finally {
    this.close()
  }
  return true
}

レスポンスデータの解析

レスポンスはありません。
トランザクションのエラー確認は、WebSocket か ZeroMQ の Status を参照する必要があります。

メインの作成

実行するコードを作成します。
ローカルのノードの同期が終わっていない場合は、他のノードにアナウンスしてください。

トランザクションを生成するので、ちょっと長いです。

src/mainNodeInfo.ts
import {
  Address,
  KeyPair,
  Network,
  SymbolAccount,
  SymbolFacade,
  SymbolTransactionFactory,
  descriptors,
  generateNamespacePath,
  models,
} from 'symbol-sdk/symbol'
import { PrivateKey, PublicKey, utils } from 'symbol-sdk'
import { Catapult } from './Catapult.js'

// faced生成
const facade = new SymbolFacade(Network.TESTNET)

// 送信者:アリス
// 秘密鍵からアリスのキーペア生成
const alicePriKey =
  '****************************************************************'
const aliceKeyPair = new KeyPair(new PrivateKey(alicePriKey))
const aliceAccount = new SymbolAccount(facade, aliceKeyPair)

// 受信者:ボブ
// 文字列公開鍵からPublicKey生成
const bobPubKey =
  '****************************************************************'
const bobPublicKey = new PublicKey(bobPubKey)
// ボブのアドレスを取得
const bobAddress = new Address(facade.network.publicKeyToAddress(bobPublicKey))

// XYMネームスペース取得
const nsIds = generateNamespacePath('symbol.xym')
const nsId = nsIds[nsIds.length - 1]
// 転送モザイク設定
const sendMosaics = [
  new descriptors.UnresolvedMosaicDescriptor(
    new models.UnresolvedMosaicId(nsId),
    new models.Amount(1_000000n)
  ),
]

// 平文メッセージ
const messageData = new Uint8Array([
  0x00,
  ...new TextEncoder().encode('Hello, Symbol!!'),
])

// 転送トランザクション生成
const transferTxDescriptor = new descriptors.TransferTransactionV1Descriptor(
  bobAddress,
  sendMosaics,
  messageData
)
const transferTx = facade.createTransactionFromTypedDescriptor(
  transferTxDescriptor,
  aliceKeyPair.publicKey,
  100,
  60 * 60 * 2
)

// アリス署名
const transferTxSignature = aliceAccount.signTransaction(transferTx)
const transferTxPayloadJson = SymbolTransactionFactory.attachSignature(
  transferTx,
  transferTxSignature
)

// ////////////////////////
// Peerに直接アナウンス
// ////////////////////////

const catapult = new Catapult(
  'cert/ca.crt.pem',
  'cert/node.crt.pem',
  'cert/node.key.pem',
  'localhost'
)

const announceJson = JSON.parse(transferTxPayloadJson)
await catapult.announceTx(utils.hexToUint8(announceJson.payload))

レスポンスはないので、ウォレットでトランザクションがアナウンスされたか確認してください。

バックナンバー

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?