1 ブロックにつき 1 アカウント 1 トランザクション、そしてバッチ
バージョン 0.5.8 以降、すべてのブロックに単純な有効性のルールが適用されます。各アカウントからのトランザクションは最大 1 つしか運べません。一度に多くのことを行うには、アカウントはバッチ、つまり同じ種類の複数のアクションを運ぶ 1 つのトランザクションを使います。この 2 つのルールを合わせることで、ノードがブロックの前に行う確認を正確に保ちつつ、忙しいアカウントでも 1 つのブロックの中で多くの人に支払うことができます。
ルール
ここでいうアカウントとは署名したアドレスです。同じアドレスからの 2 つのトランザクションを運ぶブロックはすべてのノードで無効なので、誠実な生成者がそれを作ることは決してありません。生成者は各アカウントの取り込み可能なトランザクションのうち最も古いものを先に取り、次のものは 15 秒後の後のブロックに回します。
アカウントは、続けて複数のトランザクションを送信することもできます。ノードのプールは送信者ごとに最大 50 の保留中のトランザクションを保持し(各ノードのローカルなポリシーです)、生成者はそれらを古いものから順に 1 ブロックに 1 つずつ取り込みます。
この定義から 2 つの細則が導かれます。
- アカウントグループの各メンバーは、1 つの残高を共有していても、それぞれ自分のアドレスで署名するため、それぞれ自分の枠を持ちます。
- マルチシグネチャ アカウントの内部トランザクションが実行されるときは、マルチシグネチャアカウントの分として数えられます。
役立つ理由
ノードはトランザクションを確認済みの状態に照らして 2 回確認します。プールに受け入れるときと、ブロックを組み立てるときです。1 アカウント 1 トランザクションであれば、同じアカウントからの他のトランザクションがブロックの中でその状態を変えることはありません。したがって、送信者自身の残高や送信者自身のオブジェクトなど、送信者だけが制御するものすべてについて、確認は正確なままです。
異なるアカウントの間では、先に適用されたトランザクションが勝ちます。2 つのアカウントが同じスワップオファーを受諾しようとすると、最初のものがそれを得て、2 つ目は無意味になります。それは手数料を支払う以外は何もしない有料の空操作です(トランザクション を参照)。誠実な生成者はそのようなトランザクションを除外します。オブジェクトごとの別のルールはありません。
バッチ
バッチとは、同じ種類の複数のアクションを運ぶ 1 つのトランザクションです。3 つの種類があります。
- ZBC の支払い(1 つのバッチに最大 25 件)
- トークンの転送(最大 32 件。どのトークンでもよく、手数料は ZBC で支払います)
- ストレージ証明(最大 1,000 件。ノードごと、ストレージエポックごとに 1 つのバッチ。分散ストレージプール を参照)
バッチは全部実行されるか、まったく実行されないかのどちらかです。すべてのアクションが最初に確認されるため、その中のすべての支払いが行われるか、1 つも行われないかのどちらかで、バッチ全体は一度だけ署名されます。
バッチの費用
複数のアクションは、複数のトランザクションと同じだけ支払います。バッチの最低手数料は、各アクションが別々のトランザクションとして支払う最低手数料の合計です。アクションごとの基本手数料に、各アクションのバイト料金を加えたものです(手数料 を参照)。ただし、バッチのメッセージの料金は 1 回だけ課されます。メッセージのない 3 つの支払いは、1 つのバッチでも 3 つの単独のトランザクションでも同じ費用になります。ストレージ証明のバッチは何も支払いません。各ストレージ証明は手数料のかからない義務なので、合計はゼロになります。
バッチが節約するのは、主として手数料ではなくネットワークの仕事です。検証する署名は 3 つではなく 1 つで、ブロックの枠も 1 つで済みます。そしてバッチは、1 つのアカウントが同じブロックで多くの受取人に支払うための方法です。