找回密码
 立即注册
搜索

最近看过此主题的会员

链圈视角:数字货币进化之路——FT公链开发者Sam

236 2
2019-10-11 15:27
显示全部楼层

马上注册,结交更多FTer,享用更多功能,让你轻松玩转FTFan。

您需要 登录 才可以下载或查看,没有帐号?立即注册 一键登录:

x
公链开发者sam.png
作者:FT公链开发者Sam

从开天辟地的比特币,到ETH,再到以太坊上群魔乱舞的ERC20代币,以及万众瞩目的Libra,数字资产,作为区块链行业最重要的产出成果,始终在不停地给世界以冲击,今天,作为一棵在链圈沉浸过的币圈韭菜,我想从纯技术的视角来谈谈数字货币的进化之路。
数字货币成千上万,今天我想从技术角度对比几种典型的Token模型:
  • UTXO模型:比特币
  • 账户模型:ETH
  • 合约模型:ERC20
  • Cell模型:Token on Nervos公链
  • 原生资产模型:Token on FT公链

UTXO、账户和合约模型,这里就不再具体介绍其是什么了(如果还不知道它们是什么,需要先去补一下知识了哦),只会在后续跟最后两种模型做对比时提及,所以,本文的重点是介绍后面两种比较创新的Token模型:Nervos公链支持的Cell模型和FT公链上实现的原生资产模型。
想知道在Nervos公链上可以发行什么样的代币,可以看此文:实现 Token,除了 ERC 20,我还有别的选择吗?,原理在文中已经说的非常清楚,我这里就不再赘述,只做下总结(想看明白下面的总结,上文必须先过一遍):
  • 优点:不同于ERC20中的token所有权属于合约(合约有较大的作恶空间),在Nervos上发行的资产,其执行逻辑和所有权逻辑可以分离,所以即便执行逻辑出了问题,用户手上的已经拥有的资产也不会受影响,后续只需要更新一下执行逻辑便可,这样做可以大大提高资产的安全性。
  • 不足之处:由于token类资产或是其它类型的资产/对象,在Nervos中都被统一对待,也就是说对矿工来说,通过执行交易对Cell空间进行操作的时候,是无法区分其是在操作一个token,还是在操作一棵植物,所以并不能对token做额外的处理,这种方式相比ERC20这种合约资产是进了一步,但由于token无法被链所识别,所以依然难以跟平台币(如BTC、ETH)平起平坐,可以说Nervos对token的进化还是不够彻底。


那如何既能解决ERC20这类资产的缺陷,同时又能让token彻底进化成跟平台币一个级别,真正成为一等公民呢?下面就让我们来了解一下FT公链所支持的原生资产。
  • 原生资产是什么?

FT公链中的原生资产是一种跟平台币同等级别的token,每种原生资产都定义在单独的存储空间中,每个账户下面都单独记录了拥有某种原生资产的数量,只有账户所有者才有权限操作它所拥有的这种资产,甚至,如果矿工们达成共识,还可以使用原生资产来进行手续费支付,甚至强大到取代原始的平台币(个人认为这是区块链平等、公正思想的绝佳体现)。
  • 原生资产如何发行?

针对原生资产,FT公链定义了一个功能强大且扩展性很强的交易结构体,使交易除了支持转账和合约交易外,还能支持众多其它类型的交易(包括跟资产相关的一些交易),我们来看下跟交易相关的最核心的数据结构actionData(每笔交易都会带此结构体相关的数据):
  1. type Transaction struct {
  2.         actions    []*Action
  3.         gasAssetId uint64              // 支付手续费的资产
  4.         gasPrice   *big.Int
  5.         ...
  6. }

  7. type actionData struct {
  8.         AType    ActionType            // 交易类型,共20种,其中包括了7种资产相关的类型(其它类型此处暂不提及),如发行、增发、销毁、转账、更新资产Founder/Owner、以及更新资产绑定的合约
  9.         Nonce    uint64
  10.         AssetID  uint64                // 本次交易需转账的资产ID
  11.         From     common.Name
  12.         To       common.Name
  13.         GasLimit uint64
  14.         Amount   *big.Int
  15.         Payload  []byte                // 包含了具体的交易信息,如发行资产时需要提供的基础数据
  16.         Remark   []byte

  17.         Sign *Signature
  18. }
复制代码
当需要发行资产的时候,我们在AType中填入“发行资产”这个类型,然后在payload中填入具体的资产结构信息,资产相关的结构体如下:
  1. type AssetObject struct {
  2.         AssetID     uint64      `json:"assetId"` // 资产ID,后续可用资产ID代表资产,包括交易和在合约中的资产操作接口
  3.         Number      uint64      `json:"number"`  // 区块高度
  4.         Stats       uint64      `json:"stats"`   // 拥有此资产的账户数量
  5.         AssetName   string      `json:"assetName"`
  6.         Symbol      string      `json:"symbol"`
  7.         Amount      *big.Int    `json:"amount"`  // 市场中流通的资产数,不包括销毁的资产
  8.         Decimals    uint64      `json:"decimals"`
  9.         Founder     common.Name `json:"founder"` // 资产Founder,可获取资产相关交易的手续费
  10.         Owner       common.Name `json:"owner"`   // 资产管理者,可管理资产,包括修改资产Founder,增发,设定资产绑定的合约
  11.         AddIssue    *big.Int    `json:"addIssue"`    // 已增发数
  12.         UpperLimit  *big.Int    `json:"upperLimit"`  // 资产总量上限
  13.         Contract    common.Name `json:"contract"`    // 资产绑定的合约(可更新),一旦指定,便成为资产固有属性,所有资产的流通都将符合此合约规定
  14.         Description string      `json:"description"`
  15. }
