[Filecoin] 通过浏览器鉴定和调用合约
我在【Filecoin】FILLiquid 可能是 Filecoin DeFi 生态的 Game Changer 一文中提到不可变合约,以及如何通过浏览器来查看合约代码以及调用合约。之后有人留言希望就此稍微详细说一下。本文就是一个扩展。
为什么需要审计和验证合约?
很简单地讲,智能合约就是区块链上的应用,之所以叫智能合约,就是因为其执行无需外部干扰,是在区块链上自动执行的。区块链的特性就是去中心化,去信任,这也是 DeFi 能够得到认可的根本原因。也就是说,一个好的 DeFi 应用应该是代码固定、算法制定规则、自动执行的应用,那么这样的 DeFi 应用其安全性与其寄生的区块链的安全性基本等同。就是说其严格执行代码逻辑,除非链本身出现重大安全问题,合约本身不会偏离轨道。
这里需要注意的是,我们说的安全性是说合约按照代码执行的安全性,那么有一个十分重要问题:那么代码安全呢?如果代码有安全漏洞,合约照常执行。如何尽量避免这样的事情发生呢?主要是一下几个方法:1)使用成熟的库和软件,合约完全开源;2)代码通过专业机构审计;3)通过较长时间的测试。
现在一般的应用都会通过专业机构的审计并公开报告,当然有一些应用因为比较简单,也选择不审计,仅仅开源,比如在 Filecoin 网络中的一些 Dogy 合约,如 FilaDogy。因为其代码量小,逻辑简单,本身不承载太多的其他价值(非 DeFi,无抵押等),因此不审计关系也不大。
但是合约审计之后,为何还需要验证合约呢?这是因为合约部署上链后,就是一个合约地址,并不包含源码,那么用户如何知道链上合约就是审计后的合约,还是被偷梁换柱了呢?因此浏览器一般都提供合约验证的功能。其背后的原因在于,合约地址是基于合约源码通过哈希运算得到的,因此如果项目方系统浏览器通过验证,就必须提供此合约对应的源码才能够通过验证。反过来说,通过浏览器验证的合约,其源码都能够在浏览器中查询到。
在 Filecoin 生态中,所有验证的合约都能够查询到,具体来说:
https://filscan.io/contract/list/ 列出了所有Filscan 验证过的合约;
https://filfox.info/en/fevm/verified-contracts 列出了所有 Filfox 验证过的合约。
查验合约源码
对于一个专业的投资者,或者 DeFi 玩家来说,在使用一个去中心化应用之前,最好都需要做一些调查,或者请教专业认识做一些调查。最直接的调查就是查看合约源码。因为代码决定一切。如果合约本身是去中心化的,也就是说是不可更改的,不能被操控的,那么从这里面你至少可以最小化风险,然后才是考虑这个项目本身的发展前景的问题。
比如我们前面提到的 FILLiquid 合约,作为一个 Leaser,你要关心的是存进 FIL 是否能够被挪用,是否可以自由地进出,这个风险没问题,然后才是考虑 farming 盈利的问题;作为一个 Miner,你要考虑的是借贷的条件,受益人地址是否有被转移的风险等等。还有非常重要的,就是合约是否可能被操纵,是否要依赖项目方。
还是以 FILLiquid 合约为例,你可以通过以下链接:
https://filscan.io/address/0xfd669bddfbb0d085135cbd92521785c39c95ba4b/
查看合约状态,包括目前可用的代币数量,每一笔交易。最为关键的是,可以看到全部源码。你只需顺着这一页向下滑,滑倒这里:
你可以看到有5个 tabs。你可以查看不同状态,如果选择“合约”,下面选择“Code”,整个代码就出来了,包含 FILLiquid 本身的代码以及其相关联合约的代码。
如果你投入的资金比较大,值得研究一下,如果投入不多,你也可以选择相信。为什么可以相信呢?非常重要的原因就是,项目方选择通过审计和测试这整个流程,并选择完全开源,完全去中心化,这个是需要底气的。
那这里有一个问题:是否合约被验证了,就说明真的去中心化了呢?其实不是。
大多数项目方都会选择审计合约,这是安全的步骤之一。但是,并不一定开源所有合约。有些项目方会开源部分合约,而其他部分不开源。可以这么说,Filecoin 生态中的绝大多数 DeFi 项目并不是完全开源的。我所了解,FILLiquid 和 CollectifDao 做得彻底一些(这个可能不完全准确,如有不正确,请指正。)
那是不是所有合约认证后,就说明去中心化了呢?其实也不是。大多数项目中都存在合约可升级的情况,也就是说有一个控制人或机构,一般是通过多签的方式来对合约升级。之前大家了解的一个项目就是具有这种多签升级机制的,但是不幸的是,合约被升级到一个大家预期之外的方向了。可升级合约也是一个常见现象,一方面是因为没有项目不够成熟,还有更多开发,需要后续升级实现,另一方面也担心潜在的问题,可能希望通过升级来弥补。但是,正如我们知道的,可升级就留下了中心化操纵的隐患,同时,希望通过升级来弥补漏洞往往属于亡羊补牢、为时已晚。
直接通过浏览器调用合约
大家在玩一个项目的时候,可能更多地是去这个项目网站进行方便的操作。比如对于 FILLiquid 而言,就是:https://dapp.filliquid.io/
这是因为大多数项目要让用户直接调用合约,这个太难了。那么需要推出一个用户友好的方便借口,这就是相应的网站。但是,网站往往是整个 APP 中最中心化的一个部分,因为它是 Web2的,一点都不 Web3。当然大家使用往往是没有问题的,其背后仍然有需要信任项目方的逻辑。不然,如果你遇到钓鱼网站呢?这就是一个可能被篡改的例子。
前面提到可以通过浏览器查看源码,其实也可以通过浏览器调用合约,还是以 FILLiquid 为例,如果我们希望写合约,那么就选择 Write Contract,我们可以看到这里有10个方法可以被调用。
浏览器大同小异,使用 filfox 操作类似。
这里无论是写合约还是读合约,首先第一步,打开你的 metamask 小狐狸链接正确的钱包地址,并选择 Filecoin mainnet。然后就可以选择相关接口填入相关的参数调用合约了。比如 deposit 方法,就是借钱给合约生息,这里填入期望的 FIT 数量即可调用。
这里简单介绍一些这些函数:
与 Leaser 相关的:deposit (存), redeem(取)
与 Miner 相关的:collaterizingMiner(抵押),borrow(借),directPayback(直接外部还钱),withdraw4Payback(从节点内提币还钱),unCollaterializingMiner (解质押)
其他:liquidata(清算),setGovernanceFactors(社区公共治理参数设置,治理提案投票通过自动执行),setOwner(仅仅Owner可操作,目前已设为 0xdeaD,不可再执行)
这里只是提供一种方法,也就是说,要与 DAPP 互动,网站并不是必须的,如果一个 DAPP 能够完全做到这一点,说明其去中心的程度还不错(当然,并不能保证其完全去中心化)。
从另一个方面来讲,如果能够做到完全不依赖网站,就给一些走自动化的玩家提供了另一条路径 - 直接合约调用,无需利用项目方提供的 API。这也说明该项目的模块化和可组合型比较强。
有些合约并没有类似网站的接口
前面提到,如果合约功能比较完善,网站只是一个辅助工具,其实很多合约实际上是不需要网站的,特别是一些工具合约,他们就是给其他合约调用的,或者是给开发者使用的,因此就不用网站了,比如一些用于计算的合约,多签工具合约等。
还有一些简单的合约,比如前面提到的一些 Dogy,如FilaDogy,其前期mint 稍微复杂一些 ,但空投完只有基本的 ERC20的功能了,其实也不需要网站来支持。
RawFilecoin 是另一个例子,尽管不是非常简单,但是因为仅仅面向矿工,来通过 RawBytes 的数量挖矿,不是面向普通投资者的,从其诞生之日起,就没有网站,只有代码和合约部署:https://filscan.io/address/0xa9f903a1E92e43D048A718880882fc7861558526/
也吸引了部分矿工去mint。
简单归纳:
普通用户也可用通过浏览器来判断一个应用是否开源、认证,甚至查看合约源码;
查看合约源码时要注意,合约的安全性;合约是否可升级;合约是否可被操控;
可以通过浏览器来调用合约,DAPP 网站并不是一个必须品,但为使用提供了方便。