迎接Web 3.0浪潮

开发人员Christophe Verdot分享了他最近参加在线课程“用Waves掌握Web 3.0”的经验



你的背景是什么? 是什么促使您选择这门课程的?

我从事Web开发大约15年,主要是作为自由职业者。

在一个银行集团的资助下,我致力于为新兴国家开发可持续的注册表Web应用程序,曾经有人问我是否有可能在注册表中实施区块链认证。 那时,尽管我已经从事加密技术一段时间了,但我对区块链认证并不了解很多,主要是在投资者方面。

我们没有在特定的应用程序上实施该功能,但是机构和银行要求在其应用程序中实施此类技术的想法使我对该主题进行了大量研究和研究,然后启动了签名链。项目。

我开发了一个Beta版本,该版本已经在Mainnet上发布。 当时[Waves编程语言] Ride还没有准备好,所以我以最简单的方式开发了它,使用带有附加JSON的传输事务。 但是,主要目标始终是在Ride可用后提供更高级的功能。 这是我选择这门课程的主要原因,因为该项目的下一个计划步骤是将其转变为分布式应用程序(dApp)。

您发现课程的哪些方面最容易,最困难?

最简单的方面是我们有足够的时间去做,这是关于学习而不是竞争成为最好的。 它也得到了很好的解释,并提供了简单但明确的插图,极大地帮助了可视化和理解不同主题。

在挑战中,我们被迫独自思考,有时会做一些研究,这是学习和从课程中加深对概念的更好理解的最佳方法。

有几次,直到我进入代码并接受挑战之后,我才对授课部分没有一个清晰的了解。 不允许“复制/粘贴”,这迫使我们编写所有挑战代码,这是加强理解的另一个重要方面。

最困难的部分是,挑战部分中的多项选择问题有时并不清楚。 我的意思是,我的英语不是很好,而且问题是由非英语母语的人撰写的,因此有时在理解上存在差距。

大概,我想从oracle和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资源管理器oracle进行练习非常有用。

您打算如何使用从课程中学到的知识?

从一开始,本课程就应该有助于将我的项目提高到一个新的水平。 因此,现在的想法是在Ride上重写sign-web.app 。 当前版本已经提供了用于文档认证的有效功能,但是将来的Ride版本肯定会对其进行增强。 它将提供更大的灵活性和清晰度,以及更多功能,包括电子邮件认证,多方协议等。

这门课程也非常开放,许多想法开始浮现在脑海。 我相信将来还会有更多。

Source: https://habr.com/ru/post/zh-CN462991/


All Articles