本文旨在提出一种利用区块链进行文档验证的方案。即使世界瞬息万变,验证过程也往往很慢且需要人工。对于这种手动且不可靠的情况,使用智能合约和区块链是理想的选择。这种分散式系统将资产和交易的历史记录存储在没有中心故障点的网络上。区块链可以抵御恶意攻击,可以安全,数字地接受文档。
由于技术的加速发展,世界正在发生更快的变化。来自世界各地的公司在创新方面投入巨资,以满足市场需求。新技术是这一进程的一部分,但必须强调的是,新技术不仅提供了不同的商业机会,而且还为社会带来了真正的革命,使以前无法想象的行动得以实现,并提高了人们的生活质量。然而需要信任的任务通常难以跟追上这种快速的变化。
通常要求确认我们同意一份文件。目前这一过程是通过中介机构完成的,这些中介机构可以进行人工分配,也可以通过数字系统来模拟我们亲自完成的任务。我们可以说,即使是有效的解决方案,对于当今世界来说,所有解决方案都不够敏捷。在这种不信任的情况下,可能会发现实施基于区块链的系统的优势。这是一个分散的数据库,用于存储网络上计算机之间资产和交易的历史记录。区块链被传输到所有没有中心故障点的节点。这使得它更能抵抗恶意攻击,允许以安全和数字方式接受文档。
提案
通过区块链进行资产验证的概念并不是什么新鲜事物。渣打银行和星展银行已经宣布成功进行区块链概念验证,以防止显示商品所有权的同一文件多次用于贸易融资。我们的建议符合已经创建的这些解决方案。尽管它建议使用公共区块链环境来确保简单地进行验证。
实施使用区块链技术的验证文件流程的最佳方法是开发基于智能合约的并行系统。对于这个项目,资产将是文档,事务将是用户验证文档的行为。智能合约是使用技术确保签署的协议的自执行数字合约。合约规则的验证是通过区块链完成的。这样可以确保合约不能更改。
我们认为最好使用公共区块链网络。在公共区块链网络中,访问是完全开放的。这意味着每个人都可以接收和发送来自世界上任何人的事务。在旨在验证文档的系统中,任何人都可以审核的可能性是有利的。在这样的网络中,我们知道以太坊将是最佳选择。在一个交易被认为是有效的之前,它必须通过链一致性过程由它的每个组成节点授权。这保证了该系统最大程度的平等和透明度。
该系统有一个web用户界面,用户可以以更简单的方式上传、验证和搜索文档。该系统直接与存储在以太坊的智能合约集成。要访问以太坊分布式应用程序,或浏览器中的“Dapps”,您需要安装某种插件,如MetaMask。该扩展程序将以太坊web3 API注入每个网站的javascript上下文中,以便Dapp可以从区块链读取。它还允许用户创建和管理自己的身份。因此当Dapp想要执行交易时,用户会在批准或拒绝交易之前获得一个安全的界面来审查交易。
每个文档都被转换为一个合约,其中所有权和数据不可变地存储。我们使用另一个智能合约来跟踪多个合约。这将维护所创建文档的历史记录。我们可以在区块链之外的系统(链外)中实现这一点。但我们认为这可能会产生对存储文档的操作点。
实操
在本节中,我们将展示如何在以太坊实现智能合约来验证文档。为此,我们需要solidity来编写代码。这是一种用于编写智能合约的面向对象的编程语言。它用于在各种区块链平台上实施智能合约,尤其是以太坊。让我们首先定义私有变量来存储每个合约的数据。
address private owner;
string private filename;
address[] private validators;
mapping (address => bool) private validated;
为了表示文档所有权,我们使用创建合约的用户的地址。在以太坊和Solidity中,地址对应于公钥的Keccak-256哈希的最后20个字节。因为每个公钥都是唯一的,所以我们可以使用它来表示所有权。
我们还使用数组中的地址来存储已验证该文档的用户。为了便于检查特定人员是否已验证该文档,我们使用映射。通常建议在合同的这种用例中使用映射,该映射可以具有无限数量的文档并且可以更新。数组的主要优点是迭代。但是迭代不仅需要限制速度,而且还需要限制运行成本。
我们需要使用构造函数来使每个文档转换为不可变地存储所有权和数据的合约。这是一个特殊函数,用于初始化合约的状态变量。在我们的例子中,它定义了合约所有者的环境变量,文件名并发出事件。这是合约的可继承成员,该合约存储在事务日志中传递的参数。这些日志存储在以太坊上,并且可以使用合约的地址进行访问,直到合约出现在区块链上为止。
event OwnerSet(address indexed oldOwner, address indexed newOwner);
constructor(string memory _filename) public {
owner = msg.sender;
filename = _filename;
emit OwnerSet(address(0), owner);
}
我们在合约中的主要交互作用是验证文档。所以我们有一个函数从验证器接收地址并记录验证。如下所示,我们通过一个数组和一个hashmap来存储它,以方便验证器的响应。
function validateFile(address newValidator) public {
validators.push(newValidator);
validated[newValidator] = true;
}
因为我们的变量是私有变量,所以不可能直接与它们交互。所以创建外部函数来返回这些值是很有趣的。这种类型的函数不能在内部访问,只能从外部访问。对于外部函数,编译器不需要允许内部调用,因此它允许直接从调用数据读取参数,从而节省了复制步骤。由于内存分配很昂贵,这种解决方案变得更便宜。
function hasValidated(address newValidator) external view returns(bool){
return validated[newValidator];
}
function getOwner() external view returns (address) {
return owner;
}
function getFileName() external view returns (string memory) {
return filename;
}
对于整个实现,请访问我们的Github存储库https://github.com/matheusroleal/solidity-cookbook/tree/master/ValidateData。您还可以在这里找到我们如何实施另一个名为DataTrack的智能合约。这是负责跟踪多个ValidateData合同。
结论
来自世界各地的公司在创新方面进行了大量投资,以找到满足市场需求的答案。在这种不信任的情况下,可能会发现实施基于区块链的系统的优势。我们建议使用公共区块链环境来确保更简单的验证。
---------------------------------------------
原文作者:Matheus Leal
译者:链三丰
译文出处:http://bitoken.world
---------------------------------------------