トランザクション

一般的にトランザクションとはデータベースシステム内での作業単位を表します。ブロックチェーンにおいて、 アカウント によって署名されたアクションが、それ自身の状態を変えるときを指します。

トランザクションタイプ

Symbol にはたくさんの異なるトランザクションタイプがあります。例えば、 モザイク をアカウント間で転送したり、メッセージング、アカウントの所有権を転送または構築する ( マルチシグ ルールも含めて) などがあります。

デフォルトでは、次のトランザクションタイプが Symbol ベースのネットワークに含まれます:

Id タイプ 説明
アカウントリンク    
0x414C AccountKeyLinkTransaction アカウントのインポータンスをプロキシアカウントに委任します。デリゲートハーベスティングをアクティブ化しようとする、すべてのアカウントに必要なことです。
0x424C NodeKeyLinkTransaction アカウントを TLS が使用する公開鍵とリンクしてセッションを作成します。デリゲートハーベスティングをアクティブ化することをいとわない、すべてのアカウントに必要です。
アグリゲート    
0x4141 AggregateCompleteTransaction 異なるアカウントにトランザクションをバッチ送信します。
0x4241 AggregateBondedTransaction 異なるアカウント間のトランザクションの手配を提案します。
CosignatureTransaction AggregateBondedTransaction へ連署します。
コア    
0x4143 VotingKeyLinkTransaction アカウントを BLS 公開鍵にリンクします。ファイナライズ済みブロックに投票する意思のあるノードオペレータに必要です。
0x4243 VrfKeyLinkTransaction アカウントを VRF 公開鍵にリンクします。ハーベスト対象のすべてのアカウントに必要です。
モザイク    
0x414D MosaicDefinitionTransaction 新しいモザイクの作成
0x424D MosaicSupplyChangeTransaction モザイクの総供給量を変更します。
ネームスペース    
0x414E NamespaceRegistrationTransaction ネームスペースを登録してアセットを整理します。
0x424E AddressAliasTransaction アカウントにネームスペースをアタッチする。
0x434E MosaicAliasTransaction ネームスペースをモザイクにアタッチする。
Metadata    
0x4144 AccountMetadataTransaction アカウントに Key-Value 状態を関連付けます。
0x4244 MosaicMetadataTransaction モザイクに Key-Value 状態を関連付けます。
0x4344 NamespaceMetadataTransaction ネームスペースに Key-Value 状態を関連付けます。
Multisignature    
0x4155 MultisigAccountModificationTransaction マルチシグコントラクトの作成と変更
ハッシュロック    
0x4148 HashLockTransaction アグリゲートボンドトランザクションのアナウンスに必要なデポジットをロック
シークレットロック    
0x4152 SecretLockTransaction 異なるチェーン間でのトークンスワップの開始。
0x4252 SecretProofTransaction 異なるチェーン間でのトークンスワップの完結。
アカウント制限    
0x4150 AccountAddressRestrictionTransaction 与えられたアドレスを含む送受信トランザクションの許可/ブロックします。
0x4250 AccountMosaicRestrictionTransaction 与えられたモザイクを含む受信トランザクションの許可/ブロックします。
0x4350 AccountOperationRestrictionTransaction トランザクションタイプによる送信トランザクションの許可/ブロックします。
モザイク制限    
0x4151 MosaicGlobalRestrictionTransaction 制限可能モザイクの転送にグローバルルールを設定します。
0x4251 MosaicAddressRestrictionTransaction 制限可能モザイクの転送に特定アドレスを設定します。
Transfer    
0x4154 TransferTransaction モザイクとメッセージを2つのアカウント間で送信します。

Symbol で利用可能なすべての基本トランザクションタイプは個別の プラグイン として定義されています。このプラグインアプローチにより、開発者はコアエンジンを変更したり、他の機能を分断することなく、新しいトランザクションタイプを導入できます。

トランザクションの定義

トランザクションはシリアル化された形式で定義されます。すべてのトランザクションは基本 トランザクションスキーマ定義 から拡張され、特定の型プロパティが追加されています。

すべてのトランザクションは deadline と max_fee を定義する必要があります:

  • deadline: トランザクションは期限に到達する前に受け入れられるタイムウィンドウを持ちます。期限に到達してトランザクションが期限切れになると、すべてのノードはトランザクションを拒否します。デフォルトでは、 SDK は期限を 2 時間に設定しますが、最大 24 時間まで延長できます。
  • max_fee: トランザクション送信者がトランザクションを承認されるために支払う意思のあるネットワーク通貨の最大額。 次のドキュメント は最適な max_fee 値を設定する方法を示しています。

注釈

catbuffer スキーマ リポジトリはどのように各トランザクションタイプがシリアライズされるべきかを定義しています。 catbuffer-generators プロジェクトと組み合わせると、開発者は特定のプログラミング言語用のビルダークラスを生成できます。

新しいトランザクションを定義するには SDK を使用することを推奨します。

// replace with recipient address
const rawAddress = 'TB6Q5E-YACWBP-CXKGIL-I6XWCH-DRFLTB-KUK34I-YJQ';
const recipientAddress = Address.createFromRawAddress(rawAddress);
// replace with network type
const networkType = NetworkType.TEST_NET;
// replace with symbol.xym id
const networkCurrencyMosaicId = new MosaicId('5E62990DCAC5BE8A');
// replace with network currency divisibility
const networkCurrencyDivisibility = 6;

const transferTransaction = TransferTransaction.create(
    Deadline.create(),
    recipientAddress,
    [new Mosaic (networkCurrencyMosaicId,
        UInt64.fromUint(10 * Math.pow(10, networkCurrencyDivisibility)))],
    PlainMessage.create('This is a test message'),
    networkType,
    UInt64.fromUint(2000000));

