крипто-подпись в смарт-контракте -> проверка подлинности смарт-контракта

мой вопрос вкратце:

-> возможно ли поставить цифровую подпись на некоторые данные с помощью смарт-контракта (например, с помощью секретного ключа контракта) и таким образом подтвердить, что именно этот смарт-контракт подписал данные? -> Я уже знаю, что это, вероятно, не будет работать таким образом, потому что данные и код контракта полностью общедоступны, и поэтому он не может хранить тайну. Итак, есть ли какие-нибудь умные обходные пути в цепочке, или мне придется использовать шаги вне цепочки с этим?

Теперь немного предыстории:

Я пытаюсь создать децентрализованное приложение, в котором создатель может подписать документ и поставить временную отметку в блокчейне, чтобы любой мог проверить, существовал ли документ в определенный момент времени.

Моя концепция до сих пор была:

  1. Документ хэшируется, а затем подписывается закрытым ключом создателя (на стороне клиента, вне цепочки) -> таким образом создается цифровая подпись документа.

  2. Затем подпись отправляется в смарт-контракт, который добавляет временную метку к подписи, хеширует их вместе, а затем контракт подписывает хэш) (временная метка представляет время текущего блока)

  3. Контракт хранит отображение, где к каждой строке (одна строка для каждого документа или его версии) осуществляется доступ с помощью хэша документа, указывающего на структуру с: отметкой времени, подписью создателя и отметкой времени, подписанной самим контрактом.

  4. Теперь любой, у кого есть доступ к документу, открытому ключу создателя и открытому ключу контракта, может проверить (с помощью подписанных хэшей в сопоставлении), что

а) документ был подписан создателем

б) документ был снабжен временной меткой и подписан смарт-контрактом

-> Моя первоначальная цель состояла в том, чтобы вообще избежать участия в процессе доверенных третьих лиц (ни для временных меток, ни для подписи)

Итак, проблемы кажутся:

-> поскольку смарт-контракт не может хранить секрет в цепочке (насколько мне известно), я не могу безопасно хранить закрытый ключ в контракте, с помощью которого он мог бы подписывать данные

-> Кроме того, если я храню секретный ключ где-то вне цепочки, как смарт-контракт может получить к нему доступ? (поскольку у него нет закрытого ключа для идентификации)

Было бы действительно здорово, если бы вы могли мне помочь! Спасибо!

Ответы (1)

возможно ли подписать некоторые данные в цифровом виде с помощью смарт-контракта (например, с помощью секретного ключа контракта)

Нет. Контракты не имеют ключей подписи, не могут инициировать действие (он всегда начинается с транзакции, подписанной внешней учетной записью) и не могут взаимодействовать с внешним миром, кроме как путем отправки событий в журналы.

Я пытаюсь создать децентрализованное приложение, в котором создатель может подписать документ и поставить временную отметку в блокчейне, чтобы любой мог проверить, существовал ли документ в определенный момент времени.

Это не особенно сложно...

Документ хэшируется, а затем подписывается закрытым ключом создателя (на стороне клиента, вне цепочки) -> таким образом создается цифровая подпись документа.

Ага

Затем подпись отправляется в смарт-контракт, который добавляет временную метку к подписи, хеширует обе вместе.

Вы получаете временную метку «бесплатно», когда транзакция включена в блок. Дополнительные шаги, кажется, делают его хуже. Вы хотите, чтобы наблюдатели могли подтвердить документ (в будущем), и им не нужно знать эту временную метку, чтобы сделать это. Просто запишите хэш содержимого.

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
}

а затем контракт подписывает хэш) (отметка времени представляет время текущего блока)

Сам по себе этап подписания договора отсутствует. Если договор это позволяет, то все. Никакой переход состояния невозможен, если контракт не утвержден.

Контракт хранит отображение, где к каждой строке (одна строка для каждого документа или его версии) осуществляется доступ с помощью хэша документа, указывающего на структуру с: отметкой времени, подписью создателя и отметкой времени, подписанной самим контрактом.

Вы можете использовать простой адрес создателя, потому что создатель будет подписывающим лицом, отправившим транзакцию. Я потрачу время на это чертовски, но это, вероятно, не нужно.

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;
}

Теперь любой, у кого есть доступ к документу, открытому ключу создателя и открытому ключу контракта, может проверить (с помощью подписанных хэшей в сопоставлении), что

а) документ был подписан создателем

б) документ был снабжен временной меткой и подписан смарт-контрактом

Да. msg.senderне лжет и не now. Перезапись невозможна.

Моя первоначальная цель состояла в том, чтобы вообще избежать участия в процессе доверенных третьих лиц (ни для отметки времени, ни для подписи)

Итак, проблемы кажутся:

-> поскольку смарт-контракт не может хранить секрет в цепочке (насколько мне известно), я не могу безопасно хранить закрытый ключ в контракте, с помощью которого он мог бы подписывать данные

Щелкни каблуками, ты уже дома. Насколько я знаю, хэш документа не должен быть секретом. Он не говорит ничего полезного о документе, кроме того, что он существует. У вас есть доказательство того, что создатель подписал сообщение, демонстрирующее знание этого секрета в определенное время.

Транзакция, отправленная подписывающей стороной (создателем), была включена в блок с определенной временной меткой. Когда кто-то проверяет public docStructsс помощью docHashрассматриваемого объекта, возвращаемые значения заслуживают доверия.

Единственное известное жизнеспособное (у Алисы нет машины времени) объяснение состоит в том, что создатель подписал транзакцию, зная документ (и вычислил его хэш) в доказуемый момент истории. Она никак не могла угадать этот хэш, если у нее не было документа.

Это общий подход. Если вам нужны более детальные доказательства того, что содержится в документе, сохраняя при этом смежную информацию в секрете: https://medium.com/@robhitchens/selective-disclosure-with-proof-f6a1ac7be978

Надеюсь, поможет.

отличный ответ! Большое спасибо. Я новичок в этой области, поэтому я все еще пытаюсь разобраться в децентрализованных приложениях, но ваш ответ действительно помог! Еще раз спасибо!