目次

前書き
ブロックチェーン
現代主流のブロックチェーン
実社会でのブロックチェーンの活用の現状
ブロックチェーンによる社会課題の解決での強み
Symbolブロックチェーン
本書の発行に至った経緯
謝辞
免責事項
第1章 はじめに
1.1 本ドキュメントのねらい
1.2 本書の対象者
1.3 現場で使えるとは?
1.4 「明日から」じゃなくて「今日から」使えるの意味
1.5 Symbolブロックチェーンでできないこと
第2章 環境構築
2.1 使用言語
2.2 SDK
2.3 リファレンス
2.4 サンプルソースコード
2.5 事前準備
第3章 アカウント
3.1 アカウント生成
3.2 アカウントへの送信
3.3 アカウント情報の確認
3.4 現場で使えるヒント
第4章 トランザクション
4.1 トランザクションのライフサイクル
4.2 ブロックとは
4.3 トランザクション作成
4.4 署名とアナウンス
4.5 確認
4.6 トランザクション履歴
4.7 アグリゲートトランザクション
4.8 現場で使えるヒント
第5章 モザイク
5.1 モザイク生成
5.2 モザイク送信
5.3 現場で使えるヒント
第6章 ネームスペース
6.1 手数料の計算
6.2 レンタル
6.3 リンク
6.4 未解決で使用
6.5 参照
6.6 現場で使えるヒント
第7章 メタデータ
7.1 アカウントに登録
7.2 モザイクに登録
7.3 ネームスペースに登録
7.4 確認
7.5 現場で使えるヒント
第8章 ロック
8.1 ハッシュロック
8.2 シークレットロック・シークレットプルーフ
8.3 現場で使えるヒント
第9章 マルチシグ化
9.1 マルチシグの登録
9.2 確認
9.3 マルチシグ署名
9.4 マルチシグ送信の確認
9.5 マルチシグ構成変更
9.6 現場で使えるヒント
第10章 監視
10.1 リスナー設定
10.2 受信検知
10.3 ブロック監視
10.4 署名要求
10.5 現場で使えるヒント
第11章 制限
11.1 アカウント制限
11.2 グローバルモザイク制限
11.3 現場で使えるヒント
第12章 オフライン署名
12.1 トランザクション作成
12.2 Bobによる連署
12.3 Aliceによるアナウンス
12.4 現場で使えるヒント
第13章 検証
13.1 トランザクションの検証
13.2 ブロックヘッダーの検証
13.3 アカウント・メタデータの検証
13.4 現場で使えるヒント
後書き

前書き

ブロックチェーン

 本書のタイトルに含まれる「ブロックチェーン」とは、誤解を恐れず一言で表現すると「全世界に分散して存在するコンピューター同士が相互に監視しあうことで、同一性のある、改竄不可能なデータを、堅牢に維持するとともに、定められたルールにのっとった適切なデータだけを新たに追加していくことができる仕組み」です。

現代主流のブロックチェーン

 2023年現在、世の中で主流となっている、知名度の高いブロックチェーンとしては、ブロックチェーン元祖としてのビットコイン(Bitcoin)、スマートコントラクトというイノベーションを生み出したイーサリアム(Ethereum)、ブロックチェーン間の連携が根本的に考慮されたPolkadotやCosmos SDK製独自ブロックチェーン等のようなものがあり、DeFiやNFTといった領域における、ステークホルダーに対して魅力的な収益機会を提供できるサービスでの活用が盛んです。

実社会でのブロックチェーンの活用の現状

 しかし、実社会での課題解決手段としてのブロックチェーンの活用は、いまだ道半ばと感じます。

ブロックチェーンによる社会課題の解決での強み

 ブロックチェーンが技術的に実現している「堅牢さ」「透明性の高さ」「ユーザー自身が自分のデータを管理する仕組み」は、新しい時代の、公共性が高く、持続可能な、社会をよりよくしていけるようなサービスを、一部の人々や組織の超人的な頑張りに頼らずに無理なく実現するために、とても効果的だと思います。

Symbolブロックチェーン

 本書のタイトルにある「Symbolブロックチェーン」は、2015年にメインネットがローンチされたNEMブロックチェーンの新バージョンとして、2021年にメインネットがローンチされた比較的新しいブロックチェーンです。

 Symbolブロックチェーンは、現在、世の中で主流となっているDeFiやNFTといった領域での存在感こそ他ブロックチェーンに比べて少ないものの、前述した「新しい時代の、公共性が高く、持続可能な、社会をよりよくしていけるようなサービスを、一部の人々や組織の超人的な頑張りに頼らずに無理なく実現する」という領域においては、極めて有効で大きな力を発揮できる仕組みを持っています。

