Transacción de contrato: El gas estimado no se ajusta al gas utilizado

Después de descubrir cómo estimar las tarifas de tx del contrato gracias a ¿ Cómo estimar el costo de llamar a un método de contrato inteligente? y sintaxis para llamar a los métodos de cambio de estado del contrato Traté de usar todo ese conocimiento e implementar mi propia transacción de contrato con la estimación de gas anterior, pero difieren bastante. El gas estimado es de 27.348 mientras que el gas consumido es de 181.080 . Entonces, ¿qué está mal? ¿Está bien hecho este proceso de estimación de gas cuando se trata de contratos inteligentes?

Estos son los datos que usé para estimar el gas para el punto final: "inicio (dirección, dirección)" en un contrato inteligente con dirección 0x27c042342C9ba937214117e11A4970A6145034cB

web3_sha3(endpoint) = 0xaa6d19c0b1d22f6983033c255695177ad1db0a0aad0435b6f6a367b48d4b37f4 
arguments = "0xa7e3c7c227c72a60e5a2f9912448fb1c21078769, 0xf28dafbfeb41bf32869c9d498da0d651d0206ed4" 
strhex(arguments) = 0x3078613765336337633232376337326136306535613266393931323434386662316332313037383736392c20307866323864616662666562343162663332383639633964343938646130643635316430323036656434 
data = 0xaa6d19c03078613765336337633232376337326136306535613266393931323434386662316332313037383736392c20307866323864616662666562343162663332383639633964343938646130643635316430323036656434

dando una estimación de Gas de: 27,348

Por otro lado, se realiza el siguiente tx:

sc.start.sendTransaction("0xa7e3c7c227c72a60e5a2f9912448fb1c21078769", "0x47978a69f410d0f61850c92acdb0d4c464d70937", {from:"0x3b877e80b5c0b29d88f3768ed4292b35fdd93a9d", value:"0x55ae82600", gas:1000000});

txHash: 0xbad5639d7f02cfb1658580eb8cab5f950d379ee8197f423178391dc70701459f

y una vez que se ha extraído el tx, estos son los valores de gas resultantes:

Gas: 1,000,000
Gas Used By Transaction: 181,080

Entonces, ¿por qué el gas estimado está tan apagado? ¡Gracias de antemano!

¿Diferentes rutas de código tomadas durante la estimación y la que se extrae? También parece que el segundo argumento en sendTransaction es diferente del proporcionado en la estimación. ethereum.stackexchange.com/questions/266/…

Respuestas (2)

He encontrado algo, tal vez podría ayudar a otros...

La firma para el hash NO es "inicio (dirección, dirección)" sino "inicio (dirección, dirección)". Este espacio en blanco lo cambia todo.

También encontré información muy valiosa sobre cómo pasar parámetros a contratos en https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#examples

¡Ahora funciona como un encanto!

endpoint = "start(address,address)" 
web3_sha3(endpoint) = 0x3ccfe887556b4c598501287bcd4528f0b8830f303e150d3b4c3ac9831b7989a8 
arguments = Array (
    [sellerAddress] => Array
        (
            [type] => address
            [value] => 0xa7e3c7c227c72a60e5a2f9912448fb1c21078769
        )

    [thirdPartyAddress] => Array
        (
            [type] => address
            [value] => 0xf28dafbfeb41bf32869c9d498da0d651d0206ed4
        )
)
data = 0x3ccfe887000000000000000000000000a7e3c7c227c72a60e5a2f9912448fb1c21078769000000000000000000000000f28dafbfeb41bf32869c9d498da0d651d0206ed4

gasEstimado = 181,080

Los argumentos deben codificarse uno tras otro, cada uno de 32 bytes con 0 de relleno a la izquierda, por lo que cada uno utiliza 64 caracteres hexadecimales para representarse.