4.トランザクション
ブロックチェーン上のデータ更新はトランザクションをネットワークにアナウンスすることによって行います。
4.1 トランザクションのライフサイクル
トランザクションを作成してから、改ざんが困難なデータとなるまでを順に説明します。
- トランザクション作成
- ブロックチェーンが受理できるフォーマットでトランザクションを作成します。
- 署名
- アカウントの秘密鍵でトランザクションを署名します。
- アナウンス
- 任意のノードに署名済みトランザクションを通知します。
- 未承認トランザクション
- ノードに受理されたトランザクションは、未承認トランザクションとして全ノードに伝播します
- トランザクションに設定した最大手数料が、各ノード毎に設定されている最低手数料を満たさない場合はそのノードへは伝播しません。
- ノードに受理されたトランザクションは、未承認トランザクションとして全ノードに伝播します
- 承認済みトランザクション
- 約 30 秒に 1 度ごとに生成されるブロックに未承認トランザクションが取り込まれると、承認済みトランザクションとなります。
- ロールバック
- ノード間の合意に達することができずロールバックされたブロックに含まれていたトランザクションは、未承認トランザクションに差し戻されます。
- 有効期限切れや、キャッシュからあふれたトランザクションは切り捨てられます。
- ノード間の合意に達することができずロールバックされたブロックに含まれていたトランザクションは、未承認トランザクションに差し戻されます。
- ファイナライズ
- 投票ノードによるファイナライズプロセスによりブロックが確定するとトランザクションはロールバック不可なデータとして扱うことができます。
ブロックとは
ブロックは約 30 秒ごとに生成され、高い手数料を支払ったトランザクションから優先に取り込まれ、ブロック単位で他のノードと同期します。 同期に失敗するとロールバックして、ネットワークが全体で合意が取れるまでこの作業を繰り返します。
4.2 トランザクション作成
まず は最も基本的な転送トランザクションを作成してみます。
Bob への転送トランザクション
送信先の Bob アドレスを作成しておきます。
bob = sym.Account.generateNewAccount(networkType);
console.log(bob.address);
> Address {address: 'TDWBA6L3CZ6VTZAZPAISL3RWM5VKMHM6J6IM3LY', networkType: 152}
トランザクションを作成します。
tx = sym.TransferTransaction.create(
sym.Deadline.create(epochAdjustment), //Deadline:有効期限
sym.Address.createFromRawAddress("TDWBA6L3CZ6VTZAZPAISL3RWM5VKMHM6J6IM3LY"),
[],
sym.PlainMessage.create("Hello Symbol!"), //メッセージ
networkType, //テストネット・メインネット区分
).setMaxFee(100); //手数料
各設定項目について説明しま す。
有効期限
sdk ではデフォルトで 2 時間後に設定されます。 最大 6 時間まで指定可能です。
sym.Deadline.create(epochAdjustment, 6);
メッセージ
トランザクションに最大 1023 バイトのメッセージを添付することができます。 バイナリデータであっても rawdata として送信することが可能です。
空メッセージ
sym.EmptyMessage;
平文メッセージ
sym.PlainMessage.create("Hello Symbol!");
暗号文メッセージ
sym.EncryptedMessage(
"294C8979156C0D941270BAC191F7C689E93371EDBC36ADD8B920CF494012A97BA2D1A3759F9A6D55D5957E9D",
);
EncryptedMessage を使用すると、「指定したメッセージが暗号化されています」という意味の フラグ(目印)がつきます。 エクスプローラーやウォレットはそのフラグを参考にメッセージを無用にデコードしなかったり、非表示にしたりなどの処理を行います。 このメソッドが暗号化をするわけではありません。
生データ
sym.RawMessage.create(uint8Arrays[i]);
最大手数料
ネットワーク手数料については、常に少し多めに払っておけば問題はないのですが、最低限の知識は持っておく必要があります。 アカウントはトランザクションを作成するときに、ここまでは手数料として払ってもいいという最大手数料を指定します。 一方で、ノードはその時々で最も高い手数料となるトランザクションのみブロックにまとめて収穫しようとします。 つまり、多く払ってもいいというトランザクションが他に多く存在すると承認されるまでの時間が長くなります。 逆に、より少なく払いたいというトランザクションが多く存在し、その総額が大きい場合は、設定した最大額に満たない手数料額で送信が実現します。
トランザクションサイズ x feeMultipriler というもので決定されます。 176 バイトだった場合 maxFee を 100 で設定すると 17600μXYM = 0.0176XYM を手数料として支払うことを許容します。 feeMultiprier = 100 として指定する方法と maxFee = 17600 として指定する方法があります。