Estoy viendo la implementación de la billetera multisig aquí y veo el uso de sha3( msg.data
, block.number
) como identificador.
¿Qué hay exactamente dentro msg.data
y por qué es lo suficientemente único como para ser utilizado para hacer el identificador? ¿No contiene solo información sobre cómo se llamó el contrato? ¿Significa que será lo mismo si llamo al contrato con los mismos parámetros?
msg.data
suele ser información codificada en ABI que indica al contrato la función y los parámetros a invocar.
Usando herramientas estándar, msg.data
será lo mismo si el contrato se llama con los mismos parámetros. Sin embargo, mezclarlo con el block.number
como en sha3(msg.data, block.number)
producirá un resultado completamente diferente para cada bloque.
Nota: msg.data
es maleable. Por ejemplo, se pueden agregar ceros finales adicionales msg.data
sin cambiar la función que se invocará en un contrato. El uso de herramientas estándar (como web3.js) no creará ceros finales adicionales, pero debe examinar su caso de uso cuando lo use msg.data
como identificador, para asegurarse de que la maleabilidad no cause un problema o una vulnerabilidad.
(En el caso específico de la billetera en la pregunta, la maleabilidad de msg.data
un propietario solo parece causar confusión para ellos mismos o para otros propietarios).
msg.data
es simplemente el data
campo de la transacción.
Del papel amarillo:
...una transacción de llamada de mensaje contiene:
datos: una matriz de bytes de tamaño ilimitado que especifica los datos de entrada de la llamada de mensaje, formalmente T d .
Este campo de datos puede contener cualquier cosa que el remitente desee, pero como dijo @eth, generalmente contiene la firma de la función (un identificador de 4 bytes que le dice a Solidity qué función llamar) y argumentos. Por lo general, será el mismo cuando los argumentos sean los mismos, pero no confíe en esto, ya que los datos se pueden rellenar al final con bytes cero adicionales, que se eliminarán cuando Solidity decodifique los argumentos, pero cambiará el msg.data
.
Matthieu
plsnoban
msg.data
también contiene el nonce de la cuenta o que este nonce se usa para crear el identificador? Los únicos parámetros utilizados por el identificador parecen sermsg.data
yblock.number
.ética
msg.data
. Creo que @Matthieu interpretó el identificador como "el hash de transacción", en lugar del identificador de "hash de operación" de la billetera multisig.tjaden hess
msg.data
sin cambiar los valores reales de los parámetros.Yogesh - EtherAuthority.io
ética
tjaden hess
ética