“QuarkChain技术揭秘系列”目前暂告一段落,激发了广大朋友、尤其是程序员们的极大兴趣。今天,我们推送一篇新角度的技术性文章,欢迎大家讨论。
注意:单根区块链支持多种原生代币,该功能正在开发中。
痛点分析
随着区块链技术的发展,每个人都可以通过支付原生代币(例如ETH)在公链上部署标准智能合约,然后运行该智能合约产生新的代币(为了区别一般称作合约代币)。其中一个最熟悉的例子是基于以太坊的ERC20标准的代币(在本文的陈述中,在不失普适性的基础上,我们将类似ETH功能的代币当做原生代币,将基于智能合约产生的代币叫做ERC20代币或合约代币。有些地方也把本文的原生代币称为coin,把本文中的合约代币称为token)。接下来我们讨论这种ERC20代币与原生代币相比的局限性和痛点。
01
痛点1:目前通过合约代币来实现的智能合约操作,实施起来会很复杂
目前,通过ERC20代币支付去中心化的服务或购买应用是其主要用途之一。 例如,用户可支付QSP(ERC20代币)购买Quantstamp审计服务(https://quantstamp.com/qsp-network/instructions)。或者运行某一众筹智能合约通过接受一种ERC20代币付款,自动分发(销售)新ERC20代币。
如果用ETH来购买某种服务,用户可以直接对智能合约转账,通过支付来自动完成整个交易。可是用ERC20代币执行此类交易则与通过ETH来执行有所不同。一个在使用ERC20代币执行此类交易中经常出现的错误,就是用户直接将ERC20代币发送至智能合约地址。 这仅会修改ERC20地址的余额,并未触发智能合约的功能(例如,获得某种计算服务)。如果发生该错误,用户会有退款或其他需求(因为付出了却没有收获),智能合约的所有者可能需要手动完成剩余操作,或是手动触发合约继续执行,导致双方都苦不堪言。
通过支付ERC20代币进行智能合约交易的正确方法通常包括以下步骤:
调用原始ERC20智能合约的approve()命令,并提供目标智能合约地址作为spender,填入转出金额,等待审批。
调用目标智能合约(例如,使用QSP中的requestAudit()命令)以完成用上一步的ERC20代币进行支付的交易。
与直接发送ETH到智能合约地址进行的一步付款相比,上述的两步付款方案相当不便。 此外,如果通过ERC20代币对同一智能合约执行多次付款,有可能导致一种叫做the allowance double-spend exploit的潜在威胁。
02
痛点2:通过合约代币触发的智能合约交易,仍然需用原生代币来支付交易费用
要用ERC20代币进行智能合约交易,用户必须同时支付ERC20代币和ETH作为手续费。 这意味着,在进行交易之前,用户必须确保两种代币都有足够余额,这也增加了交易的复杂度。
解决方案:
在单根区块链上启用多种原生代币
基于对上述痛点的分析,我们认为,如果单条区块链能够支持多种原生代币,Dapp和用户均可从中受益。
只要用户愿意支付足够的手续费(由已经存在原生代币来支付),任何用户都能够创建一种新的原生代币;
通过使用原生代币用户可使用一步支付来访问智能合约并触发合约自动完成剩余功能;
用户可用任何原生代币支付交易手续费。
在下文中,我们将详细阐释如何改造现有的数据结构以实现这些令人振奋的功能。
01
代币id的设计
每个原生代币都会有一个以0开头代币id。代币id为0的原生代币称为创世原生代币(例如,ETH或QKC)。每个用户帐户(以基于帐户(account)的区块链模型为例),原余额字段(最初只是存储单个数值),新的余额字段中将是一系列的代币id =>余额的映射(可能由Patricia Trie来实施),这里将包含该用户的所有原生代币的余额。
02
使用不同的原生代币进行交易
除了gasPrice,startGas,value等常用字段外,每笔交易还将包含两个新的字段:
gasTokenId:一个整数字段,表明使用哪一原生代币支付手续费;
transferTokenId:一个整数字段,表明将哪个原生代币传输到目标地址。
即使每次交易都有不同的gasTokenId,矿工也可以自由地在一个区块中包含任何有效的交易。然而,为了最大限度地提高矿工的经济效益,需要通过对价值进行排名来按顺序打包交易,这可以通过连接到外部oracle定价来源(例如交易所)并评估该笔交易的价值(例如, gasPrice * gasUsed * tokenFiatPrice)。
03
创建新的原生代币
任何用户都可按照下列步骤创建一种新的原生代币:
提交一笔原生代币创建的交易,其中包括:gasPrice, gasTokenId,总供给量,创世地址等交易参数;
当该笔交易被执行时(被打包到区块中),将产生如下的结果:a)增加一个称之为代币id计数的全局参数,返回值作为新的代币id; b)修改该代币id关联的创世地址的余额为总供给量; c)返回“成功”信息以及新代币的id。
04
支持多种原生代币的虚拟机
我们将在虚拟机中添加几个运算码以支持多种原生代币:
GAS_TOKEN_ID,返回用于支付手续费的代币id参数,其在一笔交易中是不变的;
TRANSFER_TOKEN_ID,返回用于转移价值的代币id参数;
XCALL,XDELEGATECALL等,我们需要这些参数来改变子程序的TRANSFER_TOKEN_ID。
大多数智能合约可能不需要关心GAS_TOKEN_ID。但是,如果TRANSFER_TOKEN_ID不匹配(其必须是用于付款的代币id),它可能会导致交易被退回。 此外,借助XCALL运算码,智能合约能够以不同标的进行价值转移,从而轻松实现众筹和去中心化交易所等功能。
其他想法讨论
对功能进行进一步提升的思路:
使用字符串作为代币id,例如:apple,orange的字符串。
原生代币能识别地址格式。 我们可以通过添加代币信息来丰富地址信息,简化交易过程。例如,键入“apple:0xabc”,意为:使用原生代币apple来向oxabc地址进行支付,并使用创世原生代币支付手续费。
未来我们可能还需要一些特殊的功能,比如:用户a发行了新的原生代币; 之后,可以更改原生代币的所有者为用户b。这些功能将允许原生代币的创建者根据不同时期的通胀需要调整或者修改原生代币的总供给量。
总结
在本文中,我们阐述了如何在区块链网络中支持多种原生代币,以便用户可以方便的创建新的原生代币并用其支付交易手续费。 支持多种原生代币可以极大地增强现有Dapp的功能,丰富他们token的使用场景。我们相信这将是下一代区块链的一个重要特性。
往期回顾
QuarkChain技术揭秘 第一话:分片遇上区块链QuarkChain技术揭秘 第二话: 分片技术在区块链应用中的挑战QuarkChain技术揭秘 第三话:状态分割
扫描二维码,加入QuarkChain官方微信群
输入链接,加入QuarkChain各大社区
Telegram全球社区: https://t.me/quarkchainio
Telegram中文社区: https://t.me/QuarkChain_ZH
Twitter: https://twitter.com/Quark_Chain
Weibo: http://weibo.com/QuarkChain
Reddit: https://www.reddit.com/r/quarkchainio/
Medium: https://medium.com/quarkchain-official
Steemit: https://steemit.com/@quarkchain
Facebook: https://www.facebook.com/quarkchain/
Discord:https://discord.gg/aZDWcwV
点击“阅读原文”登陆官网
领取专属 10元无门槛券
私享最新 技术干货