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


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

### ノードリクエスト

```typescript: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 を参照する必要があります。

## メインの作成

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

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

```typescript: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))
```

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

## バックナンバー

https://qiita.com/ccHarvestasya/items/7b9c66f145b636fe70ee

https://qiita.com/ccHarvestasya/items/46af59638c5aadc1f0be

https://qiita.com/ccHarvestasya/items/c7eca49984825eb3db29

https://qiita.com/ccHarvestasya/items/002854ee0e65f9c47fdf

https://qiita.com/ccHarvestasya/items/b2ad60e0870f4eeecbb3