开发人员Christophe Verdot谈论了他最近通过的在线课程“ Mastering Web 3.0 with Waves ”。
谈谈自己。 您对本课程感兴趣的是什么?我从事网络开发大约15年,主要是作为自由职业者。
我受一个银行集团委托为发展中国家开发了一个长期注册网络应用程序,我面临着将区块链认证集成到其中的任务。 那时,我对区块链认证了解不多,尽管我已经对加密技术感兴趣-主要是作为投资者。
结果,该功能没有实现,但是,考虑到组织和银行对这种解决方案的应用感兴趣,我开始研究此问题并很快启动了
Signature Chain项目。
我开发了它的beta版本,该版本已经在主网络上可用。 当时没有[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) ]) } }
后来,我们开发了一种投票系统,使我们可以对某些产品的促销或移除进行投票。 为了防止外部因素影响投票过程,她使用了“公开展示”方案。
提交阶段用于使用哈希函数和盐收集加密投票。
“公开”阶段用于收集加密的选票并比较其哈希值。
这是此处使用的被调用函数的示例:
@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)-令牌代表唯一的事物,因此不能互换。
上一课是关于甲骨文的。 由于区块链无法接收来自外界的数据,因此我们需要使用oracle将这些数据发送给它。
对于我们的市场,需要甲骨文进行验证,如有必要,还可以将不接受已售优惠券的供应商列入黑名单。
这是一个例子:
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) ]) } }
什么对您最有用?最有用的部分是分配。 多亏了他们,讲座材料才变得更加清晰,并且通过反复试验巩固了刚获得的知识。 与
IDE ,
explorer和
oracles的实践工作非常有用。
您打算如何使用在实践中学到的知识?从一开始,我就希望课程能够帮助我将项目提升到一个新的水平。 想法是现在在RIDE上编写
sign-web.app代码。 现有版本已经具有文档认证功能,但是由于有了RIDE,它可以得到显着改进。 新版本将更加灵活和易于理解,它将具有更多功能,包括电子邮件认证,多方之间的协议等。
该课程也为我们提供了思考的机会,而且我有许多新想法。 我相信结果将在未来得到体现。