Estoy buscando una forma de firmar una transacción manualmente al tener la entrada necesaria sin usar ninguna biblioteca. No he encontrado cómo funciona exactamente el proceso de firma en ninguna parte, por lo que pregunto aquí. No quiero usar una biblioteca porque quiero intentar y firmar una transacción sin procesar dentro de Solidity sin restricciones de gas.
EDITAR: Para aclarar, no estoy buscando transmitir la transacción a la red. Simplemente intento devolver el mensaje firmado a la persona que llama.
Generar una firma ECDSA requiere una multiplicación escalar de curva elíptica, que es bastante costosa y ciertamente no encajaría dentro del límite de gas de cualquier cadena de bloques pública. No conozco ninguna implementación en Solidity de secp256k1 y, sinceramente, no veo ninguna razón por la que desee generar firmas en la cadena. Dar la clave privada a un contrato lo hace público, en cuyo caso también podría generar la firma fuera de la cadena.
Hay un artículo de Medium muy útil que explica paso a paso cómo se crea y firma una transacción.
Sin embargo, una transacción generalmente debe ingresar al mempool de un nodo (y transmitirse a otros nodos); no estoy seguro de si esto es posible desde un contrato inteligente / Solidity.
Supongo, como señaló @Richard Horrocks, que si todos los nodos de la red tuvieran la clave privada, entonces procesarían una transacción (llamando a este contrato inteligente) que usaría la clave privada almacenada para firmar una nueva transacción que podría actualizar el estado de la cadena de bloques de Ethereum.
Sin embargo, podría ser posible que la transacción creada en el contrato inteligente llame al mismo contrato inteligente (o uno similar en un gráfico cíclico dirigido de contratos) y si no hay restricciones de gas, toda la red estaría encerrado en un bucle infinito.
Esto parece derrotar el punto de la clave secreta/privada.
A raíz de la respuesta de Tjaden...
Como ilustración de la cantidad de gas que requeriría este tipo de operación, aquí hay una implementación de Solidity de secp256k . No se ha tocado durante un año, por lo que su millaje puede variar.
Del LÉAME:
Esta es una implementación de la curva elíptica secp256k en 100% escrita en solidez.
Y:
Calcular una clave pública a partir de una clave privada requiere alrededor de 800.000 gas.
De una mirada superficial al contrato , no parece implementar directamente lo que desea, pero podría ser un buen punto de partida.
Editar:
Y para una implementación aún más antigua, consulte aquí .
Richard Horrocks
Alex Papageorgiou
libertad bloqueada