¿Firmar un TX sin formato sin una biblioteca?

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.

"... firmar una transacción sin procesar dentro de Solidity sin restricciones de gas". - Si entiendo correctamente, entonces lo que propones expondría la clave privada al resto de la red. ¿Eso va a ser un problema en su configuración? (Lo que supongo que es una red privada).
Como supuso correctamente, es una red privada, por lo que no sería un problema.
Cuando su contrato envía un mensaje, ya está firmado.

Respuestas (3)

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.

Aunque esta pregunta es principalmente para fines educativos, podría tener su propio propósito útil en una cadena de bloques privada con puntos de acceso RPC proxy filtrados. Gracias por su aporte.
Además, deberá encontrar una manera de generar nonces aleatorios en la cadena, que es otro problema difícil
¿Qué quieres decir con nonces aleatorios? ¿No son los nonces de cuenta deterministas?
Generar una firma ECDSA requiere generar un nonce pseudoaleatorio imparcial que siempre debe mantenerse en secreto y nunca reutilizarse. en.wikipedia.org/wiki/… . Sin embargo, puede generarlos de manera determinista al codificar el mensaje con la clave privada, ya que está dispuesto a exponer la clave a toda la red.

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í .

Gracias por proporcionar un buen punto de partida. Esto, junto con la publicación mediana sobre transacciones, podría ser todo lo que necesito, aunque dejaré esta pregunta abierta por un tiempo más.
Estoy corregido, supongo que alguien lo ha hecho. Podría ser útil para la verificación ECDSA en diferentes curvas