区块链研究实验室|简单的区块链数据验证应用程序

  • 时间:
  • 浏览:73
  • 来源:区块链技术网

简介

在本文中,我将用示例代码来讲述我所知道的最简单的区块链应用程序的数据验证问题。

 

想象一下下面的用例。您收到一份经过多方认可的文件,但是又希望确保其的真实性。该文件可能是您正在购买的汽车的服务手册,也可能是一份购房文件,证明您正在购买的房子确实属于卖方。

 

对文件进行数字签名以防止被篡改,这已经不是什么新鲜事。您可以获取文件的内容并使用你的私钥进行加密,生成一个加密文件,将该签名与文件一起发送给对方。

 

文档的接收者可以再次生成签名,并验证它是否与所提供的签名匹配。验证文档内容是否被篡改

 

这是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行代码属于整个实现的核心部分。

结论

文档注册表是最具有商业价值的区块链应用程序的最简单实现。今天,它们在许多领域仍然是有相关的构建块之一,您可以在更复杂的解决方案中反复使用它们。

文档注册中心有效地利用区块链的分散性和不可篡改的属性,消除了信任任何人所提供的数据都是真实的。虽然这个想法很简单,但是具有革命性。

 

原作者:Alberto Cuesta Cañada

猜你喜欢

区块链骗局曝光骗局,看看你上过当没有?

区块链骗局曝光骗局,看看你上过当没有? 随着这一波的下跌,很多人怕是过不好这个年了。 其实按道理说,从6万上方跌到5万,和从43000跌到35000跌幅差不多,但为什么大家的感受如此截然不同?

2022-01-24

从零开发区块链应用(一)-golang配置文件管理工具viper

理解 HTTP 构建的网络应用只要关注两个端--客户端(client)和服务端(server),两个端的交互来自 client 的 request,以及 server 端的 response。所谓的 http 服务器,主要在于如何接受 client 的 request,并向 client 返回 response

2022-01-20

从零开发区块链应用(二)--mysql安装及数据库表的安装创建

varchar 类型的长度是可变的,在创建表时指定了最大长度。定义时,其最大值可以取 0~~65525 之间的任意值。指定了 varchar 类型的最大值以后,其长度可以在 o 到最大长度之间。

2022-01-20

从零开发区块链应用(三)--mysql初始化及gorm框架使用

Gorm 是 golang 的一个 orm 框架,它提供了对数据库操作的封装,使用起来相当便利。所以如果对 mysql 使用操作不熟悉,建议也可以使用 gorm 框架操作 mysql 数据库。

2022-01-20

从零开发区块链应用(四)--自定义业务错误信息

在实际业务开发中,一个条错误信息需要包含两部分内容:直接展示给用户的 message 和用于开发人员 debug 的 error 。message 可能会直接展示给用户,error 是用于 debug 的错误信息,可能包含敏感/内部信息,不宜对外展示

2022-01-20