開發者 Christophe Verdot 談論線上課程'’他最近通過了這項法案。

告訴我們一些關於你自己的事。您對本課程感興趣的是什麼?
我從事 Web 開發已有大約 15 年了,大部分時間是作為自由工作者。
在為一家銀行集團開發用於發展中國家長期登記的網路應用程式時,我面臨著將區塊鏈認證整合到其中的任務。當時我對區塊鏈認證了解不多,雖然我已經對加密技術感興趣,主要是作為投資者。
結果,這個功能沒有實現,但是,想到組織和銀行對其應用程式有這樣的解決方案感興趣,我開始研究這個問題並很快啟動了該項目 .
我開發了它的測試版,該版本已經在主網上提供。當時,還沒有 [Waves 程式語言] Ride,所以我以最簡單的方式做了一切,使用帶有巢狀 JSON 的翻譯事務。但主要目標是在 Ride 推出後添加更多進階功能。這就是我加入課程的主要原因:專案開發的下一階段涉及創建去中心化應用程式(dApp)。
您認為課程的哪些方面最簡單,哪些方面最具挑戰性?
最簡單的是我們有足夠的時間來完成所有任務。課程的目的是學習一些東西,而不是互相競爭。解釋非常通俗易懂,插圖簡單但全面。這有助於可視化和理解不同的主題。
完成作業時,我們被鼓勵獨立思考,有時自己研究一些東西。這是學習和理解課堂上所涵蓋的想法的最佳方式。
有幾次我沒有完全理解理論部分,直到我在完成作業時開始編寫程式碼。我們不允許進行“複製/貼上”,我們必須自己編寫所有程式碼,這也有助於我們更好地理解一切。
最困難的是多項選擇題的題目並不總是很清楚。我的英文不太好,而且問題是非母語人士寫的,所以有時會出現誤解。
也許課程中專門討論預言機和 NFT 的部分可以更詳細。但是,無論如何,該課程的主要目標是引起開發人員的興趣。那麼,為了充分理解它的各個方面,你當然需要花一些時間進行實驗和練習。
告訴我們更多有關您在整個課程中所研究的解決方案的資訊 - “Coupon Bazaar”?我還可以看一些程式碼範例嗎?
是的,我們參與了“優惠券集市”,這是一個人們出售和購買優惠券的市場,這些優惠券使他們有權以較低的價格購買商品和服務。每張優惠券都由一種數位資產代表,該資產提供供應商的特別折扣。

需要開發幾個應用程式組件。首先,有必要創建一個供應商註冊和優惠券管理系統。然後我們需要一個驗證功能以及用戶搜尋優惠券的能力。

