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.
Por defecto, las tarifas se pagan en la moneda subyacente de la red Bitxor.
Tipo de red |
Nombre del token |
---|---|
PRIVADA |
|
MAINNET, TESTNET |
|
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.
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.
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:
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);
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