手数料

トランザクション のアナウンスには関連コストがあります。コストはネットワークを安全に保ち、インフラを運用している ハーベスタ へのインセンティブの提供として必須です。

ネットワーク通貨

デフォルトでは、手数料は Symbol ネットワーク基軸通貨で支払われます。

ネットワークタイプごとのデフォルトネットワーク通貨

ネットワークタイプ

モザイク名

PRIVATE

cat.currency

MAINNET, TESTNET

symbol.xym

プライベートチェーンでは、ニーズに合わせるために手数料を無くしたり、他の モザイク を使用するために ネットワークの設定を編集 できます。

トランザクション手数料

トランザクションに関連する手数料は、主としてトランザクションの (バイト) サイズによって異なります。トランザクションを送信するアカウントから差し引かれる実効手数料はトランザクションのサイズとブロックをハーベストするノードによって設定される手数料乗数の積として計算されます。

\[effectiveFee = transaction::size * block::feeMultiplier\]

ノード所有者は 手数料乗数 を 0 を含むすべての正の値に設定できます。ノードが新しいブロックをハーベストするとき fee_multiplierブロックヘッダー に格納され、含まれるトランザクションすべてに対して支払われた有効な手数料を決定します。

トランザクションを送信する前に、トランザクション定義の中で max_fee を指定する必要があり、これはアカウントがこのトランザクションに費やせる最大手数料を示しています。

effective_feemax_fee 以下の場合、ハーベスタはトランザクションをブロックに含める選択ができます。ハーベスティングノードはそれらの トランザクションインクルード戦略 を設定できます:

  • Prefer-oldest:高いトランザクションスループットが要求されるネットワークに適しています。最も古いトランザクションを最初に含めます。

  • Minimize-fees: 慈善事業なノード。他のノードが含めたくない最初のトランザクションを含めます。

  • Maximize-fees: パブリックネットワークで最も一般的です。より高い手数料の最初のトランザクションを含みます。

max_fee を不必要に高く設定せずにトランザクションが確実に含まれるようにするためには、トランザクション送信者は REST ゲートウェイ に直近 60 ブロック (maxDifficultyBlocks) のネットワークの乗数の中央値、平均値、最高値、または最低値を問い合わせることができます。

注釈

この情報を取得する簡単な方法は、次をブラウザで確認します:

NODE_URL /network/fees/transaction

たとえば、送信者はトランザクションの max_fee を次のように設定できます:

\[maxFee = transaction::size ∗ network::medianFeeMultiplier\]
  const publicAccount1 = Account.generateNewAccount(NetworkType.TEST_NET)
    .publicAccount;
  const publicAccount2 = Account.generateNewAccount(NetworkType.TEST_NET)
    .publicAccount;
  // Get median fee multiplier
  const nodeUrl = 'NODE_URL';
  const repositoryHttp = new RepositoryFactoryHttp(nodeUrl);
  const networkHttp = repositoryHttp.createNetworkRepository();
  const medianFeeMultiplier = (
    await networkHttp.getTransactionFees().toPromise()
  ).medianFeeMultiplier;

  // Define transaction and set max fee
  const rawAddress = 'TB6Q5E-YACWBP-CXKGIL-I6XWCH-DRFLTB-KUK34I-YJQ';
  const recipientAddress = Address.createFromRawAddress(rawAddress);
  const transferTransaction = TransferTransaction.create(
    Deadline.create(epochAdjustment),
    recipientAddress,
    [],
    PlainMessage.create('This is a test message'),
    NetworkType.TEST_NET,
  ).setMaxFee(medianFeeMultiplier);
  const publicAccount1 = symbol_sdk_1.Account.generateNewAccount(
    symbol_sdk_1.NetworkType.TEST_NET,
  ).publicAccount;
  const publicAccount2 = symbol_sdk_1.Account.generateNewAccount(
    symbol_sdk_1.NetworkType.TEST_NET,
  ).publicAccount;
  // Get median fee multiplier
  const nodeUrl = 'NODE_URL';
  const repositoryHttp = new symbol_sdk_1.RepositoryFactoryHttp(nodeUrl);
  const networkHttp = repositoryHttp.createNetworkRepository();
  const medianFeeMultiplier = (
    await networkHttp.getTransactionFees().toPromise()
  ).medianFeeMultiplier;
  // Define transaction and set max fee
  const rawAddress = 'TB6Q5E-YACWBP-CXKGIL-I6XWCH-DRFLTB-KUK34I-YJQ';
  const recipientAddress = symbol_sdk_1.Address.createFromRawAddress(
    rawAddress,
  );
  const transferTransaction = symbol_sdk_1.TransferTransaction.create(
    symbol_sdk_1.Deadline.create(epochAdjustment),
    recipientAddress,
    [],
    symbol_sdk_1.PlainMessage.create('This is a test message'),
    symbol_sdk_1.NetworkType.TEST_NET,
  ).setMaxFee(medianFeeMultiplier);

注釈

設定した乗数が少なすぎる場合、トランザクションが承認されることを保証できません。承認される可能性を高めるためには、トランザクション送信者が medianNetworkFeeMultiplierhighestFeeMultiplier の間で任意の値を使用してください。

アグリゲートボンデッドトランザクション のサイズを決定するには、トランザクションに署名する必要がある参加者アカウントの数を事前に知っておく必要があります。

  // Define transaction and set max fee
  const aggregateTransaction = AggregateTransaction.createBonded(
    Deadline.create(epochAdjustment),
    [
      transferTransaction.toAggregate(publicAccount1),
      transferTransaction.toAggregate(publicAccount2),
    ],
    NetworkType.TEST_NET,
    [],
  ).setMaxFeeForAggregate(medianFeeMultiplier, 1);
  // Define transaction and set max fee
  const aggregateTransaction = symbol_sdk_1.AggregateTransaction.createBonded(
    symbol_sdk_1.Deadline.create(epochAdjustment),
    [
      transferTransaction.toAggregate(publicAccount1),
      transferTransaction.toAggregate(publicAccount2),
    ],
    symbol_sdk_1.NetworkType.TEST_NET,
    [],
  ).setMaxFeeForAggregate(medianFeeMultiplier, 1);

動的手数料乗数

ブロックチェーンに追加された各ブロックには、それを収集したノードによって設定された異なる手数料乗数があります。また、ネットワークは 動的手数料乗数 を、最終の maxDifficultyBlocks ハーベストブロックの 中央値 (デフォルトでは 60) として定義します。

この値は、ノードとトランザクション作成者が、最新ブロックで合意した最も一般的な手数料乗数に近似して ネームスペース および モザイク のレンタル手数料の計算に使用されます。

ブロックにトランザクションが含んでいない場合、乗数が 0 になるのを避けるために defaultDynamicFeeMultiplier (デフォルトでは 100) の値を使用します。

注釈

現在の動的手数料乗数値は REST ゲートウェイ が返却する medianFeeMultiplier プロパティにあります:

NODE_URL /network/fees/transaction