在課程中,我們還添加了一些新功能,包括投票系統和允許您驗證供應商並將其列入黑名單的功能。
首先,我們了解了智慧資產、智慧帳戶和 dApp 帳戶之間的差異以及使用驗證器功能的基礎知識。驗證程式功能可讓您變更帳戶的預設行為。預設情況下,他們驗證交易簽名,但驗證程式功能允許您設定其他「規則」。
{-# STDLIB_VERSION 3 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
letownerPublicKey = base58'H8ndsHjBha6oJBQQx33zqbP5wi8sQP7hwgjzWUv3q95M'
@Verifier(tx)
funcverify() = {
matchtx {
cases: SetScriptTransaction=>sigVerify(tx.bodyBytes, tx.proofs[0], ownerPublicKey)
cased: DataTransaction=>true
case_ =>false
}
}然後我們開始添加優惠券。我們使用了dApp最重要的功能之一,它允許您以鍵值對的形式記錄區塊鏈中任何類型的資料—資料交易。我們將其與新交易 invokeScript 結合起來,該交易用於從區塊鏈外部呼叫 dApp 中的可呼叫函數。
我們在課程中使用的數據交易類型是向市場添加優惠券:
letdatajson = {
"title": "t-shirt with , vote 1",
"coupon_price": 10000000,
"old_price": 1000000000,
"new_price": 100000000,
"address": "Universe",
"description": "I want you to make love, not war, i know you've heard it before",
"image": "https://bit.ly/2EXTghg"
}
it('add item', asyncfunction(){
letts = invokeScript({
dApp: dappAddress,
call:{
function:"addItem",
args:[
{ type:"string", value: datajson.title },
{ type:"integer", value: datajson.coupon_price },
{ type:"string", value: JSON.stringify(datajson) }
]},
payment: []
}, accountSupplierSeed)
lettx = awaitbroadcast(ts)
awaitwaitForTx(tx.id)
})為了使用 addItem 函數處理這些資料並開發購買函數和其他選項,我們使用了使用者可以從區塊鏈外部呼叫的可呼叫函數。因此,它可以執行各種任務,例如啟動資金轉移、在 dApp 資料儲存中寫入或更新資料等。
以下是 addItem 函數中使用的被呼叫函數的範例:
@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
letsupplierAddress = toBase58String(i.caller.bytes)
letitem = getKeyItem(supplierAddress, title)
if( price <= 0) thenthrow("purchase amount cannot be less than item price")
elseif( getValueItemSupplier(item) !=NONE ) thenthrow("an item is already exist")
else{
WriteSet([
DataEntry(getKeyItemSupplier(item), supplierAddress),
DataEntry(getKeyItemPrice(item), price),
DataEntry(getKeyItemData(item), data)
])
}
}我們後來開發了一個投票系統,允許您投票以推廣或刪除某些產品。為了防止外部影響投票過程,它使用「Commit-Reveal」方案。
「提交」階段用於使用雜湊函數和「鹽」收集加密投票。
「揭示」階段用於收集加密投票並比較它們的雜湊值。
以下是此處使用的被呼叫函數的範例:
@Callable(i)
funcvoteCommit(item: String, hash: String) = {
letuser = toBase58String(i.caller.bytes)
letcommits = getValueCommitsCount(item)
letstatus = getValueItemStatus(item)
if( commits >=VOTERS) thenthrow("reached max num of voters")
elseif(getValueCommit(item, user) !=NONE) thenthrow("user has already participated")
elseif(getKeyItemSupplier(item) ==NONE) thenthrow("item does not exist")
elseif(status !=NONE && status !=VOTING) thenthrow("voting is not possible")
else{
WriteSet([
DataEntry(getKeyCommit(item, user), hash),
DataEntry(getKeyCommitsCount(item), commits +1),
DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING)
])
}
}
>您從課程中還學到了什麼?
該課程還包括代幣化和不可替代代幣(NFT)——代表獨特事物的代幣,因此不可替代。
最後一課是關於神諭的。由於區塊鏈無法接收來自外界的數據,因此我們需要預言機將這些數據傳送給它。
對於我們的市場,需要預言機來驗證,並在必要時將供應商列入黑名單,例如不接受已售出優惠券的供應商。
這裡是一個例子:
funcgetExtValueItemWhiteListStatus(item:String) = {
item +"_verifier_status"
}
letverifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv"
letVERIFIED = "verified"
letBLACKLISTED = "blacklist"
@Callable(i)
funcsetstatus(supplier: String, status: String) = {
letaccount = toBase58String(i.caller.bytes)
if( account !=verifier ) thenthrow("only oracle verifier are able to manage whitelist")
elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("wrong status")
else{
WriteSet([
DataEntry(getExtValueItemWhiteListStatus(supplier), status)
])
}
}
對你來說最有用的東西是什麼?
最有用的部分是作業。感謝他們,講座材料變得更加清晰,新獲得的知識透過反覆試驗得以鞏固。實際工作與 , и .
您打算如何將所學到的知識付諸實踐?
從一開始,我就期望該課程能夠幫助我的專案更上一層樓。我的想法是現在寫程式碼 在騎行中。現有版本已經具有文件認證功能,但由於RIDE,它可以顯著改進。新版本將更加靈活和直觀,並將具有更多功能,包括電子郵件認證、多方協定等。
課程也發人深省,給了我很多新的想法。我相信,成果將在未來不斷顯現。
來源: www.habr.com
