区块链
简介
在本文中,我将用示例代码来讲述我所知道的最简单的区块链应用程序的数据验证问题。
想象一下下面的用例。您收到一份经过多方认可的文件,但是又希望确保其的真实性。该文件可能是您正在购买的汽车的服务手册,也可能是一份购房文件,证明您正在购买的房子确实属于卖方。
对文件进行数字签名以防止被篡改,这已经不是什么新鲜事。您可以获取文件的内容并使用你的私钥进行加密,生成一个加密文件,将该签名与文件一起发送给对方。
文档的接收者可以再次生成签名,并验证它是否与所提供的签名匹配。验证文档内容是否被篡改。
这是MD5校验和的结果,使用起来非常方便。它的缺点是您需要接收签名来验证文档的真实性。
由于从个人获取数据并非易于信任,因此有时第三方会介入提供记录保存服务以获取利润。这种利润动机是保持记录保持者诚实的原因。但不是一个完美的解决方案。但是可怕的是,如果经济激励措施改变,记录保管人可能会发生腐败。监管之人,谁人监管?
区块链可以为你做什么?
区块链数据存储是分散的、健壮的和不可更改的。
· 分散意味着数据分布式存储在不同的设备上。
· 健壮意味着即使某些参与者离开或停止合作,数据存储也将继续运行。
· 不可更改意味着一旦数据存储在区块链中,就不能更改。
区块链以优雅的方式解决文档注册问题。一旦我们在区块链注册表中输入一个签名,我们就不必担心签名会被修改以匹配被篡改的文档。要做到这一点,需要大部分网络参与者一致达到共识,这使得它几乎不为人所知。
在此上下文中,文档可以是任何数据集。同样的模式也适用于证明任何商业交易、物联网数据集或用户身份的真实性,以及其他许多模式。
现在,了解如何使用这个构建区块来设计更复杂的解决方案是非常有用的。所有区块链解决方案都依赖于存储用户生成的数据,这些数据可以在不依赖任何人的情况下被信任。
用例实施
这次我没有从头开始编写合同。我正试图停止重新发明轮子,区块链注册表已由十几个实施。
智能合约设计非常简单,只有一个相关的合同变量和两个函数。
1. 文档映射将为文档计算的哈希与添加该哈希的区块相链接。
2. add方法接受哈希并将其存储在映射中。
3. verifiy方法返回哈希的时间戳。
pragma solidity ^0.4.18;
contract DocumentRegistry {
mapping (string =》 uint256) documents;
address contractOwner = msg.sender;
function add(string hash)
public
returns (uint256 dateAdded)
{
require (msg.sender == contractOwner);
var timeAdded = block.timestamp;
documents[hash] = timeAdded;
return timeAdded;
}
function verify(string hash)
constant
public
returns (uint256 dateAdded)
{
return documents[hash];
}
}
前端可以使用contract.add上载文档,并将签名计算为文档内容的sha256。
async function uploadDocument() {
…
let fileReader = new FileReader();
fileReader.onload = function() {
let documentHash = sha256(fileReader.result);
…
contract.add(documentHash, function(err, result) {…});
…
}
《}
前端还可以允许上载带有contract.verify的文档,以及是否在上载之前,它将告知您大约何时上载。
function verifyDocument() {
…
let fileReader = new FileReader();
fileReader.onload = function() {
let documentHash = sha256(fileReader.result);
…
contract.verify(documentHash, function(err, result) {
…
let contractPublishDate = result.toNumber();
if (contractPublishDate 》 0) {
let displayDate = new Date(
contractPublishDate * 1000
).toLocaleString();
showInfo(
`Document ${documentHash} is 《b》valid《b》,
date published: ${displayDate}`
);
}
else
return showError(
`Document ${documentHash} is 《b》invalid《/b》:
not found in the registry.`
);
});
}
…
}
这就是实现一个分布式的文档注册表所需要的全部内容,操作两件事情:
1.签署文件
2.验证文件签名后是否发生了更改。
这是因为两个不同的文档具有相同签名的可能性非常接近于零。同时时间戳可以确定您提供的文档是在什么时候注册到注册表的。
智能合约的代码可以根据实际情况进行更新和改进,但这17行代码属于整个实现的核心部分。
结论
文档注册表是最具有商业价值的区块链应用程序的最简单实现。今天,它们在许多领域仍然是有相关的构建块之一,您可以在更复杂的解决方案中反复使用它们。
文档注册中心有效地利用区块链的分散性和不可篡改的属性,消除了信任任何人所提供的数据都是真实的。虽然这个想法很简单,但是具有革命性。
来源: 区块链研究实验室
全部0条评论
快来发表一下你的评论吧 !