开发者 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,它可以得到显着改进。 新版本将更加灵活和直观,并且将具有更多功能,包括电子邮件认证、多方协议等。
课程也发人深省,给了我很多新的想法。 我相信,成果将在未来不断显现。
来源: habr.com
