熊炜|Arweave + SCP:Web3.0 应用开发实践
2021年12月2日,在第十一期 BeWater Live 上,everFinance 创始人 熊炜 分享了 《Arweave + SCP:Web3.0 应用开发实践》。
这场深度且系统的分享,核心内容:
1、SCP 范例1:新一代的无链 DEX
- Uniswap 是怎么运行的?
- 新一代 DEX 的原型
2、SCP 范例2:代币和信息安全
- 传统代币安全问题
- 使用 DAO 治理代币安全
BeWater
一、SCP 范例1:新一代的无链 DEX
1、Uniswap 是怎么运行的?
去中心化应用不一定需要构建在以太坊或者某一条公链上。当我们在谈论 DEX 的时候,几乎都是指 Uniswap 这样的运行在以太坊上的智能合约程序。但是链上智能合约的模式可能并不是一个终极模式,很难用于构建真正可用的 web3.0 应用。下面我会介绍如何在没有区块链的情况下打造一个 DEX。
首先要介绍一下 Uniswap V3。上图是 EVM 上 Uniswap v3 的运行机制。
Uniswap v3 是一个在 EVM 里面的智能合约,该合约分为 Router,NFT 两种模块。个人把自己的资产充值到 Uniswap 之后,就会生成一个 NFT,NFT 其实就是大家作为 Uniswap v3 的一个 LP(流动性提供商),当有用户向 v3 合约请求报价的时候,Router 合约会根据所有的 LP 聚合出一个最优的报价,报价返回到前端上,作为用户就会在前端签署一个订单,该订单允许兑换滑点,最后会提交到 geth 节点去执行。
当交易被打包后,这笔交易会在所有的各种节点重复执行一次,执行之后状态就在整个网络里进行变更。
基于这个模式,我们可以进一步的拓展去中心化 dex,学习 Uniswap 自动做市商模式:通过一个曲线进行报价。但是如果没有链上智能合约和 EVM,我们是不是仍然可以构建像 Uniswap 这样的 dex?
2、everPay Bundle Tx
在这之前我们要学习一下 everPay 的 Bundle Tx。everpay 是一个构建 arweave 上的一个金融协议基础设施,everPay 的 API 非常的像 web2.0 的开发,API 提供了不同的操作原语,这些操作原语有固定的结构,Bundle Tx 就是 everpay 的一种原语。
Bundle Tx 简单说就是一个多对多的转账接口,图中的 Bundle 实现了 100 个 tokenA 个去兑换 1000 个 tokenC,该笔 Bundle 包含多笔内部子转账,所有子转账都必须一次性的在一个事务内执行。同时,该 Bundle Tx 必须包括所有转出方的签名,以保证多方兑换的利益。执行 Bundle Tx 时,如果有一笔内部转账失败,那么整个交易就会被回滚。图中的场景,用户 A 就通过了一个中间人 B 进行了转账,以获得用户 C 手中的 TokenC。通过 Bundle 的原子性,保障了 A、B、C 三方的个人利益。
3、新一代 DEX 的原型
现在我们就可以把 Uniswap 拆解成一种去中心化的无链的 dex。那么它是怎么运作的呢?
把 Uniswap 的代码组件 Router 和 NFT 拆出来,Router 可以认为它是一种网关节点,它是一套开源开发的程序,任何人都可以去部署 Router 程序成为网关节点。
NFT 是每个的报价的曲线和报价区间,我也可以把 NFT 转化成一种 LP 节点,LP 节点可以自己持有资产,并配置自有私钥,LP 节点会按照自己的链下的程序去进行一个报价和签名。
在这个网络中,有无数的 Router 节点和无数的 LP 节点。LP 会连接上 Router,并把自己的曲线的信息和报价区间信息上传 Router。一个 Router 拥有所有连接的 LP 的报价信息,和 Uniswap 合约一样,合约中 Router 也包含每一 LP 信息。因此 Router 无论是在链上还是链下,都可以进行最优报价聚合。
兑换户就可以向 Router 提起一个请求,用 TokenA 去换 TokenC。由于 Router 有所有 LP 信息,它就可以生成一个多对多的 Bundle 转账,用户和 LP 之间就形成一个转账的回路。用户只用关心支出了 100 个 tokenA 一定就可以收到 1000 个 tokenC,其中冗长的转账路由用户可以完全不必关心。
当用户请求了之后,Router 生成的订单会在前端展示给用户,当用户确定这个价格之后,才会进行自己的签名。用户完成签名后,Router 也会通知该订单的每一个 LP 就进行对应的签名,这些交易在1秒内完成并提交给 everPay 进行实时的执行。
在执行的过程中,任何一方的资产都可以被保障,对于一个用户而言,签署的是发送 100 个 tokenA 和收到 1000 个 tokenC,是一个确定性的兑换单。如果对方不能转这么多资产给用户,这整笔交易都会被回滚,因此无需担心资产的安全性问题。
对于 LP 而言,Router 通知他们签名时,他们也会知道这笔订单是不是满足自己的曲线以及自己的做市区间,仅在满足的情况下 LP 才会进行签署。当网络中所有的 LP 节点签署一个共识的订单之后在 everpay 就可以进行实时执行。
该系统的优势有如下几点:
第一,完全分布式的 p2p 网络,Router 和 LP 都没有任何的准入要求,无法被中断和关闭。
第二,具备无限的性能,每个 Router 其实都可以连接上百上千的一个 LP,为上万的用户提供 LP 聚合,网络中也可以部署无数个 Router,Router 甚至可以像 DNS 网关一样相互的共享 LP 的信息,网络的性能几乎是无穷无尽的。
第三,用户签署订单的时候,看到的是 100 个 tokenA 兑换 1000 个 tokenC,那么收到的一定是 1000 tokenC。如果说对方不满足用户签署的需求,整个交易执行失败,就相当于没有发生过。
最后是密钥和资产其实都是在 LP 自己手里边。Uniswap 非常安全,通过智能合约和安全审计,代币由固定程序保护。在无链 dex 中,每个人都是持有自己的资产,那么这些资产密钥都是在自己节点,黑客攻击只能单点的一个一个 LP 去攻击,整套系统也是非常安全的。
第一个应用无链 dex 的介绍基本结束了。其实只需要使用 everpay 或者一些区块链作为结算层,任何人都可以开发 DEX,无需将思维限制在链上智能合约上。
补充info
再补充一些关于无链 dex 的东西,这套系统它的开发门槛其实是非常低,Router 节点他去聚合的 LP 完全可以借鉴 Uniswap 算法,大家在写这个节点的时候,只需要采集 LP 所报上的曲线参数,就可以用任何语言去实现。
另外,LP 的规则也非常简单,只是收到一个订单之后,检查当前的订单是否满足规则,进行签署就可以了。因此网络中 LP 仅有非常低的计算要求。
我们可以想象 LP 就是一个个人的手机钱包,手机钱包里中本来就有数字资产的用户就可以加入这样的兑换网络。用户在手机上选一下曲线参赛,以及报价的区间,那么我可能就像玩游戏一样,点一下开始,手机就自动和节点建立一个连接。手机上的应用作为一个链下的程序,进行签署和执行,也是一种智能合约。我们可以认为智能合约其实并不一定是在链上执行的,做市的用户所签署的合同都是按照用户自己手机上的程序设定来签署的,因此 Router 交给 LP 的任何订单,都是按照用户的规则去执行,最后大家通过多方签署达成一个合作。
除了 Router 和 LP 的开发简单之外,everPay 的 Bundle 订单也是一种简单的交易结构,上图是开发文档会介绍 Bundle,Bundle 交易就是由多个 item 组成的多对多的转账订单,每个 item 由转出人、收款人和金额等字段组成。一个 bundle 订单还包括过期时间、salt 版本号等额外信息。
Bundle 订单的所有 Item 被认可之后,每一个用户都会对整个 Bundle(包括每一个被认可的 Item),进行签名。因此用户在进行这种多方签名的时候,他其实是签署了一整个交易状态,不仅是一笔转出,也包含了额外的收款,当所有的 item 顺利执行,整个 bundle 才会成交,这是一种完全原子性操作的订单格式。
对于开发人员而言而言,只需要按照数据结构去打包出这个参数,将签名组装并提交 everpay,这个交易就会按照指定的业务规则去执行,并保障多方的资产安全。
开发模式和 web2.0 非常像,通过 HTTP 接口,就可以进行各种业务对接。每个客户端按照自己的业务逻辑去签署业务,就形成了一个去中心化的协作网络。
二、SCP 范例2:代币和信息安全
1、传统代币安全问题
我的观点是——Web3 时代的崛起一定不会局限于在区块链以及 EVM 中,会有更多的范式如无链 DEX 这样更多元的去中心化应用。
WEB3 时代要真正的服务普通用户,如果说是按照 EVM 或者全部应用在一个虚拟机里运行的逻辑,我认为是无法讲通的,单个虚拟机几乎不可能承载大规模的应用。
也有一些方案将应用扩展到 APP chain,比如使用 substrate 开发 APP chain。其实它还是比较重,substrate 需要提设计好经济模型,后续的升级和改动也还是有很大的门槛。substrate 需要有越来越多的 APP chain 节点运行起来,它的共识才会越来越强,而早期可能只有那么一两个节点的时候,共识也是比较一个弱的模式。从不同的模式进行对比,无链 dex 就算只有一个节点,借助于区块链技术进行结算,就能达到完全去中心化的目的。SCP 是让每个 client 相信自己的代码,这些代码成为“链下智能合约”,每个 client 保证自己规则的正确性去和其他节点进行通信和协作。
接下来我会讲下一个应用。SCP 是一个非常好的 web3 开发的选择,可以让的开发者集中注意力就去做面向领域的 PoS 设计。
什么是面向领域的 PoS 设计?PoS 质押代币全是为了解决某个领域解决治理问题,这些领域可能是推特这样的社交领域,也可能是论坛或者金融产品等等。基于 SCP,开发者可以为这些领域去专门设计 PoS,而不需要担心区块链底层逻辑影响业务 PoS 开发,可以直接面向自己的业务领域去做自己业务领域的特殊设计。
现在要讲的是 token DAO,我们使用 token DAO 去解决代币的信息安全问题。
就对于普通用户而言,怎么知道一个代币是安全的还是危险的?在区块领域其实丢币盗币情况很多。现在借助 SCP 就可以通过设计特定领域的 PoS 来解决这个问题。
传统审核流程
我先说一下传统的代币信息安全是什么流程,imToken 他们做了一个 token profile 的项目,所有的代币信息放在 github 上,每个用户和项目方都可以把代币信息提交给 imToken 的 token profile,然后由 imToken 进行一个权威的、中心化的审核,当审核通过之后,代币信息就可以正确的合并到 github 上的库中。这些代币可能就是一个安全的代币,也可能在未来会出现风险的代币,因为人工审核并不能 100% 保障这一点,所以审核流程还需要再一次的 re-audit。re-audit 的时候代币的状态可能会产生转变。对于普通用户,打开钱包,或者打开 Uniswap 交易的时候,只想知道这个代币到底是安全还是风险的,但是这些信息其实是需要权威的审核,而且整个过程是非常的冗长缓慢的。
传统审核问题及解决方案
在传统的领域中,审核机构也是完全分离的,权威机构之间就很难相互的信任,对一个审计结果会进行重复多次的审核。
代币再提交到一些市场平台,如 CMC 或者 coingecko,所有的平台都有独立的数据处理模型和独特的机制,平台之间存在一个巨大的信息鸿沟,机构之间是很难相互的确定信息是不是确认。最终所有的代币是安全判断还是交给用户自己去处理,用户需要去查阅各种材料才能确定一些信息,整个安全信息的流动是非常滞后。
我们在使用一些现有的代币信息时,其实是完全信任权威机构。如果说权威机构判断错了一个代币,或者说权威机构的服务暂时暂停了,用户就很难知道代币当前是什么状态。第二就是安全的信息是散落在不同的机构,机构之间就有巨大的鸿沟,信息共享的成本也是非常高,非常缓慢。
为了解决代币安全这个特定领域的问题,我们可以让整个流程去中心化,减少信息鸿沟。将代币的信息去信任化,所有的机构和个人就是可以使用一个 DAO 作为唯一的可信源。
第二是不再依赖权威机构,将 token 信息去去中心化之后,任何人都可以轻易的获得准确的信息。传统审计有成本,机构它提供了 API 但可能是收费的,不透明的。如果有 DAO 能提供同样的功能,就可以不依赖权威机构,不依赖中心化的 API 提供的数据,也可以准确地获得这些代表信息。
第三是无准入,权威机构的审计是以机构的口碑和品牌进行背书,代币如果由小的权威机构,或者说是从某些大的权威机构出来的审计人员进行安全审计,因为没有权威品牌背书,他们做的同样的工作却很难获得该有的回报。因此我们希望创建的 DAO 是任何人任何机构都可以提供自己的审计结果,都能成为这为代币安全信息作为一个可信源。
第四就是更快速信息同步, everfinance 就遇到过一个问题,被黑客在 bsc 发行虚假代币,这个虚假代币空投到了 500 万个用户地址,整整持续一个月的时间都有用户发邮件给 ever,描述他们代币通过 pancake 购买了之后就不能卖。这个信息的话同步就非常非常的慢,因为各个机构的鸿沟非常大,去联系各家机构,然后告诉他是虚假代币,告诉他这不是官方发的代币,但是他怎么能确信?整个过程非常冗长,需要代币信息在漫长的时间内不断的向整个网络世界同步。那么如果有一个 DAO 提供这些信息,就会让这种判断非常的迅速,一旦有用户被骗,他们就会快速的标记出代币是非法的,所有集成 DAO 的机构,不管是钱包还是交易所就可以立即的判断出,用户就会知道最新的代币安全信息。
2、使用 DAO 治理代币安全
运行机制概述
token DAO 是怎么运行的,就是所有代币信息都会存到 arweave 上,建立一种代币的经济激励,一种专门的 PoS 来解决代币安全信息问题。假设存在一种 token DAO 节点,这个节点和刚才所看到的 dex 的节点是一样的,它是完全独立任何人都可以部署的节点。这个节点内生了 tok 代币。
第一,Tok 代币需要用于有激励有效的数据上传,就是咱们上传上去的 token 信息一定是有效的,不是非法的,或者说是不是一些杂乱无章的数据。
第二,Tok 目的是激励对代币进行正确的判断,要对代币进行一个二元的判断,它是合法的还是非法的。
第三是需要使用 Tok 进行投票,因为代币被判断可能会失误,可能一开始判断它是正确的,但后续由于审计纰漏或者项目方自身的问题,让这个信息过期需要调整,那么就可以使用 Tok 投票更正这些业务的信息。
这里简单解释一下 PoS 就是是通过一种增发的机制,所有参与 DAO 的用户,可以去完成说的以上三种任务,对他进行代币的增发奖励。该 PoS 的设计完全就是面向这个领域,为 token 信息的安全性而设计的一个 PoS。
Step 1-数据上传
第一部分先说数据上传,任何人都可以向 arweave 上传数据,如果没有一定的规则和激励,会让数据变得变得太多,甚至产生很多无效的非法的数据,因此就需要激励大家去传的数据是有效的,token DAO 需要去检测有效数据,它会从 arweave 上把 token 的信息下载,节点的程序逻辑会对数据进行校验,并过滤无效的数据。另外是有效信息的整合,如果大家都重复的传信息,其实这是没有意义的,因此可以设定一个激励机制,登记 token DAO 从 Arweave 取到的第一份有效的数据和上传地址。
Step 2-token info 判断
第二部分是 token info 判断,tok 有两种质押状态分别是安全和风险。
一个 tok 可以质押到多个 token info 上,加入一个用户手中的 tok 质押了一个 token,这个用户的收益会非常低;如果用户把 tok 质押到所有的 token(有的 token 选择了安全,有的 token 选择了风险)那么这个时候收益是会更高。token DAO 网络里边的新增发代币收益是用户去质押越多的 token,那么他会获得越高的奖励,这样就可以激励用户去进行更多的 staking,让用户主动判断一个代币是安全还是风险。
有新的代币信息到这个系统中来的时候,需要激励用户去选择对他进行 staking,如果说没有合理的经济激励,那么这些信息可能会无人问津。DAO 的目标要让参与的人不断行动起来,不断的去做事情解决目标问题,所以经济设计的时候尤其需要考虑到系统的激励点和平衡性。这些所有的业务规则都可以用任何语言去编写,开发者可以面向业务逻辑去做自己的 PoS。
Step 3-信息更正
最后就是信息的更正。
上图可以看出,tokenA 就有大量代币 Staking 了安全,tokenE 和 tokenF 被大量质押了危险,还有一些代币如 tokenC 和 tokenD,会处于中间状态,即被质押了安全,又被质押了风险,这是一个争议状态。
用户或机构使用 DAO 的时候,并不希望系统中出现争议状态。因此这种争议状态是不鼓励在系统里面出现的,也需要使用 pos 的机制来让这种状态消失。
怎么消除争议状态?争议状态之后就有两个阶段,当出现争议状态时,会立即进入第一个阶段。那么在这一段有限的时间内,所有用户可以进行重新的 staking,如果在一个小时之内争议被取消,那么代币就自动恢复成一个安全或者一个不安全的状态。
如果 staking 的状态在超过了第一阶段的时间,那么一个小时后他可能就会进入第二阶段开启投票,持有 tok 的用户都可以对这种代币这种争议代币进行投票,判断它是安全还是不安全的。最终投票会产生一个新的确定结果,要么是安全要么不安全。错误质押的用户代币就会被罚没。
因此整个模型就可以通过 PoS 的机制设定该领域的一些特定的经济激励,最终使用 ToK 代币就可以在 DAO 中能标记出每一个代币的安全或者不安全。
Step 4-使用
怎么使用 token DAO?如果用户要 staking 代币,用户可以直接向 ar 上发各种交易信息,这些信息可能是新的 token 信息,也可能是 staking token 信息的操作事件。token DAO 会有加载这些来自 Arweave 数据,执行所有业务逻辑并生成最终结果。
当一个 token DAO 节点跟上了 ar 的最新区块的时候,token DAO 节点 API 所返回 Token 信息就是最新的,最准确的。如果有争议状态,tok 的持有者也会尽快的将代币信息进行重新投票归属为确定状态。token DAO 只需要持续的、自动的同步 Arweave,就能保证获得最新的 token 信息。
使用这个 DAO 节点中,不需要相应任何第三方,只需要运行一个指定的业务逻辑的程序,它包含了特定领域的 PoS,包含代币信息,最终运行完之后 token DAO 的 API 就可以为每个人和机构服务,提供最准确的代币安全信息。