Как сохранить хэш некоторых данных в общедоступной в настоящее время блокчейне? - PullRequest
0 голосов
/ 26 октября 2019

Я читал, что блокчейны не очень хороши для хранения больших файлов. Но вы можете создать хеш файла и каким-то образом сохранить его в блокчейне, говорят они. Как мне это сделать? Какой API или сервис я должен смотреть? Могу ли я сделать это на bitcoin.org, или это должен быть какой-то специальный «параметризованный» сервис цепочки блоков какого-то рода?

В блогах, которые я видел, рассказывалось, как круто, где вы можете хранить свои данныев mysql, но хранят хеш в блокчейне, они не показывают , как вы фактически получаете хеш в блокчейне, или даже какие службы рекомендуются для этого. Где API? В какое поле я передаю хэш?

Ответы [ 3 ]

1 голос
/ 26 октября 2019

Краткий ответ: "Используйте умный контракт Ethereum с событиями и не сохраняйте значения хеш-функций в контракте."

В Etherscan вы можете найти полный контракт на хранениехеш-значений в Ethereum: HashValueManager . Как вы увидите в этом примере кода, все немного сложнее. Вы должны управлять правами доступа, и здесь стоимость не была важной (этот контракт был разработан для синдицированной блокчейна)

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

Лучше было бы не хранить значение хеш-функции в контракте. Гораздо более дешевая альтернатива - отправлять индексированные события в смарт-контракт и запрашивать события (это очень быстро). Информация о событиях хранится в фильтре Блума добытого блока и будет доступна для чтения навсегда. Единственным недостатком является то, что событие не может быть прочитано из контракта (но это не ваша бизнес-логика)

Здесь вы можете прочитать более подробную информацию о событиях и о том, как их получить в приложении: «ETHEREUM EVENT EXPLORER ДЛЯ УМНЫХ КОНТРАКТОВ» (отказ от ответственности: эта статья - мой блог). Также полный исходный код доступен на GitHub.

1 голос
/ 26 октября 2019

Я думаю, что внешний вид интерфейса будет выглядеть следующим образом:

     hashedData = web3.utils.sha3(JSON.stringify(certificate));
contracts.mycontract.deployed().then(function(result) {
           return result.createCertificate(public_addresskey,hashedData,{ from: account }); //get logged in public key from metamask 
         }).then(function(result) {
            //send post request to backend to create db entry

         }).catch(function(err) {
           console.error(err);
           // show error to the user.
         });

Контракт может выглядеть примерно так, как показано на рисунке ниже.

Существует структура, которая содержит все, кроме идентификатора. Отображение из hash => Cert для произвольного доступа (с использованием хэша в качестве идентификатора) и certList для перечисления сертификатов в случае, если хеш не известен. Этого не должно быть, потому что он генерирует события для каждого важного изменения состояния. Возможно, вы захотите защитить функцию newCert() с помощью onlyOwner, whiteList или контроля доступа на основе ролей.

Чтобы «подтвердить» сертификат, получатель подтверждает его подписанием транзакции. Существование истины в этом поле показывает, что упомянутый пользователь действительно подписал, потому что другого пути для этого не существует.

pragma solidity 0.5.1;

contract Certificates {

    struct Cert {
        address recipient;
        bool confirmed;
    }

    mapping(bytes32 => Cert) public certs;
    bytes32[] public certList;

    event LogNewCert(address sender, bytes32 cert, address recipient);
    event LogConfirmed(address sender, bytes32 cert);

    function isCert(bytes32 cert) public view returns(bool isIndeed) {
        if(cert == 0) return false;
        return certs[cert].recipient != address(0);
    }

    function createCert(bytes32 cert, address recipient) public {
        require(recipient != address(0));
        require(!isCert(cert));
        Cert storage c = certs[cert];
        c.recipient = recipient;
        certList.push(cert);
        emit LogNewCert(msg.sender, cert, recipient);
    }

    function confirmCert(bytes32 cert) public {
        require(certs[cert].recipient == msg.sender);
        require(certs[cert].confirmed == false);
        certs[cert].confirmed = true;
        emit LogConfirmed(msg.sender, cert);
    }

    function isUserCert(bytes32 cert, address user) public view returns(bool) {
        if(!isCert(cert)) return false;
        if(certs[cert].recipient != user) return false;
        return certs[cert].confirmed;
    }
}
0 голосов
/ 29 октября 2019

Для магазина существует несколько способов. Более интересный вопрос: как вы планируете получать и использовать ваши данные? Я полагаю, ты собираешься каким-то образом вернуться. В противном случае, если нет извлечения - нет смысла хранить.

ОК. Есть 2 способа хранения ваших хэшей. Я продемонстрирую примеры в emercoin blockchain.

  1. Хранить как OP_RETURN UTXO. Для этого используйте команду «createrawtransaction» с помощью JSON RPC API или интерфейса командной строки. Просто укажите «данные» для определения UTXO, содержащего ваш хеш. В этом случае данные будут храниться в одной из ожидаемых транзакций. Эти сохраненные данные не индексируются, и вам необходимо сохранить TXID для последующего извлечения. В противном случае вам нужно повторно сканировать всю цепочку блоков для получения ваших данных.

  2. Вы можете хранить данные в индексируемой подсистеме NVS (Name-Value Storage). чтобы загрузить, вам нужно запустить команду "name_new", где хеш может быть вашим поисковым ключом. В будущем вы можете быстро получить данные с помощью ключа поиска с помощью команд «name_show» или «name_history». Кроме того, есть возможность сохранить ваши данные в виде DNS-записей в рамках EmerDNS и извлекать их посредством DNS-запросов DNS по протоколу RFC1035 .

Подробнее см. В документе: https://emercoin.com/en/documentation/emercoin-api

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...