Blockchain 如何在当前公开可用的区块链中存储某些数据的散列?
我读到区块链不擅长存储大文件。但是你可以创建一个文件的散列,然后以某种方式将其存储在区块链中,他们说。我该怎么做?我应该看什么API或服务?我可以在bitcoin.org上做,还是需要某种特殊的“参数化”区块链服务Blockchain 如何在当前公开可用的区块链中存储某些数据的散列?,blockchain,Blockchain,我读到区块链不擅长存储大文件。但是你可以创建一个文件的散列,然后以某种方式将其存储在区块链中,他们说。我该怎么做?我应该看什么API或服务?我可以在bitcoin.org上做,还是需要某种特殊的“参数化”区块链服务 在博客中,我看到有人吹嘘说,在mysql中存储数据,但在区块链中存储散列数据是多么的酷,他们没有展示你是如何将散列数据真正地放入区块链的,甚至没有展示推荐什么服务来做到这一点。API在哪里?我应该将散列传递到哪个字段?我认为前端应该是这样的: hashedData = we
在博客中,我看到有人吹嘘说,在mysql中存储数据,但在区块链中存储散列数据是多么的酷,他们没有展示你是如何将散列数据真正地放入区块链的,甚至没有展示推荐什么服务来做到这一点。API在哪里?我应该将散列传递到哪个字段?我认为前端应该是这样的:
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.
});
合同可能看起来像下面的草图
有一个结构包含除id之外的所有内容。一个来自散列=>Cert的映射用于随机访问(使用散列作为id),一个certList用于在散列未知的情况下枚举证书。这不应该发生,因为它会为每个重要的状态更改发出事件。您可能希望仅使用所有者、白名单或基于角色的访问控制来保护newCert()
函数
要“确认”证书,收件人通过签署交易进行确认。此字段中存在true表示提到的用户确实签名,因为没有其他方法可以实现此目的
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;
}
}
简单的回答是:“使用以太坊智能合约处理事件,不要在合约中存储散列值。”
在Etherscan上,您可能会找到在以太坊中存储哈希值的完整合同:。正如您将在这个代码示例中看到的,事情有点复杂。您必须管理访问权限,而成本并不重要(此合同是为银团区块链设计的)
实际上,在区块链中存储散列数据非常昂贵。当您使用以太坊合同存储散列数据时,您必须为每笔交易支付约0.03欧元(取决于以太坊和天然气奖)
最好不要在合同中存储散列值。更便宜的替代方法是在智能合约中发出索引事件并查询事件(这非常快)。有关事件的信息存储在开采区块的bloom过滤器中,并且将永远可读。唯一的缺点是无法从合同中读取事件(但这不是您的业务逻辑)
您可以在这里阅读有关事件以及如何在应用程序中获取事件的更多详细信息:(免责声明:本文是我的博客)。完整的源代码也可以在GitHub上获得。对于store,有几种方法。更有趣的问题:您打算如何检索和使用您的数据?我想,你打算通过某种方式找回。否则,如果没有检索,则没有存储的意义 嗯。有两种方法可以存储哈希值。我将演示区块链中的示例
有关详细信息,请参阅文档:我不得不问,为什么?你想完成什么?