一般的にトランザクションとはデータベースシステム内での作業単位を表します。ブロックチェーンにおいて、 アカウント によって署名されたアクションが、それ自身の状態を変えるときを指します。
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 には受信者が誰であるかと、転送するモザイクの量が記述されます。この場合、トランザクションに署名することは、それらのモザイクをあるアカウントの残高から他方のアカウントに移動することに同意することを意味します。
アカウントは トランザクションへ署名 をするために次のステップに従う必要があります:
署名バイト
を取得します。ジェネレーションハッシュ
を取得してください。 nodeUrl + '/node/info'
にアクセスして meta.networkGenerationHash
の値をコピーします。署名
を与えます。ペイロード
を取得します。 // 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をすぐに返します。この時点ではトランザクションが正当かどうかは不明です。
トランザクションサイクル
バリデーションの初回ステージは API ノードで行われます。トランザクションにエラーがある場合、WebSocket はステータスチャンネルへ通知を投げます。そうでなければ、トランザクションは P2P ネットワークへ 未承認 ステータスとして到達します。この状態の場合、トランザクションがブロックに含まれるかどうかはまだ明確ではありません。そのため、未承認状態のトランザクションを信頼してはいけません。
トランザクションが ハーベストされたブロック に追加される前に、2つ目のバリデーションが実施されます。成功した場合、ハーベスターはブロックにトランザクションを保存し、そのトランザクションは 承認済み のステータスとなります。この状態において、トランザクションはブロックチェーン台帳に承認の上に記録されていますが、まだ ファイナリティ は得ていません。
ネットワーク障害やパーティションなど、特定の状況下では最後に承認されたブロックが rolled back される可能性があります。そのため、ファイナライズされていない承認済みのトランザクションはネットワークによって認識されますが、巻き戻される可能性があるため、不変ではありません。
ブロックが不変となるためには finalization プロセスを完了する必要があります。ブロックがファイナライズされると、ブロックと含まれるトランザクションがブロックチェーン台帳に恒久的に記録されます。
ノードのキャッシュはブロックに取り込まれるまで、未承認トランザクションを保持します。キャッシュは貴重なリソースのため、 Symbol は攻撃者が未承認トランザクションでキャッシュを満たすことを防ぎながら、正当な利用者が新しい未承認トランザクションを正常に送信できるようにするためのスパムスロットルを実装しています。
スパムスロットルはアカウントのインポータンススコアを比較して、アカウントごとのキャッシュの配分を公平に計算することにより、アカウントが送信できる未承認トランザクションの量を制御します。アカウントがキャッシュの公平な配分を超過しており、ノードキャッシュに未承認トランザクションが1つのブロックに含めることができる量よりも多い場合、トランザクションは拒否されます。これにより、悪意のある利用者がノードにスパムトランザクションの送信を効果的にブロックし、他のユーザーがノードを通常通り使用できるようにします。
お探しのものは見つかりましたか? フィードバックをください。