大家好! 我叫Ararat,我在QuantNet工作,该公司举办算法策略竞赛。 最近,摆在我面前的一项重要任务就是为用户的日期提供不可侵犯性的保证(这非常重要,因为要正确检查策略的有效性,必须实时使用全球金融市场的数据)。
那就是我遇到的PoE(存在证明)概念的地方。 在Internet上已经有足够的有关此的文章,但是该平台的细节使我有些犹豫。 因此,我决定写这篇文章,并分享我在PoE的体系结构和实施方面的经验。 我认为这对金融科技人士尤其重要。
我将文章分为三个主要部分:
- 什么是PoE?何时需要
- 实现算法
- 我的具体情况的解决方案
那么什么是存在证明?
存在证明(从字面上讲,是存在证明)有助于证明文档,文件或数据是在特定日期和时间创建的。 最大的申请是专利注册。 但是据我所见,它通常应用于金融和IT交叉领域。
我的算法交易领域的一个例子:您有一个算法可以给出未来2周正确预测的大约70%的股票。 您决定将预测出售给其他市场参与者。 要点很小-可以说服买家您的预测是正确的,并且是在出价结果之前做出的,即 保证在特定时间实施。
如何保证呢? 正确,实施PoE。
PoE实现算法
首先,您需要:
- 准备要申请专利的文件。 (我做过PDF,但是您可以使用任何其他容器)。
- 获取给定文件的哈希(我使用了sha256格式)。
以防万一,哈希是文件的单独“指纹”,可以保证(几乎完全)与另一个文件的哈希不重合。 当您从文件中收到哈希值时,您只需在区块链网络上生成交易,即可在交易主体中指示文档的哈希值。
仅此而已。 序幕结束。 现在我们转到最有趣的地方。
(为更加清楚起见,我创建了一个特殊的代码(仅用于演示)。您可以在
此处看到演示服务示例。)
让我们仔细看一下该演示的工作原理。
我建议将实现分为两部分:
- 准备智能合约和以太钱包。
- Node.js代码和私钥中的事务生成。
让我们按顺序进行:
第1部分:准备以太坊智能合约和钱包
PoE本身首先与比特币区块链相关。 但是我选择了以太坊区块链和智能合约来实施。 智能合约在未来为我们提供了灵活性,模块化和可扩展性,可充当区块链中哈希的存储。
我选择了一个简单的智能合约,该合约可以接受带有适当日期的哈希,格式为hash => date,拥有一种在调用时返回哈希日期的方法也将是超级好的。 此外,最好只有合同的所有者才能添加新的哈希值。
智能合约代码:
``` pragma solidity 0.5.9; contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(isOwner()); _; } function isOwner() public view returns (bool) { return msg.sender == _owner; } function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract HashStore is Ownable { mapping(bytes32 => uint256) private _hashes; event HashAdded(bytes32 hash); function addHash(bytes32 rootHash) external onlyOwner { require(_hashes[rootHash] == 0, "addHash: this hash was already deployed"); _hashes[rootHash] = block.timestamp; emit HashAdded(rootHash); } function getHashTimestamp(bytes32 rootHash) external view returns (uint256) { return _hashes[rootHash]; } } ```
您已经注意到,我们使用了两个单独的合同:Ownable和HashStore。
HashStore合同负责存储哈希并应要求发布哈希日期。 拥有合同负责验证合同所有者已专门添加了新哈希。
要添加哈希,您需要调用addHash方法,将值sha256作为参数传递给我们的文件。 如果合同中的哈希匹配,则交易将被拒绝。 这将过滤具有不同日期的不必要的值重复。 在这里检查:
require(_hashes[rootHash] == 0, "addHash: this hash was already deployed");
我们可以使用getHashTimestamp方法获取哈希交易日期,并将所需交易日期作为参数传递给哈希。 getHashTimestamp方法以UNIX格式返回时间。 您可以转换为任何更易读的格式。
因此,我们确定了合同,现在您需要将其部署到网络上。 为此,我们需要做两件事:
- 与区块链交互的以太地址
- 一些以太坊,用于调用方法和部署合同。
为了不浪费乙醚,我们可以使用罗普森测试网络。 在这里了解更多。 该地址是合同的所有者,因为它是部署的发起者,将来可能会添加新的哈希。 之后,您需要将此地址以及钱包的私钥和合同地址保存在安全的地方。 将来我们都会需要这个。
第2部分:Node.js和私钥中的事务生成因此,在这一点上,我们已经有了一个以太钱包,它的密钥,测试网络中的合同和数据哈希。 仍然需要配置与区块链的交互。
为此,我们将使用web3.js库并为节点创建令牌。 我使用服务infura.io创建了我的,它看起来像这样:
ropsten.infura.io/v3/YOUR_TOKEN_HERE
对于散列,请使用sha256软件包。 数据格式可以是任何格式,但是在示例中,我们使用JSON中的数据。
我如何使用PoE解决案件?
除了拥有PoE之外,对我来说重要的是不要让用户负担太多的区块链和交易费用,例如,调用addHash方法(bytes32 rootHash)的费用为0.2芬尼(0.0002 ETH或2019年6月的汇率为0.06美元)。

每天大约会得出30条策略立场的结论,也就是说,它花费了2.1美元。 如果用户数量增加100倍,并且以太速率上升,那么成本当然会上升。
我决定在区块链上保留一天的哈希值。 该哈希值将根据每日策略输出及其内部标识符的哈希值生成。

我们得到的解决方案在功能上并不逊色,但是便宜得多。 我们看不到可扩展性问题,但是,您始终可以将策略头寸的输出划分为多个块,并将多个散列保存到区块链网络中。 参与者可以使用其他相邻哈希轻松验证单独的哈希。
最后
为了进行验证,我们创建了一个特殊的模板,可作为Jupyter笔记本使用。 用户可以随时下载模板,重新生成所有内容并验证所有职位是否确实是过去创建和保存的职位。
``` : 1. API 1. 2. API , 3. , . . ```