¿Cómo enviar una transacción?
La forma más fácil de enviar una transacción es usar una billetera como Conflux Portal y hacer clic en “send” para establecer directamente la cantidad. Si eres un developer, puedes usar Conflux SDK (JS, Java, Go) para construir la transacción pro ti mismo y luego enviarla a la blockchain a través del nodo RPC.
¿Cuáles son las tarifas de gas y almacenamiento al enviar una transacción?
La tarifa del gas es una tarifa requerida para la ejecución de la transacción. Los mineros deben cobrar una cierta tarifa por empaquetar y ejecutar la transacción. La forma de calcular la tarifa del gas es
Tarifa de Gas = Precio de Gas * Gas usado
.
Además, la ejecución de la transacción puede ocupar un nuevo espacio de almacenamiento. Aunque no necesitas pagar por la ocupación de este espacio, se debe bloquear una cierta cantidad de CFX para el uso de este almacenamiento. A medida que se libera el almacenamiento, se devolverá el CFX bloqueado.
La tarifa de almacenamiento se refiere a la cantidad de CFX bloqueados para el almacenamiento utilizado, y se requiere 1 CFX por 1024 bytes utilizados.
Qué información (parámetros) se debe especificar cuando se usa el SDK para enviar transacciones?
Si realizas transferencias de CFX simples usando el JS-SDK, solo necesitas especificar from
(transferencia desde qué cuenta), to
(enviar a qué cuenta), value
(cantidad a enviar, unidad: Drip).
Además del valor from, to, ¿qué información contiene una TX?
-
from
: la dirección del remitente de la transacción. No puede estar vacío y solo puede ser una cuenta de propiedad externa, no la dirección de un smart contract. -
to
: el destinatario de la transacción, que puede estar vacío. Si está vacío, la información dedata
se utilizará para crear un smart contract. La dirección del smart contract recién creado se puede encontrar en el resultado de la transacción. -
value
: monto de la transacción (unidad: Drip). -
nonce
: el número de serie de la ejecución de la transacción. Por lo general, el conteo del número comienza desde 0 y aumenta en 1 cuando se envía cada transacción. La ejecución de la transacción también se procesará en un orden creciente sin saltos. Puedes obtener el siguiente nonce de una dirección usandocfx_getNextNonce
. -
gas
: el límite superior de la cantidad de tarifa de gas que se puede consumir para la ejecución de la transacción. -
gasPrice
: el precio del gas de transacción (unidad: Drip). -
storageLimit
: el límite máximo de almacenamiento que se puede pagar por la ejecución de la transacción. -
chainId
: el ID de la blockchain. Se utiliza para distinguir transacciones entre diferentes blockchains. Mainnet es1029
y testnet es1
. -
epochHeight
: se usa para especificar el rango de época para ejecutar la transacción (epochHeight, epochHeight + 10000). Las transacciones más allá de este rango no se empaquetarán. -
data
: datos de transacciones, que pueden ser comentarios, creación de ByteCode de un smart contract o datos de interacción de un smart contract.
¿Cómo conseguir el nonce correcto?
A través de cfx_getNextNonce
RPC, se puede obtener el siguiente nonce disponible de una cuenta. El nonce usado no se puede volver a usar. La transacción no se empaquetará si se usa un nonce con un valor mayor que el nonce actual.
¿Cuándo aumentará el nonce en 1? ¿El nonce aumentará en 1 si la transacción falla? ¿Por qué no ha cambiado el nonce cuando se envió la transacción?
El nonce aumenta una vez que se ejecuta la transacción, ya sea que tenga éxito o fracase.
Después de que se envía la transacción, el nonce consultado a través de cfx_getNextNonce
permanece sin cambios porque la transacción no se ha ejecutado. En este momento, la transacción puede estar en el grupo de transacciones y no ha sido empaquetada, o puede haber sido empaquetada y estar en estado diferido, esperando ser ejecutada.
¿Cómo calcular la tarifa de gas realmente utilizada en la transacción?
En ConfluxScan, los usuarios pueden ver el uso de gas, el precio del gas, la tarifa del gas y otra información relevante de una transacción, que se obtiene a través de cfx_getTransactionReceipt
: gasFee = gasCharged * gasPrice
, pero el gasCharged
no es necesariamente igual a gasUsed
.
Hay una regla en Conflux: el gas se usa para establecer el límite superior de gas que se puede usar en una transacción. Debe ser mayor que el valor real de gas utilizado (gasUsed
).
Para la parte sobrante, como máximo, solo se reembolsará 1/4: si la parte sobrante es menos de 1/4 del límite de gas, se reembolsará todo, pero si es mayor que 1/4, solo se reembolsará 1/4 ser devueltos. Por lo tanto, intenta dar un valor de gas preciso al enviar una transacción.
¿Cómo liberar el depósito de almacenamiento?
Cuando se libera el almacenamiento, el depósito se reembolsa automáticamente. Por ejemplo, si el saldo del token ERC20 cambia de distinto de cero a 0, se reembolsará el depósito. Si se destruye un smart contract, también se reembolsará el depósito generado por la interacción entre todas las direcciones y el contrato.
¿Por qué no ha cambiado el saldo después de interactuar con un smart contract y se paga la tarifa de gas por esta transacción?
La red Conflux tiene un mecanismo de patrocinio. Si un contrato tiene un patrocinador, el patrocinador pagará las tarifas de gas y almacenamiento para las interacciones de este contrato.
Si deseas enviar transacciones en lotes, ¿cómo administrar el nonce?
Al enviar transacciones en lotes, debes administrar manualmente el nonce. Cada vez que envía una transacción, el nonce se incrementa manualmente en uno.
En este caso, para una transacción fallida de la cual no se usa nonce, debes ajustar manualmente los parámetros de la transacción para reenviarla.
Por lo tanto, debes mantener todos los hash de las transacciones y monitorear el estado de las transacciones cuando se envían por lotes.
¿Cómo saber la cantidad de gas y almacenamiento utilizados por una transacción?
El RPC cfx_estimateGasAndCollateral
se puede usar para estimar la cantidad de gas y almacenamiento que una transacción necesita usar, pero la estimación no es 100% precisa.
Por lo tanto, el gas devuelto se puede ajustar manualmente, como multiplicar por 1.3
.
¿Cómo sé que una transacción se ha ejecutado correctamente?
Verifica el campo de status
de la transacción o el campo resultStatus
del recibo para determinar si la transacción es exitosa, 0 significa éxito y 1 significa falla.
¿Cómo determinar si una transacción es segura y está confirmada?
Si el epochNumber
de la época a la que pertenece la transacción es menor que el epochNumber
actualmente confirmado, se considera seguro.
También puedes obtener la confirmaciónRisk
del bloque al que pertenece la transacción a través de cfx_getConfirmationRiskByHash
RPC.
Si el valor obtenido es menor que 1e-8, se considera seguro.
¿Qué es un recibo y qué información contiene?
Un recibo es la información del recibo de una transacción. A través de un recibo, puedes conocer algunos resultados de la ejecución de la transacción, como si la transacción es exitosa, si se crea un smart contract, uso de tarifa de gas, eventLog generado por la ejecución de una transacción, etc.
¿Cómo cambia el estado de la transacción?
Una vez que la transacción se envía a través de RPC, pasará por varios estados: Waiting for packaging -> packaging -> execution -> confirmation.
Hay varias razones por las que falla una transacción:
- Reutiliza un nonce antiguo.
- Se usó un nuevo nonce, pero hay una transacción con el mismo nonce en el grupo de transacciones.
¿Por qué una transacción sigue esperando a ser empaquetada?
Si una transacción no se ha empaquetado durante mucho tiempo, es probable que el valor de nonce esté configurado incorrectamente o que el saldo no sea suficiente.
¿Por qué fallaría la ejecución de una transacción?
Los errores de ejecución de transacciones se dividen a grandes rasgos en las siguientes situaciones:
- VM revertido, Razón proporcionada por el contrato: ‘xxxxx’: la ejecución del contrato falló y el contrato devolvió información detallada.
- VmError (ExceedStorageLimit): el límite de almacenamiento especificado no es suficiente.
- NotEnoughCash {required: 22625000000010862646, got: 22062499999972687418, actual_gas_cost: 10862646, max_storage_limit_cost: 22625000000000000000}: saldo insuficiente.
- VmError (OutOfGas): la tarifa de gas especificada no es suficiente.
- VmError (BadInstruction {instrucción: 238}): la implementación del contrato falló.
- VM revirtió: la ejecución del contrato falló, pero el contrato no devolvió información detallada.
¿Cuáles son los errores comunes al enviar transacciones?
- código = -32015, mensaje = La estimación no es precisa: la transacción se revierte. Salida de ejecución, datos = 0xxxx