firma criptográfica en un contrato inteligente -> verificar la identidad de un contrato inteligente

mi pregunta en resumen es:

-> ¿Es posible firmar digitalmente algunos datos mediante un contrato inteligente (por ejemplo, con una clave secreta del contrato) y así confirmar que fue exactamente este contrato inteligente quien firmó los datos? -> Ya sé que probablemente no funcionará de esa manera, porque los datos y el código de un contrato son completamente públicos y, por lo tanto, no pueden guardar un secreto. Entonces, ¿hay alguna solución inteligente en la cadena, o tendría que usar pasos fuera de la cadena con este?

Ahora con un poco de historia:

Estoy tratando de crear un dapp, en el que un creador pueda firmar un documento y tener una marca de tiempo en Blockchain, para que cualquiera pueda verificar si el documento existió en un momento determinado.

Mi concepto hasta ahora era:

  1. El documento se codifica y luego se firma con la clave privada del creador (lado del cliente, fuera de la cadena) -> creando así una firma digital del documento

  2. Luego, la firma se envía a un contrato inteligente, que agrega una marca de tiempo a la firma, los hash juntos y luego el contrato firma el hash (la marca de tiempo representa el tiempo del bloque actual)

  3. El Contrato almacena un mapeo donde se accede a cada fila (una fila por cada documento o su versión) con el hash del documento, apuntando a una estructura con: el sello de tiempo, la firma del creador y el sello de tiempo firmado por el propio contrato.

  4. Ahora cualquier persona con acceso al documento, la clave pública de los creadores y la clave pública de los contratos podría verificar (con los hashes firmados en el mapeo), que

a) el documento fue firmado por el creador

b) el documento fue sellado y firmado por el contrato inteligente

-> Mi objetivo original era evitar que terceros de confianza fueran incluidos en el proceso (ni para el sellado de tiempo ni para la firma)

Así que los problemas parecen ser:

-> dado que un contrato inteligente no puede almacenar un secreto en cadena (hasta donde yo sé), no puedo almacenar de forma segura una clave privada en el contrato, con la que podría firmar datos

-> también, si almacené una clave secreta en algún lugar fuera de la cadena, ¿cómo podría autorizarse un contrato inteligente para acceder a ella? (ya que no tiene clave privada con la que identificarse)

¡Sería realmente increíble si pudieras ayudarme! ¡Gracias!

Respuestas (1)

¿Es posible firmar digitalmente algunos datos mediante un contrato inteligente (por ejemplo, con una clave secreta del contrato)?

No. Los contratos no tienen claves de firma, no pueden iniciar acciones (siempre comienzan con una transacción firmada por una cuenta de propiedad externa) y no pueden interactuar con el mundo exterior, excepto mediante la emisión de eventos en los registros.

Estoy tratando de crear un dapp, en el que un creador pueda firmar un documento y tener una marca de tiempo en Blockchain, para que cualquiera pueda verificar si el documento existió en un momento determinado.

Eso no es especialmente difícil...

El documento se codifica y luego se firma con la clave privada del creador (lado del cliente, fuera de la cadena) -> creando así una firma digital del documento

Luego, la firma se envía a un contrato inteligente, que agrega una marca de tiempo a la firma, combina ambos

Obtiene la marca de tiempo de "gratis" cuando la transacción se incluye en un bloque. Los pasos adicionales parecen empeorarlo. Desea que los observadores puedan confirmar el documento (en el futuro) y no se les debe exigir que conozcan esa marca de tiempo para hacerlo. Simplemente registre el hash de los contenidos.

mapping(bytes32 => bool) public exists;

function recordExistence(bytes32 docHash) public returns(bool success) {
  require(!exists[docHash]);
  exists[docHash] = true;
  // should emit an event, omitted for brevity
}

y luego el contrato firma el hash (la marca de tiempo representa el tiempo del bloque actual)

No hay un paso de firma de contrato, per se. Si el contrato lo permite, eso es todo. No es posible que ocurra ninguna transición de estado a menos que el contrato lo apruebe.

El Contrato almacena un mapeo donde se accede a cada fila (una fila por cada documento o su versión) con el hash del documento, apuntando a una estructura con: el sello de tiempo, la firma del creador y el sello de tiempo firmado por el propio contrato.

Puede ir con la dirección simple del creador porque el creador será el firmante que envió la transacción. Pondré el tiempo por el gusto de hacerlo, pero probablemente no sea necesario.

struct DocStruct {
  address creator;
  uint timestamp;
}

mapping(bytes32 => DocStruct) public docStructs;

function docExists(bytes32 docId) public view returns(bool doesIndeed) {
  return docStructs[docId].timestamp > 0;
}

function recordDocCreated(bytes32 docHash) public view returns(bool success) {
  require(!docExists[docHash]);
  docStructs[docId].creator = msg.sender;
  docStructs[docId].timestamp = now;
  // emit ... 
  return true;
}

Ahora cualquier persona con acceso al documento, la clave pública de los creadores y la clave pública de los contratos podría verificar (con los hashes firmados en el mapeo), que

a) el documento fue firmado por el creador

b) el documento fue sellado y firmado por el contrato inteligente

Sí. msg.senderno miente, ni tampoco now. No es posible sobrescribir.

Mi objetivo original era evitar que terceros de confianza fueran incluidos en el proceso (ni para el sellado de tiempo ni para la firma)

Así que los problemas parecen ser:

-> dado que un contrato inteligente no puede almacenar un secreto en cadena (hasta donde yo sé), no puedo almacenar de forma segura una clave privada en el contrato, con la que podría firmar datos

Chasqueen los talones juntos, ya estás en casa. AFAIK, el hash del documento no pretende ser un secreto. No dice nada útil sobre el documento aparte de que existe. Tienes pruebas de que el creador firmó un mensaje demostrando el conocimiento de ese secreto en un momento determinado.

La transacción que envió el firmante (creador) se extrajo en un bloque con un sello de tiempo definido. Cuando alguien inspecciona el public docStructscon el docHashen cuestión, los valores devueltos son dignos de confianza.

La única explicación viable conocida (Alice no tiene una máquina del tiempo) es que el creador firmó una transacción con conocimiento del documento (y calculó su hash) en un punto comprobable de la historia. No hay forma de que haya adivinado ese hash a menos que tenga el documento.

Este es un enfoque común. Si necesita pruebas más granulares sobre lo que hay en el documento mientras mantiene en secreto la información adyacente: https://medium.com/@robhitchens/selective-disclosure-with-proof-f6a1ac7be978

Espero eso ayude.

¡gran respuesta! Muchas gracias. Soy bastante nuevo en el área, así que todavía estoy tratando de entender las dapps, ¡pero tu respuesta realmente me ayudó! ¡Gracias de nuevo!