トランザクションへの署名

アカウントはトランザクションをネットワークにアナウンスする前に、トランザクションに署名する必要があります。トランザクションへの署名は、定義通りにネットワークの状態を変更することにアカウントが同意することを表明します。

例えば、TransferTransaction には受信者が誰であるかと、転送するモザイクの量が記述されます。この場合、トランザクションに署名することは、それらのモザイクをあるアカウントの残高から他方のアカウントに移動することに同意することを意味します。

アカウントは トランザクションへ署名 をするために次のステップに従う必要があります:

  1. サイズ、署名、および署名者以外のトランザクションのすべてのバイトである 署名バイト を取得します。
  2. ネメシスブロックの ジェネレーションハッシュ を取得してください。 nodeUrl + '/node/info' にアクセスして meta.networkGenerationHash の値をコピーします。
  3. 署名バイトにネメシスブロックのジェネレーションハッシュを接頭します。
  4. 署名者の秘密鍵で結果文字列に署名します。これはトランザクションに 署名 を与えます。
  5. 署名者の署名と公開鍵をトランザクションに追加して ペイロード を取得します。
  6. 署名の最初の 32 バイト、署名者公開鍵、ネメシスブロックジェネレーションハッシュ、残りのトランザクションペイロードに SHA3-512 ハッシュアルゴリズムを適用して トランザクションハッシュ を計算します。
// replace with sender private key
const privateKey = '1111111111111111111111111111111111111111111111111111111111111111';
const account = Account.createFromPrivateKey(privateKey, networkType);
// replace with meta.networkGenerationHash (nodeUrl + '/node/info')
const networkGenerationHash = '1DFB2FAA9E7F054168B0C5FCB84F4DEB62CC2B4D317D861F3168D161F54EA78B';
const signedTransaction = account.sign(transferTransaction, networkGenerationHash);
console.log('Payload:', signedTransaction.payload);
console.log('Transaction Hash:', signedTransaction.hash);

トランザクションのアナウンス

署名されたトランザクションはネットワークにアナウンスする準備ができています。SDK TransactionHttp サービスを使用するか、ペイロードを トランザクションエンドポイント のリクエストに追加することができます。

// replace with node endpoint
const nodeUrl = 'http://api-01.us-east-1.0.10.0.x.symboldev.network:3000';
const repositoryFactory = new RepositoryFactoryHttp(nodeUrl);
const transactionHttp = repositoryFactory.createTransactionRepository();

transactionHttp
    .announce(signedTransaction)
    .subscribe((x) => console.log(x), (err) => console.error(err));
curl -X PUT -H "Content-type: application/json" -d '{"payload":"B3000000F77A8DCFCB57B81F9BE5B46738F7132998F55123BFF4D89DC8E5CAE1F071A040E5571F4D8DA125B243C785DA5261F878E3DE898815F6E8F12A2C0A5F0A9C3504FA6249E8334E3F83E972461125504AFFD3E7750AFBB3371E7B2D22A599A3D0E3039054410000000000000000265DEE3F1700000090FA39EC47E05600AFA74308A7EA607D145E371B5F4F1447BC0F00010057656C636F6D6520546F204E454D44B262C46CEABB858096980000000000"}' http://localhost:3000/transaction

トランザクションのアナウンスをすると、REST API は常にOKをすぐに返します。この時点ではトランザクションが正当かどうかは不明です。

../_images/transaction-cycle.png

トランザクションサイクル

バリデーション

バリデーションの初回ステージは API ノードで行われます。トランザクションにエラーがある場合、WebSocket はステータスチャンネルへ通知を投げます。そうでなければ、トランザクションは P2P ネットワークへ 未承認 ステータスとして到達します。この状態の場合、トランザクションがブロックに含まれるかどうかはまだ明確ではありません。そのため、未承認状態のトランザクションを信頼してはいけません。

トランザクションが ハーベストされたブロック に追加される前に、2つ目のバリデーションが実施されます。成功した場合、ハーベスターはブロックにトランザクションを保存し、そのトランザクションは 承認済み のステータスとなります。この状態において、トランザクションはブロックチェーン台帳に承認の上に記録されていますが、まだ ファイナリティ は得ていません。

ネットワーク障害やパーティションなど、特定の状況下では最後に承認されたブロックが rolled back される可能性があります。そのため、ファイナライズされていない承認済みのトランザクションはネットワークによって認識されますが、巻き戻される可能性があるため、不変ではありません。

ブロックが不変となるためには finalization プロセスを完了する必要があります。ブロックがファイナライズされると、ブロックと含まれるトランザクションがブロックチェーン台帳に恒久的に記録されます。

スパムスロットル

ノードのキャッシュはブロックに取り込まれるまで、未承認トランザクションを保持します。キャッシュは貴重なリソースのため、 Symbol は攻撃者が未承認トランザクションでキャッシュを満たすことを防ぎながら、正当な利用者が新しい未承認トランザクションを正常に送信できるようにするためのスパムスロットルを実装しています。

スパムスロットルはアカウントのインポータンススコアを比較して、アカウントごとのキャッシュの配分を公平に計算することにより、アカウントが送信できる未承認トランザクションの量を制御します。アカウントがキャッシュの公平な配分を超過しており、ノードキャッシュに未承認トランザクションが1つのブロックに含めることができる量よりも多い場合、トランザクションは拒否されます。これにより、悪意のある利用者がノードにスパムトランザクションの送信を効果的にブロックし、他のユーザーがノードを通常通り使用できるようにします。

ガイド

次項: 手数料