Estoy estudiando el código fuente del contrato inteligente de Ethereum popular y hay algo que no entiendo en el estándar ERC20.
Tomemos este ejemplo:
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol
Aquí hay una parte del código fuente de solidez de este contrato inteligente:
mapping (address => uint256) private _balances;
uint256 private _totalSupply;
Como puede ver, el suministro total se almacena en una variable separada. Esta oferta total es la suma de todos los saldos.
Lo que aprendí sobre la optimización de Solidity es que debemos dar prioridad al almacenamiento en lugar del cálculo.
Si tuviera que escribir un contrato ERC20, escribiría una función de vista que suma _saldos para proporcionar el suministro total. Por qué ? Una función de visualización puede sumar saldos de gas gratis porque no escribe nada en la cadena de bloques. Si tenemos una variable _totalSupply, tenemos que actualizarla cada vez que cambia un saldo. Así que costará algo de gasolina escribir esta variable.
Mi pregunta es: ¿Por qué todos ponen una variable _totalSupply en los contratos ERC20, en lugar de una función de vista que suma los saldos?
Gracias
Si tenemos una variable _totalSupply, tenemos que actualizarla cada vez que cambia un saldo. Así que costará algo de gasolina escribir esta variable.
Eso no es correcto. Por ejemplo, si Bob transfiere x tokens a Alice, se actualizarán sus saldos pero no el suministro total. El mismo principio se aplica al dinero fiduciario, una transferencia bancaria o en efectivo no tiene impacto en el suministro total. _totalSupply
sin embargo, se actualiza para cada uno mint
y burn
cuáles son, respectivamente, la creación y destrucción de tokens. El estándar ERC20 no especifica estas funciones ya que el mecanismo de suministro es muy específico para cada token. Por lo tanto, su implementación es gratuita.
¿Por qué todos ponen una variable _totalSupply en los contratos ERC20, en lugar de una función de vista que suma saldos?
¿ Cómo implementas esta sum
función? Para esto, necesitaría rastrear cada dirección que tenga tokens, lo cual no es una solución óptima. El _totalSupply
enfoque es mucho más fácil ya que el suministro total se rastrea mediante el uso de los métodos mint
y burn
.
Eso no es correcto. No podemos iterar la variable de mapeo. Entonces no podemos calcular la suma de _saldos.
bob5421
clemente
_balances
eso no es posible. No puede hacer un bucle en una asignación, ya que es un sistema clave/valor con una cantidad infinita de claves. Por ejemplo, existe una dirección que no contiene tokens en el mapeo y devolverá cero como valor.clemente
transfer
función.clemente