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

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

财产拍卖用例

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

让我们开始…

下面是要使用的不同数据类型:

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

1. bidders:这将存储参加拍卖的人数。
2. maximumBid:最高出价金额。
3. maximumBidder:最高出价者的地址。
4. biddingCompleted:检查拍卖是否已经完成的状态。

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

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

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

来到我们的竞价功能:

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

注意:任何带有payable选项的函数都将允许合约在自己的地址存储以太坊(在函数调用期间从用户收到的)的数量。

只有所有者才能调用此方法并声明结果

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

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

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

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

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

希望你喜欢,教程尽可能简单的主要是带领大家理解总体实现思想。在下一部分,我们将通过物业租赁智能合约实例来进行讲解。

分享到:

相关文章