本書の発行に至った経緯

 本書は、Symbolブロックチェーンのシンプルなブロックエクスプローラーとして、Symbol決済や税務処理や保有しているNFTの閲覧等の様々な場面で便利なXEMBook(https://xembook.github.io/xembook/)というサービスの開発者であるXEMBook氏(https://twitter.com/xembook)によって作成された、Symbolブロックチェーンの学習用コンテンツ「速習Symbol」(https://github.com/xembook/quick_learning_symbol)を、XEMBook氏の許可を頂いた上で、NPO法人 NEM技術普及推進会 NEMTUS(https://nemtus.com/)の松岡靖典(https://twitter.com/salaryman_tousi)が編集させて頂いたものです。

謝辞

 本書の発行に際し、XEMBook氏に対して大きな感謝の意を表するとともに、本書を通じて多くの方がSymbolブロックチェーンの技術に触れ、その結果として「新しい時代の、公共性が高く、持続可能な、社会をよりよくしていけるようなサービスが、一部の人々や組織の超人的な頑張りに頼らずに無理なく実現された未来」が実現されることを切に願っています。


2023年5月20日 NPO法人 NEM技術普及推進会 NEMTUS 松岡靖典

免責事項

 本書に記載された内容は、技術情報の提供のみを目的としています。したがって、本書を用いた開発、製作、運用は、必ずご自身の責任と判断によって行ってください。これらの技術情報による開発、製作、運用の結果について、著者及び編集者はいかなる責任も負いません。

第1章 はじめに

1.1 本ドキュメントのねらい

 網羅的に技術全般を扱う一般的な公式ドキュメントとは異なり、本ドキュメントは、すばやくSymbolブロックチェーンを活用する技術を身に着けていただくための解説書です。最初から読み進めていただければ、Symbolを活用したアプリ開発のための全体像を無理なく系統立てて学習できるように構成しています。なお、ノードの構築方法やコンセンサスアルゴリズム、インセンティブ報酬などの説明はありません。

1.2 本書の対象者

 ・ブロックチェーンを試してみたいけど、何から勉強したらいいのかわからない方。

 ・ブロックチェーンを覚えても、何に使えるのかピンと来ない方。

 ・Symbolの教材を作ろうとしてるけど、どういう手順で教えたらいいのか悩んでいる方。

 ・Symbolって簡単っていうけど、どういう感じで簡単なのかさくっと知りたい方。

1.3 現場で使えるとは?

 ブロックチェーンを構成するデータの最小単位はお金ではなく、タイムスタンプつき存在証明です。ここに注目すればブロックチェーンは認証やトレーサビリティなど、さらにその用途を広げることができます。世の中を見渡せば、あらゆることが 信頼の数珠繋ぎ で成り立っていることがわかります。その信頼を形にすることが困難なために、多くのことがお金に変換されて構築されてきました。

 今、ブロックチェーン技術によりその信頼をお金に変換することなく、改ざん不可能な形で記録することができるようになりました。本ドキュメントは、金融だけではなく、さらに多くのビジネスや文化の 「現場」 で活躍する人にブロックチェーンの力を活かすヒントを得てもらうために執筆しました。

1.4 「明日から」じゃなくて「今日から」使えるの意味

 昨今、IoTなどの開発現場では 「もはやPoCすら必要ない」 と表現されることがあります。ITを構成する部品化が進み、試しに作ってみた装置がそのまま実運用を始めてしまえるほどにモジュール化されつつあります。Symbolブロックチェーンもアプリケーションを構築するまでもなく、そして自分でノードを建てる必要もなく、設定したアカウントやトークンがコミュニティの提供するツール群でそのまま高セキュリティな情報基盤として活用できるプラットフォームとなっています。

 ぜひ、本ドキュメントでその可能性を感じていただければと思います。なお、各章の最後に載せた「現場で使えるヒント」は各機能の横断的な知識が必要になりますので、最初は読み飛ばしていただいても大丈夫です(いくつかの章の現場で使えるヒントは「現在執筆中」とさせていただいております)。

1.5 Symbolブロックチェーンでできないこと

 他のチェーンで開発されてきた方のために、少しだけ説明しておきます。

 Symbolブロックチェーンには、コントラクトアカウントが存在しません。したがって、スマートコントラクトをデプロイするという発想がなく、すべてのスマートコントラクトは1回だけ実行されて、その効力を失います。そのため、デプロイレス・ワンタイムスマートコントラクトと表現されることもあります。

 デプロイ不要なため、任意の言語でスマートコントラクトを記述することができ、また、1回限りの実行のため、不適切なループ制御などでネットワークのリソースを大量に消費したり、コントラクト内のロジックを再利用して悪用されるといった脆弱性を狙われることもありません。

図1.1: 学習スコープ

第2章 環境構築

 本書の読み進め方について解説します。

2.1 使用言語

 JavaScriptを使用します。

2.2 SDK

 ・symbol-sdk-typescript-javascript v2.0.4

  ─https://github.com/symbol/symbol-sdk-typescript-javascript

 上記SDKをbrowserify化したものを、ブラウザの開発者コンソールに読み込ませて使用します。

 ・https://github.com/xembook/nem2-browserify

注意

 現在、symbol-sdk v3.1.0がアルファ版としてリリースされており、v 2.0.4はdeprecatedです。v3ではrxjsに依存した多くの機能が削除されるため、REST APIへの直接アクセスが推奨されます。

2.3 リファレンス

 ・Symbol SDK for TypeScript and JavaScript

  ─https://symbol.github.io/symbol-sdk-typescript-javascript/1.0.3/

 ・Catapult REST Endpoints (1.0.3)

  ─https://symbol.github.io/symbol-openapi/v1.0.3/

2.4 サンプルソースコード

2.4.1 改行

 本書で表示しているソースコードをコピー&ペーストして使用する際には、手動で改行を修正する必要があるかもしれません。あらかじめご了承ください。

2.4.2 変数宣言

 console上で何度も書き直して動作検証をしてほしいため、あえてconst宣言を行いません。アプリケーション開発時はconst宣言するなどして、セキュリティを確保してください。

2.4.3 出力値確認

 console.log()で変数の内容を出力します。好みに応じた出力関数に読み替えてお試しください。また、出力内容は > 以下に記述しています。サンプルを実行する場合は、その部分を含まずに試してください。

2.4.4 同期・非同期

 他言語に慣れた開発者の方には非同期処理の書き方に抵抗がある人もいると思うので、特に問題がない限り非同期処理を使わずに解説します。

2.4.5 アカウント

2.4.5.1 Alice

 本書では主にAliceアカウントを中心として解説します。3章で作成したAliceをその後の章でも引き続き使いますので、十分なXYMを送信した状態でお読みください。

2.4.5.2 Bob

 Aliceとの送受信用のアカウントとして各章で必要に応じて作成します。その他、マルチシグの章などでCarolなどを使用します。

2.4.6 手数料

 本書で紹介するトランザクションの手数料乗数は、100でトランザクションを作成します。

2.5 事前準備

図2.1: 環境構築

 ノード一覧より任意のノードのページをChromeブラウザなどで開きます。

 ・テストネット

  ─https://symbolnodes.org/nodes_testnet/

 ・メインネット

  ─https://symbolnodes.org/nodes/

 ノード一覧の以下画像の右端のリンクをクリックして、開いたブラウザの画面上で以降の操作はすべて行います。

図2.2: ノード一覧

 本書ではテストネットを前提として解説しています。

 F12キーを押して開発者コンソールを開き、Consoleにソースコードをコピー&ペーストして実行できるようにするために、Consoleにallow pastingと入力してEnterキーで実行してください。

 続いて以下のスクリプトを入力します。

(script = document.createElement("script")).src =
"https://xembook.github.io/nem2-browserify/symbol-sdk-pack-2.0.4.js";
document.getElementsByTagName('head')[0].appendChild(script);

 続いて、ほぼすべての章で利用する共通ロジック部分を実行しておきます。

NODE = window.origin; //現在開いているページのURLがここに入ります
sym = require("/node_modules/symbol-sdk");
repo = new sym.RepositoryFactoryHttp(NODE);
txRepo = repo.createTransactionRepository();
(async() =>{
    networkType = await repo.getNetworkType().toPromise();
    generationHash = await repo.getGenerationHash().toPromise();
    epochAdjustment = await repo.getEpochAdjustment().toPromise();
})();

function clog(signedTx){
    console.log(NODE + "/transactionStatus/" + signedTx.hash);
    console.log(NODE + "/transactions/confirmed/" + signedTx.hash);
    console.log("https://symbol.fyi/transactions/" + signedTx.hash);
    console.log("https://testnet.symbol.fyi/transactions/" + signedTx.hash);
}

 これで準備完了です。

 なお、次章からはトランザクションを実行し、その結果を確認するという流れを繰り返すことになります。トランザクションの実行結果を確認する際には、以下のようにclogメソッドを使用して、表示されるブロックエクスプローラーのリンクからトランザクションの状態を確認するといいでしょう。

clog(signedTx)

 また、各章で使用するアカウントは、各章を順に進めていくことで各章に再定義せずに前の章のアカウントをそのまま使用できる箇所と、各章に使い捨てのアカウントを生成する必要がある箇所のいずれの場合もあります。中断の後、途中から再開するときには、新たにアカウントを作成したり事前に前章のトランザクションを送信したり必要がある場合も考えられます。事前に記録しておいた秘密鍵からアカウントを復元して使用するか、別途アカウントを新しく作り直してリトライする等して適宜対応してください。

 本ドキュメントの内容が少しわかりにくい場合は、Qiita等の記事もご参考ください。

 https://qiita.com/nem_takanobu/items/e2b1f0aafe7a2df0fe1b

試し読みはここまでです。
この続きは、製品版でお楽しみください。