Recepción y manipulación de datos de transacciones en contratos inteligentes

La idea es simple: puede enviar transacciones utilizando cualquier billetera ethereum, y cada billetera tiene datos adicionales para enviar llamados "datos de transacción". Por ejemplo, quiero que los usuarios puedan escribir en ese campo de datos el nombre del producto que están comprando, una cadena simple o tal vez un valor entero (índice de un producto). ¿Es eso posible? Solo quiero que los usuarios puedan no solo interactuar con mi contrato usando metamask o mist, sino también usando sus billeteras en línea, etc.

Como leí en los documentos, tengo que usar una función pagadera alternativa estándar, como

contract Test {
   function() payable {}
}

y de alguna manera leer el msg.data. ¿Cómo es posible leerlo? Busqué las preguntas pero ninguna tenía la respuesta correcta. Pero hay más: la función de respaldo solo se ejecuta 2300 gas, entonces, ¿cómo puedo manejarla?

Respuestas (1)

El límite de 2300 gasse introdujo para reducir el riesgo de comportamiento malicioso (como re-entrant attackel utilizado en el famoso hackeo de DAO) de los contratos que reciben ether. El límite es suficiente para enviar un eventcorreo electrónico, por lo que, en el peor de los casos, su aplicación puede escuchar ese evento y luego procesar la compra.

Sin embargo, este límite no está relacionado con la default fallbackfunción sino con los métodos de envío: send()y transfer(). Para este último, puede anular el límite usando el .gas(xxx)método. Y obviamente puede usar la función de bajo nivel call()que no tiene limitaciones para el gas.

Puede agregar datos a cualquiera de esta función, recuerde codificarlos primero usando herramientas como esta .

Me refiero solo a enviar transacciones a un número de contrato usando cualquier billetera. Eso significa que realmente no puedo elegir funciones, solo puedo enviar ether a una función 'alternativa'. ¿Cómo es eso posible decodificar los datos en el contrato?
Sí, todos los parámetros (como el nombre del producto o el índice) se pasan en formato msg.data. Aquí puede encontrar instrucciones detalladas sobre cómo analizarlos ethereum.stackexchange.com/questions/5684/… .
¿Tengo razón en que en mi contrato debo trabajar con ese msg.data a través de function() payable {} ?
Sí, pero tenga en cuenta la limitación de gas. Puede ser más inteligente enviar un evento que contenga una msg.datafunción de pago y procesarlo en otro lugar.