区块链研究实验室 | 如何使用Oraclize基于原子互换技术构建分布式交易所
几个月前,我有了一个想法,那就是如何在不同的区块链之间交换加密货币,从而将验证留给智能合约,而不是第三方。我受到了Cosmos Network的启发,以及它们如何在不同区块链之间执行原子交换的启发。
Blockchain Explorer API可供查询以检查事务的有效性。但是,在区块链世界中,诸如API请求或随机数生成之类的不确定性计算是不可能的。事实上,如果两个节点计算出不同版本的“现实”,区块链会分叉,所以我必须找到一个解决方法。
Oraclize可以从智能合约中执行API请求。我将解释他们的服务到底是如何工作的,但是现在,你应该记住,他们提供了一种可靠的方法来从外部世界提取数据。凭借我口袋里的这项伟大技术,我已经构建了一个功能性概念证明Dapp,它可以让您将以太币与您在Etherswaps.co上找到的比特币和Stellar Lumens交换。但在此之前,我大致介绍一下比特币的工作原理。
正如您所看到的,在去分布式交易所上的代币交换是通过3个简单的步骤执行的:
bob将他的以太币锁定在一个智能合约中,定义他想兑换多少比特币。
Alice在市场中看到该交易并支付相当于Bob的比特币地址的金额。然后,她使用Etherswaps Dapp将交易哈希提交给智能合约。
之后,她将事务哈希提交给Smart Contract,它会执行Oraclize API请求以检查事务是否有效。如果提交的金额>=Bob的请求金额(1 BTC),则智能合约将资金发送到Alice的以太坊地址。
原则是用户可以向智能合约证明他们已经采取了正确的付款方式,使他们有权获得锁定的以太币。
理论上,只要验证数据是公开的,人们甚至可以使用该系统与以太或任何其他ERC20代币交换法定货币。虽然它不能被认为是完全安全的,不应该在生产中使用,而应该只在测试网上使用,但它确实有一些有趣的特性。
如何操作
我们将在智能合约中创建一个要约,并将其支付给比特币交换以太币。
第一步
转到http://etherswaps.co并使用Metamask连接到Dapp。 然后在http://blockchain.etherswaps.co上添加我的本地区块链实例作为自定义RPC。 您也可以使用Ropsten Testnet,但此时验证速度要慢得多。
如果您使用我的区块链实例,请导入以下其中一个私钥,该私钥上已存储有100个以太,但请按实际使用;)
0x7a7ce0fa57cf26a6e5064a61b1ba9135680e776956bf19d26f6964f185fcb9c7
0x7fa4f9979b728b9a58c2dc7ab70f42e735a3cef135ea572f83e8a2d908b7289d
0x1bc2129af5929d2772c5599d3a9da8329e1c1a020980e3028710cd6ad2f55327
第二步
继续创建报价并输入所需的比特币地址、比特币金额(Satoshi)和报价对您有价值的以太币金额(Wei)。标签将自动显示最新价格。使用此比特币地址1mfjvqrgryfvngsqjvt3xcahdwmcwairyq并定义要为0.08876 BTC锁定2个以太币。
因此,您应该键入以下内容:
Bitcoin Address?:?1MfJVqRgryFvnGSQjVt3xCAhdwmcwairYQ
Bitcoin Amount (in Satoshi)?:?700000
Amount of Ether (in Wei)?:?2000000000000000000
将弹出MetaMask页面,您可以确认交易的详细信息。
重要的是要提到你应该只使用“新的”比特币地址而不需要任何事先交易,否则恶意方可能会发送错误的交易哈希并免费申请你的以太币! 幸运的是,如果地址已收到任何先前的交易(当前已停用以进行测试),网站会自动检查并抛出错误。
第三步
接下来,我们将0.007 BTC发送到该地址并提交交易Hash以声明以太币。 幸运的是,我已经做到了,你可以看到这里的交易正好发送0.007 BTC到我们的地址。
进入市场页面,选择您刚刚创建的报价。理想情况下,您应该被重新定向,并且应该突出显示正确的报价。当你点击它,一个模式将弹出更多的细节,允许你输入比特币交易的交易哈希。
Bitcoin Transaction Hash?:?014ed2e6f875da84648fb38f5b39077f8d54466aecef371a4fe5f9f754088c46
然后使用MetaMask确认交易。 在后台,发送基础智能合约的交易。 它使用Oraclize执行API请求,以检查事务是否已将相应的金额发送到相关的比特币地址。 如果是这种情况,智能合约将把存入的以太币支付给您的以太坊地址,大约30秒后,您将收到一笔通知,表明已支付了金额。
代码编写
构建Etherswaps分布式交易所:我使用了以下技术:
solidity编写智能合约
Truffle,Ganache,Remix IDE和Oraclize Ethereum-Bridge用于本地测试和开发
Web3Js和MetaMask在JavaScript中与Blockchain进行交互
React和Materialize前端的Css
Express,Nginx和MongoDB用于服务网站和存储辅助数据(我计划用IPFS替换MongoDB)
让我更深入地了解智能合约的工作原理,Dapp如何与之互动以及存在哪些安全漏洞。
智能合约深度挖掘
让我向您展示一个简单化的智能合约版本,它没有任何安全机制,可以让您很好地了解它的工作原理。您可以在这里找到完整的合同代码。正如我所提到的,它还没有完全审计,不应该以任何方式用于生产。
Ether存储在合同中,表示商品的结构存储在Map中,以便稍后引用(注意_bitcoinAddress变量s作为Offer结构的标识符)
当用户提交其事务哈希时,将调用getTransaction函数,而事务哈希又通过oraclize_query函数执行Oraclize API请求。发件人地址和oraclizeID和bitcoinAddress值对都存储在Maps中。
Oraclize向此Blockchain.info API端点执行API请求,该端点的格式为https://blockchain.info/q/txresult/
/ ,返回带有转移金额的单个字符串。 Oraclize允许您事先执行某种形式的JSON解析,因为在Solidity中解析JSON非常昂贵。实际上,正如您在此处所看到的,Solidity中的任何字符串操作都会消耗大量气体。收到数据后,Oraclize将其发送到__callback函数。如果金额高于或等于预定义的bitcoinWithdrawAmount,则锁定的以太网将支付给提交交易哈希的以太坊地址。请注意它如何从Map设置中获取正确的recipientAddress,Offer struct key存在为false,因此无法再次支付。有点棘手,但完全有效!
有了这个概念,只要有一个值得信赖的公共API来查找交易,就可以整合任何其他货币。 要完全理解最后一部分以及如何整合其他货币,我们需要了解Oraclize如何在后台运行。
本质上,Oraclize运行一个节点,监控一个特殊的智能合约,该合同接收API请求的查询。 当另一个智能合约使用API查询调用特定函数时,Oraclize节点会注意到它并执行API请求。 创建一个真实性证明,然后他们在智能合约中调用__callback函数,将API请求的返回结果作为输入传递给它。 您可以事先在此站点测试您的Oraclize queris。
总而言之,Oraclize提供了一种值得信赖且可靠的方法来从外部世界提取数据。
关于React和Web3的一些话
我已经习惯了React为后端构建客户端Front-end和Express。使用JavaScript Web3库,前端能够与合同交互,允许用户使用Metamask并在交易完成后收到通知。为了测试,我建议使用Ganache的web3提供程序。我还强烈建议您始终检查您是否使用了正确版本的Web3。 1.0版本中有一些重大变化,使用错误的版本可能会导致一些非常奇怪的错误。
总而言之,Web3是一个相当新的库,仅仅依靠它来显示智能合约数据在这一点上仍然不是很直观和简单。因此,我将MongoDB与Express API结合使用,在本地存储提供的数据。
虽然这使其更集中并留下安全漏洞,但它仍然可以轻松地用分散的IPFS文件存储系统替换。
安全考虑
当然,集中式数据存储并不是唯一的安全漏洞。除了双重支出攻击的常见问题外,由于合同未经全面审计,智能合同漏洞也可能发生。不过,我想指出三个安全方面。
如果他决定不再交换他的以太,我会留下一个后门来支付要约的原始所有者。因为这会留下额外的安全漏洞(如果数据更新得太晚,用户可能会尝试兑换不存在的优惠)我还没有在UI中实现它,但此时只在智能合约代码中实现。
你们中的一些人可能发现了另一个安全漏洞,这个漏洞基于创建比特币交易的异步性质,然后将其提交给智能合约。恶意方可以先等待事务到比特币地址并在您之前通过提交事务哈希来声明以太网。要解决此问题,用户必须在事务元数据中写入他的以太坊地址(如此),以便智能合约可以验证正确的地址是否尝试声明以太网。这再次在智能合约中实现,但在UI中尚未保持简单。
我为测试目的而打开的另一个安全漏洞是对以下行进行评论:
这允许所有用户使用相同的地址创建多个商品。
最后,另一个重要的方面是Block Explorer数据可能不准确或服务器可能已关闭。虽然不可用的服务器不是问题,因为事务哈希可以在以后提交,但是在Block Explorer服务中仍然需要很多信任,这导致我进入上一个主题:
谁是值得信任?
与任何金融服务一样,在与之交互时仍然需要信任。事实上,任何使用以太交换的人都必须信任以下4个方面:
Oraclize服务以正确显示数据。然而,他们在公开可验证方面做得非常好;
Block Explorer API,合同目前正在使用Blockchain.info和其他大型交易所所依赖的官方Horizon Stellar API。
智能合约本身。请注意,它未经过安全审核,因此不应在生产中使用。
网站运行的服务器,以正确显示数据。但是任何人都可以自己主持。
总结
正如您所看到的,这种分散的交换并非免于信任。人们仍然要相信不同的政党。但是,它有效地降低了中间人和交易成本,同时提供了一种在区块链上交换代币的简单而便宜的方式。智能合约以异步方式进行验证,它比任何主要交易所甚至其他分散交易所都更加分散。
本文转载公众号:区块链研究实验室
海纳学院的内容将围绕:区块链技术,产品社群,经济模型等全方位的知识体系输出,为大家带来不一样的社群学习体验。欢迎联系作者微信加入社群:csschan1120