Windows と TypeScript ではじめる Symbol 通信 01 【環境構築】


仮想 Ubuntu 上で Symbol を動かして、ちょっとだけノードと通信してみましょう。

## 環境

前提とする環境は以下の通りです。

- Windows11
- WSL2 上の Ubuntu24

通信するために使用するのは以下の通りです。

- VSCode
- Node.js
- TypeScript

## WSL2

### Ubuntu の導入

以下を参考にしてください。

https://qiita.com/ryome/items/240f36923f5cb989da27

### Symbol のビルド

以下を参考にしてください。

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

### Symbol テストネットで起動

以下を参考にしてください。

https://qiita.com/ccHarvestasya/items/9f0d918657dfba63dc04

## Windows に TypeScript 環境構築

### Node.js のインストール

好きな方法で各々インストールしてください。私は、環境管理が大変なので`Volta`を使用してインストールします。

```powershell
winget install Volta.Volta
```

最新の LTS をインストールします。

```powershell
volta install node
```

yarn もインストールします。

```powershell
volta install yarn
```

## TypeScript プロジェクトの作成

任意の場所にプロジェクト用のフォルダを作成します。作成したら VSCode で作成したフォルダを開きます。

これからのコマンド入力は VSCode のターミナルから行った方がスムーズに作業が進むと思います。

### プロジェクトフォルダの初期化

yarn が`node_modules`フォルダを作成するようファイルを作成します。

```powershell
echo "nodeLinker: node-modules" > .yarnrc.yml
```

プロジェクトフォルダを初期化します。

```powershell
yarn init
```

念のためバージョンのピン留めもしておきます。

```powershell
volta pin node
volta pin npm
volta pin yarn
```

### パッケージのインストール

Symbol-SDK をインストールします。

```powershell
yarn add symbol-sdk
```

### 開発用パッケージのインストール

開発時に使用するパッケージをインストールします。

```powershell
yarn add -D typescript tsx eslint prettier eslint-config-prettier @types/node @typescript-eslint/eslint-plugin @typescript-eslint/parser
```

#### ESLint の設定

`.eslintrc.json`を作成＆編集。

```json:.eslintrc.json
{
  "extends": [
    "plugin:@typescript-eslint/recommended",
    "prettier"
  ]
}
```

#### Prettier の設定

`.prettierrc.json`を作成＆編集。

```json:.prettierrc.json
{
  "tabWidth": 2,
  "printWidth": 80,
  "trailingComma": "es5",
  "semi": false,
  "singleQuote": true
}
```

### tsconfig.json の作成

`tsconfig.json`を作成＆編集。

```json:tsconfig.json
{
  "compilerOptions": {
    "declaration": true,
    "module": "NodeNext",
    "outDir": "dist",
    "rootDir": "src",
    "strict": true,
    "target": "es2022",
    "moduleResolution": "node16",
    "composite": true
  },
  "include": [
    "./src/**/*"
  ],
  "ts-node": {
    "esm": true
  }
}
```

### package.json の編集

`package.json`に`"type": "module"`を追加します。これにより、ES モジュールとして扱われるようになります。

```json:package.json
{
  "name": "symcomm",
  "packageManager": "yarn@4.5.1",
  "type": "module",
...
```

### 動作確認

確認のため簡単なコードを動かしてます。

```typescript:src/test.ts
import { Bip32 } from 'symbol-sdk'
import { Address, Network, SymbolFacade } from 'symbol-sdk/symbol'

// ニーモニック生成
const bip32 = new Bip32()
const mnemonic = bip32.random()
console.log(`mnemonic: ${mnemonic}`)

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

// ニーモニックから10件アカウントを生成する
const bip32Node = bip32.fromMnemonic(mnemonic, '')
for (let i = 0; i < 10; i++) {
  // Bip32Path生成
  const bip32Path = facade.bip32Path(i)
  // Bip32Pathから子孫Bip32Path生成
  const childBip32Node = bip32Node.derivePath(bip32Path)
  // 子孫Bip32Pathからキーペア生成
  const keyPair = SymbolFacade.bip32NodeToKeyPair(childBip32Node)
  // 公開鍵からアドレス生成
  const address = new Address(
    facade.network.publicKeyToAddress(keyPair.publicKey)
  )
  // 表示
  console.log(
    `[${i}]`,
    `Addr:${address.toString()}`,
    `PubK:${keyPair.publicKey.toString()}`,
    `PriK:${keyPair.privateKey.toString()}`
  )
}
```

実行します。

```powershell
yarn tsx .\src\test.ts
```

ニーモニックと 10 件のアカウントが表示されれば OK です。

## 証明書の作成

SSL ソケット通信なので証明書が必要です。
作るのが少し面倒なので`simple-symbol-node-cert-cli`を使って作成します。

`simple-symbol-node-cert-cli`をインストールします。

```powershell
npm install -g simple-symbol-node-cert-cli
```

新規に証明書を作成します。
ノードと証明書を同じにするために、ノード側にある`privatekeys.yaml`ファイルをコピーして以下を実行します。

```powershell
simple-symbol-node-cert-cli generate
```