Llamar a la función de contrato a través de web3.eth.sendTransaction no funciona

Estoy aprendiendo cómo funcionan las Blockchains y creé una Blockchain privada para probar algunas cosas. Implementé el siguiente contrato:

contract Greeter         
{
    address creator;     
    string greeting;     

    function Greeter(string _greeting) public   
    {
        creator = msg.sender;
        greeting = _greeting;
    }

    function greet() constant returns (string)          
    {
        return greeting;
    }

    function getBlockNumber() constant returns (uint) 
    {                                                   
        return block.number;
    }

    function setGreeting(string _newgreeting) 
    {
        greeting = _newgreeting;
    }


    function kill()
    { 
        if (msg.sender == creator)  
            suicide(creator);       
    }

}

Ahora probé diferentes métodos para llamar a la función de establecimiento. Obtuve la instancia usando la dirección del contrato y abi y llamé

instance.setGreeting.sendTransaction(...)

Este funcionó y conseguí instance.greet()el nuevo saludo. Pero luego probé un ejemplo de esta página https://github.com/ethereumbook/ethereumbook/blob/develop/transactions.asciidoc#invocation y llamé

web3.eth.sendTransaction({from: eth.coinbase, to: contract_address, data: "0x4136862e000000000000000000000000000000000000000000004d794e65774772656574"})

donde se crean los datos de los primeros 4 bytes del hash Keccak256 de la función prototipo setGreeting(string)y la cadena "MyNewGreet"codificada en hexadecimal y rellenada a 32 bytes. La transacción se extrae pero instance.greet()aún devuelve el saludo anterior.

Respuestas (1)

Parece que te equivocaste en el selector de funciones. debería 0xa4136862ser (Te falta el primer carácter y en su lugar incluyeste uno adicional al final).

La cadena también está codificada incorrectamente. Debe ser una ubicación de 32 bytes de los datos (0x20) seguida de una longitud de 32 bytes (0x0a), seguida de los datos reales, con relleno a la derecha para que sea un múltiplo de 32 bytes. Consulte https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#argument-encoding para obtener todos los detalles.

En conjunto, esta es la codificación ABI correcta de su llamada de función:

0xa4136862000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A4D794E657777265657400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000SETROS00000000000000000000SEMOSITROS A