Solidity智能合约演练系列第1部分

哈里什·博哈纳尼

本系列的基本思想是了解以Solidity编写的智能合约的技术流程和基于用例的概念。在本系列中,我们将介绍三个不同的用例:“财产拍卖”,“出租房地产”和“业务合作伙伴关系”。对于每个用例,我们将首先研究应涵盖的功能,然后了解技术实施细节。代码库可以在这里找到。请记住,这不是功能齐全的产品。这些智能合约已使用Ganache在本地进行了测试,并且不属于任何生产/测试网络。它们仅出于教育目的而开发。

这是智能合约演练系列的第1部分。在以下文章中,我将为您提供有关房地产拍卖智能合约的技术实施细节的深入概述。

物业拍卖用例::

假设某个用户想通过拍卖出售自己的财产。为简单起见,将使我们的情况与拍卖类似(而不是完全拍卖)。基本方案是任何用户(财产所有者除外)都可以参与拍卖。每个参加者将有机会竞标和转移其竞标金额。合约将存储参与者的出价。任何时候业主想要的;他可以通过将财产所有权转让给最高出价者并将最高出价金额转移到自己的钱包地址来停止拍卖。其他参与者可以随时从合约中撤回各自的出价。除非所有其他用户都从合约中撤回了先前的出价金额,否则新所有者将无法针对指定的财产再次开始拍卖。

开始吧 …

这是我们要使用的不同数据类型:

要使用的数据类型

我们正在定义一个Property结构,该结构将存储属性名称和其他详细信息。由于可能有大量的详细信息,因此用户可以存储详细信息的哈希值(在合约外部准备详细信息哈希值)。我们具有状态结构,该结构将跟踪以下内容:

  • 投标者:这将存储参加拍卖的人数。
  • maximumBid:最高出价金额。
  • maximumBidder:最高出价者的地址。
  • biddingCompleted:检查拍卖是否已经完成的状态。

所有者将存储财产所有者的钱包地址,而isProspect是用于存储针对每个参与者的投标金额值的映射。

定义了以下事件以确认各种交易:

在合约部署本身时(调用构造函数时)将初始化的属性详细信息,合约状态字段和所有者钱包地址。还定义了在所有者和非所有者之间隔离各种功能的修饰符,如下所示:

进入我们的出价功能:

使用nonOwner修饰符,此方法仅限于Owner。如果交易成功,则返回true。由于各个参与者都将发送其投标金额(需要存储在合约中),因此被指定为应付。如果用户没有早些时候,我们将允许其参与(否则,我们将还原交易,要求此处使用的运算符将帮助我们完成交易)。我们将为用户设置isProspect映射,增加参与者数量(bidders ++),并设置最高出价者和出价金额,以防用户数量超过其他参与者。一旦交易成功,将发出reg事件,返回值为true。

注意:任何带有应付款选项的功能都将允许合约在其自己的地址存储以太币(在函数调用期间从用户那里收到)的金额。

只有所有者可以调用此方法并声明结果

只允许所有者调用bidResult。这种方法会将财产所有权转让给出价最高的人,也会将出价最高的金额转移到当前所有者的地址并将拍卖标记为完成。它将最高出价者的isProspect映射重置为0并减少参与者数量(这将有助于我们跟踪剩余的正确参与者数量以提取其金额)。一旦交易成功,它将发出结果事件并返回真实的布尔值。

帮助用户撤回各自出价的方法

上述方法允许参与者撤回其各自存储的投标金额。每当任何用户希望退出拍卖或要在拍卖完成后取回其金额时,都可以调用此方法。此方法将针对用户检查isProspect映射的相应金额。然后它将所需的金额转入用户的钱包地址。参加者人数也会减少,以反映实际参加者人数。请注意,在宣布拍卖结果时,我们会减少此人数并重置isProspect映射以获得最高出价者,因为我们不希望拍卖获胜者索取钱款。

拍卖完成后,新的业主可能希望再次开始拍卖。在这种情况下,我们将确保上一轮拍卖的所有参与者是否都撤回了各自的金额,然后仅允许所有者再次开始拍卖。之所以施加这种条件,是因为我们要在此处重置关键参数,例如highestBid和mostBidder。

一旦没有参与者离开,所有者就可以销毁拍卖合约并将存储的以太币转移到他自己的地址(如果有)。

你可能还喜欢