Использование смарт-контракта для проверки вычислений на зашифрованных данных

Я работаю над проектом, в котором все данные хранятся в зашифрованном виде на блокчейне. Есть несколько внесетевых вычислительных узлов, у которых есть ключ для расшифровки данных, выполнения некоторых вычислений и возврата результатов. Я хотел бы разработать схему, в которой можно проверить правильность вычислений с помощью смарт-контракта. Итак, я думаю иметь смарт-контракт, который реализует функцию проверки. Функция проверки будет иметь два аргумента: ключ для расшифровки и ожидаемый результат. Функция постоянна, поэтому закрытый ключ не должен записываться в блокчейн, следовательно, оставаться скрытым ото всех. Функция возвращает true или false и подписывает этот результат. Эта функция может быть вызвана только сущностью, которая знает ключ. Для реализации вышеописанного мне нужна функция для расшифровки и для подписи в Solidity, но я не смог найти.

Есть ли какие-нибудь советы, если в Solidity существует функция расшифровки, подписи? Любые библиотеки? Любые советы по альтернативным проектам для моей проблемы

Если закрытый ключ никогда не попадает в цепочку блоков и используется только в постоянной функции, нет особой выгоды от того, что код этой функции находится в цепочке блоков. Напишите это на нормальном языке и избавьте себя от необходимости делать это в Solidity.
Чтобы прояснить, почему то, что вы описываете, не работает, контракты не имеют закрытых ключей и, следовательно, не могут ничего подписывать. (Даже если бы у них были приватные ключи, эти ключи на самом деле не были бы приватными. Любой, кто управляет узлом Ethereum, имел бы доступ к приватному ключу и мог бы подписывать что угодно.)
его требование, похоже, заключается в том, что он сохранит некоторые зашифрованные данные в блокчейне и напишет проверку (ключ, зашифрованные данные), которая возвращает логическое значение. @MarkS Поправьте меня, если я ошибаюсь.
@EdmundEdgar, ценность, которую я вижу в проверке контракта, заключается в том, что любой может увидеть код подтверждения. Так что больше доверяют ответу "верно"/"ложно". если я передам закрытый ключ в качестве аргумента функции, которая не обновляет состояние блокчейна (постоянная функция), то ключ останется закрытым — верно?
Если вам действительно нужно поделиться кодом подтверждения через контракт, вы можете сохранить его в IPFS и опубликовать его хэш IPFS в контракте.
@JitendraKumar.Balla, да, правильно. Функция «проверки» является постоянной, поэтому она ничего не записывает в блокчейн, и ключ не раскрывается.
@EdmundEdgar, интересная идея. Когда я делаю это в контракте, также намного проще запускать этот код для тех, кто хочет бросить вызов вычислениям (настройка не требуется, просто зайдите в Etherescan и нажмите «Прочитать смарт-контракт»).
@Метки. Обновлен мой ответ

Ответы (1)

В соответствии с вашим вопросом, да, вы можете сделать. Но, к сожалению, я не смог найти никаких библиотек шифрования в Solidity. Как правило, хорошие алгоритмы шифрования/дешифрования требуют хорошей вычислительной мощности. Это означает, что требуется больше газа. Я чувствую, что это рентабельно.

Позвольте мне подытожить код:

contract Mail{
    mapping(address=>string) loginInfo;
    function validate(bytes key, bytes expectedResult) public constant returns(bool){
         //Check given saved data  
          //To do check given data and decrypted data is same or not?
       return true;
    }

} 

Вместо этого вы можете пойти другим путем:

  1. Загрузить данные в IPFS
  2. Сохраните адрес IPFS/Swarm и хэш зашифрованных данных в своем контракте.
  3. Если вы хотите проверить, получите адрес Swarm/IPFS и хеш-значение из контракта.
  4. Используйте ifps/swarm api/sdks для получения данных.
  5. Хэш шага 4 с хэш-значением контракта, если оба одинаковы, выполните шаг 6.
  6. Используйте любую клиентскую библиотеку для расшифровки данных
  7. Сравните свои данные с расшифрованными данными.

В приведенном выше методе ваши исходные данные не будут переданы в сеть.

Например: договор,

contract Mail{
    struct MailInfo{
        bytes ipfs;
        bytes enc_hash;
    } 
    mapping(address=>MailInfo) loginInfo;
    function getIPFS(address userId) public constant returns(bytes,bytes){
       return (loginInfo[userId].ipfs,loginInfo[userId].enc_hash);
    }

}