Gas para transacciones internas (y transacciones en general)

Estoy tratando de diseñar un SmartContract para un Token y tengo algunos problemas con los cálculos de gas. Cuando un usuario envía un token a alguien, me gustaría que hubiera una tarifa. Donde se pone confuso para mí es el gas. Leí que se debe pagar un mínimo de 21k en gasolina para todas las transacciones, pero no está claro qué se incluye en esto. Leí que almacenar datos (SSTORE) cuesta 20 000 en gasolina la primera vez, 5 000 en gasolina para actualizaciones y 5 000 para restablecer (poner a cero) + obtienes un reembolso de 15 000 en gasolina. Según tengo entendido, cuando envía tokens, esto solo actualiza el saldo en dos billeteras (¿usando SSTORE?), Por lo tanto, debería ser uno de los siguientes:

  1. El usuario tiene 10 tokens, envía 5 a una nueva billetera: ¿5k + 20k = 25k en gasolina? (más de 21k)
  2. El usuario tiene 10 tokens, envía 5 a una billetera existente: ¿5k + 5k = 10k en gasolina? (¿pero dado que se usan menos de 21k, entonces se usan 21k?)
  3. El usuario tiene 10 tokens, envía 10 a una billetera existente: ¿5k + 5k = 10k en gasolina? (¿pero como se usan menos de 21k, entonces se usan 21k?), ¿cuándo tx hizo 15k en gasolina reembolsado? (¿Este reembolso ocurre debido al límite de 21k?)
  4. El usuario tiene 10 tokens, envía 10 a una nueva billetera: 5k + 20k = 25k en gasolina (más de 21k), cuando tx hizo 15k en gasolina reembolsados? (¿Este reembolso ocurre debido al límite de 21k?)

así que no estoy seguro de entender de dónde viene el límite de 21k/cómo se calcula. Es importante que entienda lo anterior, porque determinará cómo escribo mi código.

No he podido encontrar esta información en ninguna parte, alguien me dijo que las transacciones internas cuestan menos de 21k, alguien más me dijo que todas las transacciones son operaciones SSTORE y 21k es solo un límite inferior al costo de una transacción, por lo que si tuviera un usuario que envía algunos tokens a una billetera existente (Vanilla ERC-20 SmartContract) sería 5k + 5k + 11k (tarifa de red) = 21k pero si tuviera algunas otras operaciones (incluido el envío de transacciones internas) haciendo que el gas supere los 21k tendría 5k + 5k + other_ops >= 21k

El algoritmo que estoy tratando de escribir es:

  1. UserA (remitente) envía un token a UserB (receptor)
  2. SmartContract calcula una tarifa
  3. El monto de la tarifa se transfiere a una billetera de tarifas
  4. UserB recibe el monto enviado menos las tarifas

Hay marcas de tiempo involucradas en los cálculos, por lo tanto, dividí esto en el costo del gas (excluyendo todos los demás costos de cálculo):

  1. actualizar la variable de marca de tiempo UserA (SSTORE): 5k de gas (o 20k si es la primera vez)
  2. actualizar la variable de marca de tiempo UserB (SSTORE): 5k de gas (o 20k si es la primera vez)
  3. enviar la tarifa a la billetera de tarifas (¿actualizar el saldo de la billetera de tarifas usando SSTORE internamente?): 5k de gas
  4. actualizar el saldo de UserA desde el envío de tokens a la billetera UserB & Fee (¿usando SSTORE internamente?): 5k gas
  5. actualice el saldo del UsuarioB al recibir tokens enviados por el UsuarioA (¿usando SSTORE internamente?): 5k de gasolina (o 20k si es la primera vez)

Total : 25k - 70k gasolina

¿Es esto correcto? ¿O el paso 3 costará 21k en gasolina y los pasos 4 + 5 (juntos) también costarán 21k en gasolina, así:

  1. actualizar la variable de marca de tiempo UserA (SSTORE): 5k de gas (o 20k si es la primera vez)
  2. actualizar la variable de marca de tiempo UserB (SSTORE): 5k de gas (o 20k si es la primera vez)
  3. enviar tarifa a tarifa billetera: 21k gas
  4. costo de tx de enviar tokens del UsuarioA al UsuarioB (cantidad original - tarifas): 21k gas

Total : 52k - 82k gasolina

¡Gracias! Charla

El límite de 'gas mínimo de 21k' es para una transacción enviada desde fuera de la cadena (es decir, utilizando una cuenta de propiedad externa).
Gracias, ¿entonces en el SmartContract las transacciones costarán las dos operaciones de SSTORE?
Su pregunta es demasiado larga y generalmente ilegible. Trate de minimizarlo y concéntrese en un solo tema (es decir, haga una sola pregunta). Ni siquiera entiendo de qué "dos operaciones SSTORE" estás hablando. ¿Tengo que buscarlo en toda su pregunta (muy larga)?
Por cierto, ¿de dónde sacaste el gas de 5k en "El usuario tiene 10 tokens, envía 5 a una nueva billetera: 5k + 20k = 25k en gas?" ¿¿¿de???
Lo obtuve del Ethereum Yellow Paper ( ethereum.github.io/yellowpaper/paper.pdf ). Supongo que, dado que las transacciones son realmente dos operaciones de escritura de memoria global, son operaciones SSTORE. Una actualización (escribir en un var global distinto de cero) cuesta 5k, 20k para escribir (escribir en un var global de valor cero), 5k para eliminar (establecer en cero) y obtiene un reembolso de 15k.
Entonces, en el contrato de token, normalmente cambia al menos dos variables en esa única transacción: el saldo del remitente y el saldo del destinatario. Asumiendo que el primero es distinto de cero y el segundo es cero, eso se reduce a 25k. Pero, por supuesto, dependiendo de la implementación interna del contrato, pueden cambiarse más variables de estado. Y además de todo eso, normalmente se emite al menos un evento, así como algunas otras operaciones, aunque estas últimas generan un costo de gas menor.

Respuestas (1)

No estoy seguro de entender de dónde viene el límite de 21k/cómo se calcula

21K gasno es un límite de gas, sino el costo mínimo de gas para una transacción que se envía desde una cuenta de propiedad externa (es decir, fuera de la cadena).

Esta restricción no se aplica a una transacción que se envía desde una cuenta de contrato inteligente (es decir, desde la cadena).

Ok, entonces mi entendimiento es correcto cuando digo:1. update timestamp variable UserA (SSTORE) : 5k gas (or 20k if 1st time) 2. update timestamp variable UserB (SSTORE) : 5k gas (or 20k if 1st time) 3. send fee to fee wallet (update fee wallet balance using SSTORE internally?) : 5k gas 4. update UserA balance from sending tokens to UserB & Fee wallet (using SSTORE internally?): 5k gas 5. update UserB balance from receiving tokens sent by UserA (using SSTORE internally?): 5k gas (or 20k if 1st time) Total : 25k - 70k gas