Tarifas

Anunciar transacciones tiene un costo asociado. Este costo es necesario para proporcionar un incentivo a los cosechadores que aseguran la red y ejecutan la infraestructura.

Moneda de la red

Por defecto, las tarifas se pagan en la moneda subyacente de la red Bitxor.

Moneda de red por defecto según el tipo de red

Tipo de red

Nombre del token

PRIVADA

currencytoken

MAINNET, TESTNET

bitxor

Las cadenas privadas pueden editar la configuración de la red para eliminar las tarifas o utilizar otro token que se adapte mejor a sus necesidades.

Tarifa de transacción

La tarifa asociada a una transacción depende principalmente del tamaño (en bytes) de la transacción. La tarifa efectiva deducida de la cuenta que envía la transacción se calcula como el producto del tamaño de la transacción y un multiplicador de tarifa establecido por el nodo que cosecha el bloque.

\[tarifaEfectiva = tamañoTransacción * multiplicadorDeTarifaBloque\]

El propietario de un nodo puede configurar el multiplicador de tarifa con valores positivos, incluido cero. El multiplicador_de_tarifa se almacena en el encabezado del bloque cuando el nodo cosecha un nuevo bloque, determinando cuál fue la tarifa efectiva pagada por cada transacción incluida.

Antes de anunciar la transacción, el remitente debe especificar durante la definición de la transacción una max_fee, que indica la tarifa máxima que la cuenta permite gastar para esta transacción.

Si la tarifa_efectiva es menor o igual a la max_fee, un cosechador podría optar por incluir la transacción en el bloque. Los nodos de cosecha pueden configurar su estrategia de inclusión de transacciones:

  • Preferir el más antiguo: Preferido para redes con altos requisitos de volumen de transacciones. Incluir primero las transacciones más antiguas.

  • Minimizar tarifas: Nodos filantrópicos. Incluir primero las transacciones que otros nodos no quieren incluir.

  • Maximizar tarifas: Lo más común en redes públicas. Incluir primero las transacciones con tarifas más altas.

Para asegurarse de que la transacción se incluya sin establecer una max_fee innecesariamente alta, el remitente de la transacción puede solicitar a la REST Gateway el multiplicador mediano, promedio, más alto o más bajo de la red durante los últimos 60 bloques (maxDifficultyBlocks).

Note

Una forma rápida de obtener esta información es apuntar tu navegador web a:

NODE_URL /network/fees/transaction

Por ejemplo, el remitente podría establecer la max_fee de la transacción de la siguiente manera:

\[maxFee = tamañoTransacción �?multiplicadorTarifaMedianoRed\]
  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 = 'BXRQ5E-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 = bitxor_sdk_1.Account.generateNewAccount(
        bitxor_sdk_1.NetworkType.TEST_NET,
    ).publicAccount;
    const publicAccount2 = bitxor_sdk_1.Account.generateNewAccount(
        bitxor_sdk_1.NetworkType.TEST_NET,
    ).publicAccount;
    // Get median fee multiplier
    const nodeUrl = 'NODE_URL';
    const repositoryHttp = new bitxor_sdk_1.RepositoryFactoryHttp(nodeUrl);
    const networkHttp = repositoryHttp.createNetworkRepository();
    const medianFeeMultiplier = (
        await networkHttp.getTransactionFees().toPromise()
    ).medianFeeMultiplier;
    // Define transaction and set max fee
    const rawAddress = 'BXRQ5E-YACWBP-CXKGIL-I6XWCH-DRFLTB-KUK34I-YJQ';
    const recipientAddress = bitxor_sdk_1.Address.createFromRawAddress(
        rawAddress,
    );
    const transferTransaction = bitxor_sdk_1.TransferTransaction.create(
        bitxor_sdk_1.Deadline.create(epochAdjustment),
        recipientAddress, [],
        bitxor_sdk_1.PlainMessage.create('This is a test message'),
        bitxor_sdk_1.NetworkType.TEST_NET,
    ).setMaxFee(medianFeeMultiplier);

Note

No se garantiza que la transacción se confirme si el multiplicador utilizado es demasiado bajo. Para tener mejores posibilidades, el remitente de la transacción podría optar por usar cualquier valor entre medianNetworkFeeMultiplier y highestFeeMultiplier en su lugar.

Para determinar el tamaño de una transacción agregada con garantía, es necesario conocer de antemano la cantidad de cuentas participantes que deberán cosignar la transacción.

  // 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 = bitxor_sdk_1.AggregateTransaction.createBonded(
        bitxor_sdk_1.Deadline.create(epochAdjustment), [
            transferTransaction.toAggregate(publicAccount1),
            transferTransaction.toAggregate(publicAccount2),
        ],
        bitxor_sdk_1.NetworkType.TEST_NET, [],
    ).setMaxFeeForAggregate(medianFeeMultiplier, 1);

Multiplicador dinámico de tarifa

Cada bloque agregado a la cadena de bloques tiene un multiplicador de tarifa diferente, establecido por el nodo que lo cosechó. La red también define el multiplicador dinámico de tarifa como la mediana de los últimos maxDifficultyBlocks bloques cosechados (60 por defecto).

Este valor aproxima el multiplicador de tarifa más común al que los nodos y creadores de transacciones han llegado en los bloques más recientes, y se utiliza en el cálculo de las tarifas de alquiler de namespace y token.

Si un bloque no incluyó ninguna transacción, se utiliza un valor de defaultDynamicFeeMultiplier (100 por defecto) para evitar multiplicadores iguales a 0.

Note

El valor actual del multiplicador dinámico de tarifa se puede encontrar en la propiedad medianFeeMultiplier devuelta por la REST Gateway:

NODE_URL /network/fees/transaction