開發者的 Solidity:去中心化拍賣

編寫智能合約進行去中心化拍賣

source : https://coinsbench.com/solidity-for-developers-decentralized-auctions-abb1be8fe72. by Akshat Mishra

Photo by Shubham Dhage on Unsplash

毫無疑問,網絡的未來在於區塊鏈。建立在區塊鏈之上的服務更可靠,信任度更高,數據絕對透明。

或許區塊鏈最大的優勢,就是無需中介。我們可以通過編寫智能合約進行拍賣來利用這一事實。

了解拍賣如何運作

典型的拍賣由一名拍賣師(負責拍賣)和參與競標的參與者組成。

在拍賣中,物品被設置為出售,參與者按順序開始競標。參與者要出價,他們的出價必須高於上次出價。這個過程一直持續到沒有更高的出價或拍賣人要求拍賣結束。

在拍賣結束時,資金將轉移給受益人。我們的目標是將整個拍賣過程作為智能合約實施,並消除拍賣師(恰好是中介)的需要

在 Remix 中創建智能合約

首先,請訪問 https://remix.ethereum.org,它是 Solidity 語言的官方 IDE,使使用語言變得更加容易。

要創建合同,請單擊“創建文件”按鈕,將文件命名為 Auction.sol

這將創建一個文件,我們可以在其中開始編寫我們的智能合約。

定義 Pragma 和 Contract

我們通過定義 Solidity Pragma 開始我們的代碼,然後編寫合約定義。

Pragma 告訴我們的編譯器我們用於文件的 Solidity 版本。 在我們的例子中,所有版本的solidity 都大於或等於0.7,但小於0.9。

狀態變量

下一步是創建狀態變量,該變量將存儲我們參與者地址及其各自出價的映射。 我們還需要我們的受益人的地址和另外兩個狀態變量,它們將存儲關於我們最高出價者的信息。

我們受益人的地址是payable類型,這使我們能夠在拍賣結束時將資金轉移到他們的地址。 顧名思義,auctionEndTime 變量存儲拍賣可以結束的時間。

接下來的三個變量存儲關於最高出價者、他們的出價和拍賣狀態的價值的信息。

pendingReturns 變量存儲地址及其出價的映射。 它非常類似於 Python 字典或 JavaScript 對象,其中值存儲在鍵值對中。

最後,接下來的兩個變量是每次最高出價增加或拍賣結束時都會發出的事件。

構造函數

在 Solidity 中,構造函數在部署合約時被調用,因此它通常用於存儲保持不變的數據。

在我們的構造函數中,投標時間和受益人地址是兩個常數。 這些值一旦定義,就不應該改變。

我們將拍賣結束時間設置為當前時間(通過調用全局變量 block.timestamp 訪問)加上我們定義的時間。 這意味著如果我們將 _biddingTime 變量的值設置為 10 分鐘,則拍賣將從該合約的部署時間開始運行 10 分鐘。

投標(Bid)功能

為了實現出價功能,我們將創建一個名為 bid 的函數,該函數是公開的和可支付的。 出價函數將運行多個斷言以確保正確遵循拍賣規則。

讓我們詳細了解每個過程

驗證拍賣時間

在調用出價函數時,我們檢查拍賣是否仍然有效。我們通過創建一個比較當前區塊時間和拍賣結束時間的要求來做到這一點。如果當前出塊時間小於拍賣結束時間,則出價有效,我們進行下一步。

如果要求未能滿足,合同狀態將通過一條消息日誌恢復,其中顯示“拍賣已結束,不允許出價”。

當前出價 Vs 先前出價

為了讓投標得以執行,還有最後一步。也就是檢查當前的出價不低於之前的出價。如果是,我們將恢復合同。

如果當前出價高於最高出價,則參與者成功出價。出價函數然後記錄出價者地址,以及他們的出價值以存儲在pendingReturns 中。

我們還將最高出價信息存儲在我們的最高出價和最高出價變量中,並發出一個聲明最高出價增加的事件。

實施提款模式

在拍賣結束時,我們有兩個責任。

  1. 將資金轉移給受益人
  2. 允許用戶撤回他們的出價

轉移資金

為了將資金轉移給我們的受益人並成功結束拍賣,我們創建了函數auctionEnd。

要允許用戶結束此次拍賣,我們必須執行兩項檢查。第一個檢查是確保拍賣時間已經結束,第二個檢查是確保有人已經關閉了拍賣。

如果拍賣已經結束,我們必須停止執行這個函數,因為它可能導致我們的受益人兩次獲得以太幣。

通過這些步驟後,我們將結束狀態變量設置為 true,將資金轉移給我們的受益人,並發出一個日誌來宣布我們的拍賣已經結束。

提款模式(Withdrawal Pattern)

Solidity 中的提款模式可確保資金安全轉移,並且沒有攻擊者可以乾預和阻止合約執行。

為了實現提款模式,我們創建了一個名為withdraw 的函數。 取款函數首先從我們的 pendingReturns 映射中提取有關調用者的金額信息。

如果用戶參與了拍賣,則可以確定他們的金額值大於零 — — 在這種情況下,我們會從待處理的回報中清除他們的貢獻並將其轉回全部金額。

編譯合同

您可以復制粘貼整個代碼。

智能合約完成後,您可以通過在 PC 上按 Ctrl + S(在 Mac 上按 Cmd + S)來編譯它。 如果這不能編譯您的合約,請轉到您的混音導航面板中的“Solidity Compiler”選項卡來編譯您的合約。

結論

雖然沒有完成,但這份合同非常接近完成。 您現在可以通過在 Remix 中的 JavaScript VM 上部署它來測試它。 有了這份合約,您可以開始自己的拍賣、出價並允許用戶使用臭名昭著的提款模式撤回他們的出價。