http://www.xiaoyenzi.com

一个简单的区块链应用程序,用于数据验证。

了解如何在十分钟内为以太坊编写可行的应用程序。
所有伟大的事物都很简单,许多事物可以用一个词来表达:自由,正义,荣誉,责任,怜悯,希望。- 温斯顿·丘吉尔
介绍
在本文中,我将用代码示例描述我所知道的最简单的区块链应用程序。这对于那些从区块链空间开始的人以及更有经验的建筑师的设计模式非常有用
想象一下以下用例。您收到的文件已通过多手牌,您希望确保它是真实的。该文件可能是您购买的汽车的服务手册,或者它可能是一份文件,声称您购买的房屋确实属于卖方。它可能是任何东西。
数字签名文件以确保它们没有被篡改并不是什么新鲜事。您可以获取文档的内容并使用它们生成加密签名,该签名随文档本身一起发送。
在本文中,我将用代码示例描述我所知道的最简单的区块链应用程序。
文档的接收者可以再次生成签名并验证它是否与提供的签名匹配。匹配表示文档未更改。
这是MD5校验和的结果,使用起来非常方便。它的缺点是你需要收到签名来验证文件的真实性。如果有人进入中间并更改了文档和签名,那么您将更加明智。
由于从个人获取数据并非易于信任,因此有时第三方会介入提供记录保存服务以获取利润。这种利润动机是保持记录保持者诚实的原因。
第三方是一个可行的解决方案,但远非完美。记录管理员自然会在权力的位置上工作,并在没有竞争的情况下提取高租金。更糟糕的是,如果经济激励措施发生变化,记录保管员可能会变得腐败。谁看着守望者?
区块链可以为您做什么
区块链数据存储区是分散的,健壮且不可变的。
分散意味着数据存储在几个不同的人的硬件上集体运行.Robust意味着即使一些参与者离开或停止合作,数据存储也将继续运行。不可变意味着一旦数据存储在区块链中,就无法改变。
Blockchain以优雅的方式解决了文档注册表问题。一旦我们在区块链注册表中输入签名,我们就不必担心签名会被更改以匹配被篡改的文档。要做到这一点,大多数网络参与者必须就变化达成一致,这使得它几乎不保密。
与此同时,没有人能够提供运营服务的租金。网络参与者自己提供服务。
在此上下文中,文档可以是任何数据集。相同的模式将用于证明任何业务事务,物联网数据集或用户身份等的真实性。
Blockchain以优雅的方式解决了文档注册表问题。一旦我们记录了签名,它就不会被篡改。
如果我在2016年写这篇文章,我可以实现大约一百行代码,然后是一份包含二十几页的白皮书,并在ICO中筹集几百万这种模式的应用程序是无穷无尽的,很多人都抓住了这个机会。
如今,了解如何使用此构建块来设计更复杂的解决方案非常有用。所有区块链解决方案都依赖于存储用户生成的数据,这些数据可以信任而不依赖于任何人。
履行
这次我没有从头开始编写合同。我正试图停止重新发明轮子,区块链注册表已由十几个实施。一个快速的谷歌搜索带我到GitHub回购,我将用它来展示模式的工作原理。即使它使用旧版本的坚固性它也可以正常测试它感谢Svetlin!)。
合同是非常简单,只有一个相关合同的变量和两个功能。
文档映射将为文档计算的哈希与添加它的块链接起来。添加方法接受哈希并将其存储在映射中。验证方法返回哈希的时间戳。
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.`
      );
    });
  }
  …
}
这就是实现分散文档注册表所需的全部内容,它允许两件事:
  • 签署文件。
  • 验证文档自上次记录的签名以来是否已更改。
此方法有效,因为具有相同签名的两个不同文档的几率非常接近于零。如果您收到时间戳,则可以确定您提供的文档当时已引入注册表。
合同代码当然可以更新和改进,但这17行中的核心行为仍然是正确的。
结论
文档注册表是具有业务价值的区块链应用程序的最简单实现。2016年,本文中的几行代码足以在ICO中筹集数百万美元。今天,它们仍然是您可以在更复杂的解决方案中一次又一次地重复使用的构建块之一。
文档注册表有效地使用区块链的分散和不可变性属性,以消除信任任何人提供的数据是真实的需要。这个想法很简单但很具革命性。

作者:
AlbertoCuestaCañada
文章来源:
https://hackernoon.com/a-simple-blockchain-application-for-data-verification-c288a64e0d24

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。