De hecho, hay más de una discusión sobre cuáles son las llamadas que puede hacer de manera segura en el constructor.
Alguien piensa "evitar todas las llamadas externas", otros dicen "evitar usar 'esto' o dirección (esto)" en el constructor, otros están preocupados por usar 'esto' después de 'nuevo', otros quieren introducir advertencias y errores para el uso 'esto' y así sucesivamente.
En GitHub/Ethereum existen páginas y páginas sobre esto, pero faltan conclusiones verdaderas.
¿Cuál es la práctica recomendada en Solidity? ¿Existe alguna lista/hoja de trucos sobre eso?
EDITAR: se agregaron algunos ejemplos de tales discusiones según la sugerencia de Smarx
https://github.com/ethereum/solidity/issues/583
https://github.com/ethereum/solidity/pull/3875
https://github.com/ethereum/solidity/issues/3843
https://github.com/ethereum/solidity/issues/3861
https://github.com/ethereum/solidity/pull/1646#issuecomment-305026348
en una solidez constructor
:
this
es la dirección del contrato que se está construyendo. (incluso después de usar new
o llamar a una función externa de otro contrato)
msg.sender
es la dirección de quien o lo que sea que esté desplegando el contrato. (cuenta de usuario u otro contrato usando new
)
No puede llamar a funciones externas en un contrato que se está construyendo (por ejemplo, this.foo();
dentro de la función constructora se revertirá la transacción de creación del contrato)
Puede llamar funciones internas del contrato que se está construyendo. Dentro de esa función interna, this
y msg.sender
tendrá los mismos valores que tenían en el constructor
.
En un constructor
, puede implementar de forma segura nuevos contratos o llamar a funciones externas en otros contratos que ya se han construido.
Parte de la confusión en las discusiones que vinculó se basa en this.foo();
que la función constructora falla silenciosamente. Este ya no es el caso.
()
un modificador con 0 argumentos cuando lo usa en constructor
o en un function
. Sin embargo, puedes hacerlo si quieres. ahora es opcional()
llamada a un constructor base sin argumentos también es opcional, al igual que los modificadores. El constructor base se ejecutará de la misma forma en ambos casos, con o sin el()
usuario19510
parque rick