學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

大家好!

最近,Waves 實驗室 宣布 致力於將去中心化應用程式 Ride4Dapps 的 RIDE 智慧合約語言擴充功能發佈到測試網路的開發人員競賽!

我們選擇 DAO 案例是因為 文丘里 計劃開發具有社交功能的dApp:投票、籌款、信託管理等。
我們從一個簡單的例子開始 問答環節騎行IDE - 範例與 共享錢包.

讓我們來看看這個例子,測試假設並看看一些奇怪的地方:

讓我們有 Alice - dApp 擁有者
Boob 和 Cooper 是 Alice 的合夥人,Alice-BC DAO 的共同創辦人
Neli 是一位需要融資的企業主
銀行 - 分發代幣的銀行

第 1 階段. 餘額初始化

為了在waves測試網路上接收代幣,您需要聯繫 水龍頭 並指示要發送令牌的地址。
您可以透過開啟帳戶詳細資料在 IDE 中找到該位址。
我們重點介紹 Bank 10 WAVES。 然後我們檢查它們是否透過區塊和交易瀏覽器到達: 審稿人

現在讓我們將銀行的代幣分發給其他參與者。 (註:waves網路上的所有交易都不是免費的,因此所有參與者都需要有最低正餘額才能進行交易)。

1 WAVES = 100000000 單位(小波),因為金額只能是整數
0.01 WAVES(交易費)= 1000000

銀行 -> [3 WAVES] -> Alice,透過 TransferTransaction(類型:4)。

我們檢查簽署交易的 env.SEED 是否與我們的銀行相符:
學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

如果您沒有匹配的助記詞,只需在「帳戶」標籤中切換到它並再次檢查即可。
此後,我們創建、宣布並簽署一項用於轉讓 3 WAVES Alice 的交易。
您也可以透過 env.accounts 變數找到 Alice 的資料。 編號從0開始,所以Alice是env.accounts[1]。
學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))

也可以在瀏覽器中觀察結果,執行後會立即回傳一個連結給我們 交易.

我們確保 Alice 的餘額透過 3 WAVES 得到補充,並且銀行餘額保持在 10 - 3 - 0.01 = 0.699。
學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

我們以同樣的方式向 Boob 和 Cooper 各發送 3 WAVES,向 Neli、Xena 和 Mark 各發送 0.2 WAVES。
(註:我們犯了一個字元錯誤並發送了 Neli 0.02 WAVES。小心!)

broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))

補充所有參與者的餘額後,我們看到:
學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

第 2 階段. 建立 dApp 帳戶

我們同意愛麗絲將成為去中心化應用程式的創建者和所有者。
前往帳戶,將其設定為 SEED 並檢查 env.SEED 是否與 Alice 相符。

讓我們嘗試在 Alice 的帳戶上安裝最簡單的腳本(合約)。
Waves 中的智慧聯絡人是在某些條件下禁止或允許發生任何類型的傳出交易的謂詞。 在本例中,此條件為 ALWAYS。 合約代碼真實。 呼叫部署()。

學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

每筆 setScript 交易費用 1400000/100000000 = 0.014 WAVES。 Alice 的餘額還剩 2.986 WAVES。

現在讓我們嘗試在 Alice 帳戶上安裝更複雜的智能合約邏輯,如 例子

Ride4Dapps 現在包括 2 種新的註釋類型:

  1. @Callable(i) — 將哪個帳戶呼叫/簽署交易的資料作為參數 i。 正是這個函數的結果決定了dApp帳戶狀態的改變。 其他帳戶可以使用此註釋建立交易並執行功能,並變更 dApp 帳戶的狀態。
  2. @驗證者(tx) — 具有交易 tx 參數的交易驗證器。 對應於 RIDE 中的謂詞邏輯。 正是在這個表達式中,您可以允許或禁止對 dApp 帳戶上的智慧合約邏輯進行進一步變更。

讓我們做 DAPP 帳戶作為所有參與者的公共錢包。
學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

要檢查您的帳戶目前處於活動狀態的合約,您可以在區塊瀏覽器中複製智能合約的base64程式碼並使用反編譯器識別它(例如)
學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)
學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)
學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

我們確保智能合約的邏輯符合我們的預期。
Alice 的餘額還剩 2.972 WAVES。

這個 dApp 透過一種機制追蹤每個參與者向共同基金貢獻了多少 資料交易 — DataEntry(currentKey, newAmount),其中currentKey是呼叫存款函數的帳戶,newAmount是充值餘額的值。

Boob 和 Cooper 使用 1 WAVES 存款至 dApp 帳戶。
學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

我們犯了一個錯誤,交易沒有成功。 因為,儘管我們確信我們是代表 Bob 進行交易,但我們在索引中犯了一個錯誤,並指出了一個沒有智能合約的銀行帳戶。 這裡值得注意的一點是-嘗試發起交易失敗會產生費用 無法刪除! Alice 的餘額還剩 2.972 WAVES。 鮑伯有 3 波。

Bob 向 dApp 帳戶發送了 1 個 WAVES。

broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))

學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

鮑伯還剩 1.99 WAVES。 即Bob支付了0.01 WAVES佣金

學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

Alice 的餘額上有 2.972 WAVES,現在是 3.972。 Alice 帳戶上也註冊了一筆交易,但 dApp 帳戶(Alice)沒有收取任何佣金。
Cooper也為帳戶充值後,Alice的餘額變成了4.972 WAVES。

學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

您可以在「數據」標籤的區塊瀏覽器中查看誰擁有公共錢包中有多少 WAVE。

Cooper 改變了將 1 WAVES 留在普通錢包上的想法,並決定撤回一半的親和力。 為此,他必須呼叫提現函數。

學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

然而,我們又錯了,因為提現函數有完全不同的參數和不同的簽章。 在RIDE4DAPPS上設計智能合約時應該注意這一點

學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

Cooper 現在的資產負債表上有 2.48 WAVES。 因此,3 WAVES - 1 - 0.01,然後 + 0.5 - 0.01。 因此,每次存款和提款的費用為 0.01 WAVES。 因此,dApps 所有者表中的條目發生以下變更。

學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

Bob也決定從共享錢包中提取一些錢,但犯了一個錯誤,並嘗試提取1.5 WAVES。

學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

然而,智能合約對這種情況進行了檢查。

Xena 是一個騙子,她試圖從總帳戶中提取 1 WAVES。

學習在 RIDE 和 RIDE4DAPPS 上編寫 Waves 智能合約。 第 1 部分(多用戶錢包)

她也沒有成功。

在下一部分中,我們將研究與 Alice dApp 帳戶不完善相關的更複雜的問題。

來源: www.habr.com

添加評論