复制代码
看上面的结构体,一部分字段大家会比较熟悉,因为是从ERC20标准资产定义里面借鉴来的,除此之外,像AssetId、Number、Stats、Founder、Owner、Contract等属性就是新增的,所有这些属性构成了完整的资产结构是定义,这些定义资产的属性都作为状态保存在链内,当你发起一笔资产相关的操作的时候,矿工通过解析交易是可以清楚的知道这是在操作哪种资产,进而才能对资产做更多工作,我们再来看下账户结构:
  1. type Account struct {
  2.         AcctName common.Name
  3.         ...
  4.         Balances []*AssetBalance  // 资产列表
  5. }

  6. type AssetBalance struct {
  7.         AssetID uint64   // 资产编号
  8.         Balance *big.Int // 数量
  9. }
复制代码
账户Account里其它属性此篇文章暂不讨论,这里重点看的是Balances这个属性,其保存了一个账户下面的所有资产信息,每一笔资产就是一个AssetBalance对象,包含资产编号以及拥有的数量,这些属性都同账户里的其它属性一同作为状态保存在链内,通过获取账户信息就能一次性获取所有这个账户拥有的资产,这跟你拥有ERC20资产不同,原则上想看自己有没有某种资产,必须要先获取ERC20合约地址,然后再去查询,如果你拥有100种ERC20资产,想要把所有资产都列出来,麻烦之极。
  • 原生资产如何扩展成协议资产

通过给原生资产绑定合约(AssetObject中的Contract属性即是用来绑定合约的),它就可以转变为一个协议资产,协议资产的如何流通可以在合约中根据业务来自行定义,但依然保留了原生资产的安全性,即:无论合约代码里漏洞有多少,作恶者都影响不了你账户下的此种原生资产,只有你自己才有权限来操作你的资产。而对那个绑定的有漏洞的合约,只要替换成新的安全的合约就行。这相比ERC20合约,都是巨大的进步,因为只有这样,才能真正保护用户的资产安全,让用户放心使用此资产,不必担心一夜归零。
  • 关于原生资产的用途的实践和畅想

  • 目前在FT公链上,当项目方发行原生资产后,用户使用原生资产所产生的手续费,其80%的比例将会分给发行方,这是对Token发行方为链做出贡献的一种激励,希望通过这种激励能促进FT生态更加快速健康的发展。而这种价值在底层的一次分配能实现的原因就是我们采用了原生资产后,使得矿工在打包交易的时候,能够轻松的识别出此交易是否是在操作资产,然后根据预先设计好的共识完成价值的一次分配。关于这一点,无论是ERC20还是Nervos的Cell模型都是无法做到的。
  • 在拥有和平台币同等地位后,就可以进一步往平台币的功能靠拢了,现在咱们做个大胆的假设,假如有Facebook这样的项目方想在FT公链上构建它的原生代币FB,它首先会面临一个问题,就是除了向他的用户普及它的FB之外,还要连带普及FT这个平台币,因为不得不用FT这个平台币作为手续费,但这无疑会加大其平台上用户的认知成本和使用成本,除了自己搞条链,还能怎么办?不用担心,有了原生资产后,矿工可以用原生资产作为手续费,即只要矿工愿意接受FB作为手续费,那这笔交易就无需涉及FT也能被打包,对Facebook用户来说,也就不需要再去了解一种叫FT的币了,Facebook的问题就解决了,有人可能会觉得,如果像这样,岂不是对FT的价值提升很不利嘛,对FT社区用户会不会不公平,我给出的答案是不会,为什么?让我们我们继续分析下去:

  • 当这些实力强劲的项目方为了让自己的币可以用来支付手续费,他们需要解决两件事:一是去说服其它矿工接受他们的币,二是让自己也拥有矿工节点,而FT公链采用了DPoS机制,可出块的矿工数量是21个,所以想要成为矿工节点是需要竞争的,谁的得票数高谁就能入选,因此项目方会有强烈的获取更多FT的需求,这样通过项目方彼此竞争便可让FT价值提升。
  • 除了通过节点竞争提升FT价值外,我们还可以尝试增加一种转账费率,如果转账的资产不是FT,譬如就是FB,则需要支付0.1%的转账费率给平台,即假设Alice给Bob转1000FB的话,则Alice需要额外支付1FB给平台,平台拿到这些手续费后,便可按比例分给FT持有者,这样就会使得FT拥有了价值捕获的能力,FT本身的价值就会大大提升,而FT价值越高,链的安全性也就会越高。当然,这个功能,也是必须要通过原生资产来实现的。


回复

使用道具 举报

2019-10-11 15:41
显示全部楼层
应该多写些FM的东西
回复 支持 反对

使用道具 举报

2019-11-23 12:20
显示全部楼层
不错,多发些科普型的技术类文章
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 一键登录: