忒修斯之船

  今天准备部署乾天计划中的一个主要的事件,就是在太乙村兑换资源的一个事件合约。本以为对这个事件思考过很多次,驾轻就熟,会比较容易地部署上大荒,结果发生了一些出乎意料的事情。

  大荒乾天计划要想顺利开展,初期要完成一个最简单的经济循环,将资源产出,并能够获得通货(道理)。这就好比产生生命,最基础的那几个生化循环,来让营养产生能量,让能量再去推动获得营养。

  这个经济循环是一个很简单的闭环,即:“购买/铸造新角色--》成长/挖取资源--》兑换道理--》购买新角色”。铸造新角色需要缴纳道理,道理收入太乙岛金库。所有资源要么质量守恒,要么质能互换,不会凭空出现,需要角色们花费时间和体力去采集,去挖。初期道理按劳分配,你用资源可以兑换出一定量的道理。

  “兑换道理”这一个操作,就需要角色在太乙村找村长上缴一定量的各种资源(金石木织药),村长兑换给你一定量的道理。这是在一个事件中就可以做到的。

事件60514的资源收购牌价,比如1金石可以换得0.1个道理
事件60514的资源收购牌价,比如1金石可以换得0.1个道理

  上午11点30分,完成新事件60514编码,太乙村兑换资源事件。现在需要一个村长经手资金,于是我们用启动资金购买铸造了一个新角色,取名“罗达”。

村长罗达
村长罗达

  上午11点40分,我们部署了事件60514,并且让罗达入驻事件成为经手人。接下来,我们做了一个比较大胆的动作。

  目前道理已经发行了300个,算是定向拨款。计划发行100万道理,那么接下来我们直接将99万9千7百道理一次发行完毕,并全部交给了罗达。

当前仅预发行了300道理作为定向启动资金,计划发行100万道理
当前仅预发行了300道理作为定向启动资金,计划发行100万道理

  下午1点28分,所有道理资金全部转给了罗达。

罗达已经获得了盘古(角色#1)发行的剩余所有道理
罗达已经获得了盘古(角色#1)发行的剩余所有道理

  至此,百万道理印钞完毕,已经交给大荒太乙村村长罗达管理。

百万道理
百万道理

  这里要说明一下,罗达作为NFT,其Owner已经是事件60514的地址,事件合约开源,且在区块链浏览器上验证。任何人都无法私自控制罗达,只有这个事件本身,在时间线噎明的触发下工作。

当时的世外群众很激动,人人都有想法
当时的世外群众很激动,人人都有想法

  任何人都可以通过链上开源代码和数据来检验这个事件合约,事件入驻的经手人是20号角色NFT,就是罗达。除非代码有重大漏洞,根据区块链不可篡改的特性,事件60514和罗达的未来行为已经无可辩驳地规定下来了。这些规则将不受任何人控制,即“不以人类意志为转移”。当然,太乙世界是要能够持续健康发展的,太乙岛上众师傅可以通过赏善罚恶令系统投票进行事件的更替。

浏览器上查询事件60514合约状态
浏览器上查询事件60514合约状态

  到此为止,一切都还进行得不错。接下来,我们让位于太乙村的韩湘子挖点资源去兑换点道理试试看。如果一切顺利,乾天计划基本上就可以顺利开展大规模建设了。

韩湘子在太乙村采集了一些资源,准备好了一切
韩湘子在太乙村采集了一些资源,准备好了一切

  然而,下午1点50分,事情有点不对头。我们试着让韩湘子触发事件60154,让村长罗达兑换韩湘子手上的全部木材。

  失败!

  执行脚本发现,事件的常规许可检查都通过不了!

  啊完了完了,检查代码发现60514合约代码有bug!

许可性检查最后的位置验证写成不等号了(图中已改为等号)
许可性检查最后的位置验证写成不等号了(图中已改为等号)

  由于角色位置检查代码写错,造成了角色位置不在太乙村才可以兑换资源,而角色在太乙村反而无法兑换。韩湘子目前的位置在太乙村,因此兑换事件许可检查失败,无法执行60514。

  目前的情况是,虽然兑换可以进行,但是逻辑不对了,后面建设不好搞啊。检查了本机的自动化测试用例代码,发现没有覆盖到这部分逻辑。按照建设规范,接下来就得重新部署这个事件合约。

  罗达这个人算是废了,因为我们的事件编码规范目前还未支持从事件中再把角色提取出来,辞职或者换人。但是罗达身上这么大一笔资金,也是我们乾天计划所有的资金,应该怎么办呢?如果是正式线上,势必会在社区引起极大的恐慌。这里是第一次实战测试,我们得想办法把钱搞出来。目前能想到的办法有:

  • 把罗达角色从60514提取出来。但是这些事件还没有做取人换人的接口(因为安全性不能随便走人,旧规范的遗留问题),所以罗达实际上是废掉了,取不出来。

  • 直接操作罗达身上的资金。这需要测试环境部署的“后门”,我们可以直接操作盘古角色,盘古角色在测试环境也具有噎明的权限,理论上有没有可能直接从罗达身上取出这些币。然而我们检查了60514的合约代码,发现盘古也是无法操作这个罗达的。

事件经手人在入驻时,仅将资源(ERC20)的代理操作权授权给了大荒时间线神——噎明
事件经手人在入驻时,仅将资源(ERC20)的代理操作权授权给了大荒时间线神——噎明
  • 看来只有重新部署一个新事件,这个事件里面要“强制罗达还钱”。噎明角色不属于任何人,其Owner是大荒时间线合约本身,可以在事件中通过噎明来执行操作,因此新事件强制还钱是可能的。但这是建设中发生的意外,这个新事件可能会和故事无关,有点奇葩的感觉。

  如果在正式线上,任何新事件,在部署好后,均要开源并被区块链浏览器验证,接受社区的检查。接着,社区会掀起会议或者讨论,各方面势力的高手检查核实部署的新事件的合约代码。之后,才会由太乙岛出面,各位师傅在赏善罚恶令系统投票,将新的事件链接进大荒的时间线。总之是个很麻烦的事情,不过web3这种奇葩的建设方式也是在区块链的安全性和持久性下的必然结果,大荒世界的合约网络也就像是忒修斯之船一样,在建设中运行,在运行中建设,不断升级,不断通过大量的事件合约来构造这个世界的因果历史。

  给文明以岁月,不如给岁月以文明。

  下午3点08分,用修正了的60514代码新实现了一个60515事件,执行入口特别增加了如下一段:

强制罗达把钱交出来!
强制罗达把钱交出来!

  这个事件部署后,代码就会被验证并公开,大家都看得到,然后执行逻辑,也只有大荒时间线的噎明神才能在事件合约中有权转移罗达的资金。之后60514就属于垃圾事件了,罗达身上没钱,也无法再在60514产生有意义的历史。

  下午3点56分,本机的自动化测试用例已经覆盖了这几个情况,并且测试通过。

本机运行的自动化测试过程
本机运行的自动化测试过程

  事件60515需要新的村长,我们铸造了一个新人,取名“罗门”。事件60515在首次被触发时,罗达身上的所有道理就应该被一次性转到罗门身上。

Discord机器人播报,新村长罗门出现
Discord机器人播报,新村长罗门出现

  下午4点21分,事件60515合约部署完毕,接下来对60515进行浏览器源码验证。

浏览器上显示,21号角色罗门已经入驻60515准备履职新的村长
浏览器上显示,21号角色罗门已经入驻60515准备履职新的村长

  接下来执行关键一步,就是用韩湘子触发首次太乙村兑换,如果兑换成功,咋们马上再来确认罗达和罗门的资金情况。

小脚本已经准备好,14号角色韩湘子,准备行动
小脚本已经准备好,14号角色韩湘子,准备行动

  下午4点28分,小脚本执行成功,提示韩湘子兑换前共有木材75个多,准备检查链上情况。

脚本执行成功
脚本执行成功

  链上交易数据看起来正常,合约内部发生了多次转账交易。首先发生了99万多个道理的转账(罗达转款),再发生了75个多木材的转账(韩湘子上缴),再发生了0.75个多道理的转账(罗门付钱)。

浏览器看到的交易
浏览器看到的交易

  根据大荒世界资源合约随机初始化的贫瘠程度,我们将木材兑换价格设定的是每单位兑换0.01道理,75个多木材确实能兑出来0.75个道理。

Discord上机器人也检测到了事件,完成!
Discord上机器人也检测到了事件,完成!

  至此,顺利将大额建设资金从罗达转移到了罗门手上。

  下午4点48分,检查道理Token的分布,正常。

浏览器显示的链上道理分布,图上标记罗达有误,应为罗门
浏览器显示的链上道理分布,图上标记罗达有误,应为罗门

  现在,已经形成了“购买/铸造新角色--》成长/挖取资源--》兑换道理--》购买新角色”,这一最简单的经济循环系统,为大荒的大规模建设奠定了基础。

Subscribe to 太乙协议
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.