symbol-sdk@3.0.7で作る別名（エイリアス・アライアス）トランザクション

# はじめに

こんにちは。

symbol-sdkの3系、トランザクションシリーズ第三弾です。

今回は別名（エイリアス・アライアス）をやっていきます。

https://www.npmjs.com/package/symbol-sdk/v/3.0.7

## 注意事項

書いてあるコードについて、正確性や完全性を保証するものではありません。あくまで参考程度として頂き、最新情報は公式ドキュメンテーションをご確認ください。

# 共通（前半）

まずはアドレス別名とモザイク別名で共通となる個所について。デッドラインと鍵ペアです。

```jsx
import symbolSdk from 'symbol-sdk';

const network = symbolSdk.symbol.Network.TESTNET;
const deadline = network.fromDatetime(new Date(Date.now() + 7200000)).timestamp;

const facade = new symbolSdk.facade.SymbolFacade(network.name);

const privateKey = new symbolSdk.PrivateKey(PRIVATE_KEY);
const keyPair = new facade.constructor.KeyPair(privateKey);
```

# アドレスの別名トランザクション

トランザクションにはネームスペースのIDが必要となります。

ネームスペースの文字列からIDにする場合はこちら。これはBigInt型。

```jsx
const namespaceId = symbolSdk.symbol.generateMosaicAliasId('name1.child1');
```

IDがすでに分かっている場合はこちら。これはNamespaceId型。

```jsx
const namespaceId = new symbolSdk.symbol.NamespaceId(0xFBE54EC2AAA8EFDFn);
```

次に、アドレスです。

文字列型。

```jsx
const address = "TARDV42KTAIZEF64EQT4NXT7K55DHWBEFIXVJQY";
```

Address型。

```jsx
const address = new symbolSdk.symbol.Address("TARDV42KTAIZEF64EQT4NXT7K55DHWBEFIXVJQY");
```

秘密鍵や公開鍵からAddressへの変換。こちらはAddress型。

```jsx
const address = network.publicKeyToAddress(keyPair.publicKey);
```

トランザクションを作ります。

```jsx
const transaction = facade.transactionFactory.create({
  type: 'address_alias_transaction_v1',
  signerPublicKey: keyPair.publicKey.toString(),
  fee: 1000000n,
  deadline,
  namespaceId,
  address,
  aliasAction: symbolSdk.symbol.AliasAction.LINK,
});
```

別名を削除するには、 `AliasAction` をこうします。

```jsx
symbolSdk.symbol.AliasAction.UNLINK
```

# モザイクの別名トランザクション

ネームスペースのIDが必要ですが、これはアドレスのときと同様です。

```jsx
const namespaceId = symbolSdk.symbol.generateMosaicAliasId('name1.child1');
const namespaceId = new symbolSdk.symbol.NamespaceId(0xFBE54EC2AAA8EFDFn);
```

次いで、モザイクのID。

BigIntで指定する場合。

```jsx
const mosaicId = 0x13A98C75D38B2D59n;
```

MosaicId型。

```jsx
const mosaicId = new symbolSdk.symbol.MosaicId(0x13A98C75D38B2D59n);
```

トランザクションを作ります。

```jsx
const transaction = facade.transactionFactory.create({
  type: 'mosaic_alias_transaction_v1',
  signerPublicKey: keyPair.publicKey.toString(),
  fee: 1000000n,
  deadline,
  namespaceId,
  mosaicId,
  aliasAction: symbolSdk.symbol.AliasAction.LINK,
});
```

別名を削除するには、 `AliasAction` をこうします。（再掲）

```jsx
symbolSdk.symbol.AliasAction.UNLINK
```

# 共通（後半）

署名して、署名済みトランザクションを作ります。また、ハッシュも計算しておきます。

```jsx
const signature = facade.signTransaction(keyPair, transaction);
const jsonPayload = facade.transactionFactory.constructor.attachSignature(transaction, signature);
const hash = facade.hashTransaction(transaction).toString();

console.log(jsonPayload);
console.log(hash);
```

そして、署名済みトランザクションを送信。ここでは、 `axios` を使います。

```jsx
const sendRes = await axios.put(`${NODE_URL}/transactions`, jsonPayload).then((res) => res.data);
console.log(sendRes);
```

送信後、１秒程度待ってから、ステータスを確認。

```jsx
const statusRes = await axios.get(`${NODE_URL}/transactionStatus/${hash}`).then((res) => res.data);
console.log(statusRes);
```

# おわりに

今回は、別名のトランザクションを作りました。

# シリーズ

https://qiita.com/planethouki/items/860d9f1095c087ccd98f

https://qiita.com/planethouki/items/25f104ef4930b019ddfb