基于remix在线平台进行智能合约的编写验证
前言
与传统拍卖和集中式电子拍卖相比,该方案以区块链为平台进行拍卖。所谓区块链的典型特征是:
(1)分散信任机制。系统本身保证了真实性,不需要外部信任背书人的干预;
(2)稳定性、可靠性和可持续性。由于它是一种分布式网络体系结构,不存在单点故障,因此与其他技术体系结构相比,其整体性能的稳定性、可靠性和可持续性更为突出;
(3)安全加密机制,协商一致机制,通过技术中介体达到整个交易,无需第三方干预;
(4)不可修改的特性,高度保证交易全过程的透明性和不可篡改性。因此,由于区块链的诸多优势,区块链技术非常适合类似拍卖的多种应用场景。
为了验证所提方案的可行性,在以太坊区块链上进行了系统解决方案的部署和实施。之所以选择以太坊作为测试平台,是因为以太坊区块不仅可以记录交易和存储数据,还可以在区块智能合约中存储一些可执行代码。任何人都可以创建合约并编写分散的应用程序。此外,由于区块大小的限制,比特币每秒只能处理7笔交易,而以太坊则没有区块大小的限制。因此,与比特币相比,以太坊的交易速度更快,更适合作为本次拍卖方案的底层平台。
公开拍卖智能合约
首先,让我们熟悉一个简单的公开拍卖智能合约,所有人都可以出价,把以太币发送到指定地址,出价B高于出价A时,那么A的资金会被自动退回。拍卖结束后,商品所有者会收到最高的出价资金。如下注释写得很清楚。
1 | pragma solidity >=0.4.0 <0.6.0; |
公开拍卖思路如下:
我们首先要记录拍卖的基本数据:谁是受益人,什么时候结束
我们开启拍卖,一个出价更高的人会替代之前出价最高的人
当出现替代时,还要退还之前出价高的人的代币
出于安全的考虑,退还过程将由之前用户主动发起(注意防止重放攻击)
为什么要由用户主动取钱?
假设由合约账户主动退还以太币到出价人账户
如果一个黑客通过外部账户发起交易调用自己的合约的函数,来发起竞拍,但是该合约账户未定义fallback函数
(ps:当我们调用某个智能合约时,如果指定的函数找不到,或者根本就没指定调用哪个函数(如向合约发送 ether)时,fallback 函数就会被调用)
而当竞拍合约退款时,用的是transfer方式,没有调用任何函数,这时会调用fallback函数,由于该合约没有定义,所以竞拍合约的退款会抛出异常,引起连锁式回滚,中间执行过程更改的数据结构也会全部还原,所以整个auction函数执行失败,所有人都收不到转账
所以,应当设计由投标者自己取回出价的方式,首先判断拍卖是否截止,检查取回的地址是否为最高出价人,然后判断余额是否大于0,然后将账户余额转给调用合约的人,然后在合约中给对应出价人清0
秘密竞拍智能合约
相比公开竞拍,其大概思路是:在投标期间,投标人实际上并没有发送她的出价,而只是发送一个哈希版本的出价。由于目前几乎不可能找到两个(足够长的)值,其哈希值是相等的,因此投标人可通过该方式提交报价。在投标结束后,投标人必须公开他们的出价:他们不加密的发送他们的出价,合约检查出价的哈希值是否与投标期间提供的相同
如何使拍卖同时做到绑定和秘密呢?唯一能阻止投标者在她赢得拍卖后不付款的方式是让她将钱连同出价一起发出。但由于资金转移在以太坊Ethereum中不能被隐藏,因此任何人都可以看到转移的资金,又难以保证秘密。该合约的解决思路如下:
1 | pragma solidity >0.4.23 <0.7.0; |
秘密竞拍通过keccak256哈希运算,将出价value、fake、密文secret整体哈希成一个32位随机数,将该随机数与钱一同转入合约账户,由于secret的存在,其他人很难验证出价value的真假,甚至可以通过伪装等方式传递虚假拍卖信息,因此实现了秘密竞拍。而在reveal方法中分别将最高竞拍价和每人应退还钱数予以实现。也保证了竞拍的公平性