¿Cómo recuperar la dirección de llamada de función del contrato implementado para usar con MetaMask enviar + datos de transacción?

Implementé un contrato en mi red testrpc.

$ truffle deploy
Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  Migrations: 0x9ec9e7fedb27068a70aedf453012bbced070d1e0
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying CrowdFunding...
  CrowdFunding: 0x61a235a21078920353dbb719e7c1e6bd8c8e182b
Saving successful migration to network...
Saving artifacts...

¿Cómo obtengo la dirección de la función contribute(del código de ejemplo para https://dappsforbeginners.wordpress.com/tutorials/contracts-that-send-transactions/ ) que se ve así:

function contribute(uint campaignID) {
    Campaign c = campaigns[campaignID];
    Funder f = c.funders[c.numFunders++];
    f.addr = msg.sender;
    f.amount = msg.value;
    c.amount += f.amount;
}

Supongo que necesito obtener la dirección de la función y luego proporcionarla como parámetro dentro del cuadro de diálogo de envío de MetaMask en transaction data. Puedo enviar el eth como la cantidad, ¿correcto? Luego, msg.valuey msg.senderse proporcionan como contexto para la llamada.

Respuestas (1)

Supongo que necesito obtener la dirección de la función y luego proporcionarla como parámetro dentro del cuadro de diálogo de envío de MetaMask en transaction data. Puedo enviar el eth como la cantidad, ¿correcto?

Sí.

Para obtener el ID del método (consulte ¿Qué es un ABI y por qué es necesario para interactuar con los contratos? ), debe usar tipos canónicos y luego codificarlo con Keccak-256 y tomar los primeros 4 bytes.

Ejemplo

Para contribute(uint), necesitas usar contribute(uint256).

Ingrese contribute(uint256)a una herramienta como https://emn178.github.io/online-tools/keccak_256.html

Obtendrásc1cbbca71c96db867642d5aeca3697d2e3bd24b386562e2b7004d1b0f4fbaaed

Los primeros 4 bytes (8 caracteres hexadecimales) son c1cbbca7.

Puede verificar dos veces 0xc1cbbca7por https://www.4byte.directory

ID      text signature      bytes signature
3752    contribute(uint256) 0xc1cbbca7

0xc1cbbca7es lo que ingresa en los datos de transacción de MetaMask PERO aún necesita codificar el parámetro uint256 en contribute.

Consulte https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#examples para ver ejemplos.

La codificación manual para la ABI puede ser complicada y propensa a errores. Puede terminar llamando a la función incorrecta en el contrato o enviar su ETH a una función que no le dará lo que está buscando. Tenga cuidado y siempre verifique dos veces si necesita hacer esto. En este ejemplo, podría cometer un error al codificar el ID de la campaña y terminar enviando (y posiblemente perdiendo) ETH a la campaña equivocada.