深度解析Qtum量子链账户抽象层(Qtum AAL)

量子链Qtum2018-06-15 19:10:28  阅读 -评论 0

深度解析Qtum量子链账户抽象层(Qtum AAL)点击上方蓝字关注QTUM公众号,了解最新行业资讯

深度解析Qtum量子链账户抽象层(Qtum AAL)

Qtum账户抽象层(AAL)实现简析

Qtum设计上以比特币UTXO为基础账户模型,并实现了支持EVM规范的智能合约,这是通过账户抽象层(Account Abstract Layer, AAL)来完成的。AAL对UTXO账户和EVM合约账户之间进行了适配,这样通过AAL可以使用UTXO交易输出实现在链上创建智能合约,发送交易到合约账户用于触发合约的执行,完成执行后AAL最终对执行结果进行处理并适配至UTXO。由于采用了AAL,合约开发者不需关心对合约操作相关的UTXO转换细节,即可使用EVM的特性进行开发而且兼容现有以太坊的智能合约。本文通过对从UTXO交易到智能合约执行的实现代码进行解读,初略分析了AAL的工作过程。

1.UTXO交易新增的脚本操作码

Qtum 针对UTXO交易脚本新增了三个操作码OP_CREATE,OP_CALL和OP_SPEND,目的是用于为UTXO和EVM账户模型之间的转换提供操作支持。这些操作码定义在opcodetype枚举类型中:

enum opcodetype{            ……        OP_CREATE = 0xc1,          OP_CALL = 0xc2,            OP_SPEND= 0xc3,        ……        }

这个三个操作码分别有以下作用

OP_CREATE用于智能合约的创建;

OP_CALL用于合约的执行;

OP_SPEND用于合约余额的花费。

为了在区块生成过程中,识别并处理由这几个操作码控制的交易,在用于UTXO模型交易的类CTransaction中增加了HasCreateOrCall()和HasOpSpend()函数,用于新区块中对mempool中的交易处理,并在脚本操作码解析的EvalScript()函数中增加了相应的处理。

2.UTXO交易到EVM模型交易的转换

产生新的区块时,除了对UTXO交易进行常规的参数合法性、共识规则、DDOS攻击检查等之外,还需要使用操作码检查函数HasCreateOrCall()判断交易输出是否包含OP_CREATE或OP_CALL,分别对应着EVM需要执行合约创建或合约调用。这部分有以下的处理过程:

2.1 进行EVM模型的账号参数提取

合约在EVM的执行用到了data、gasPrice、gasLimit、VM version这几个参数,这些参数是通过RPC调用sendtocontract 发送的,sendtocontract会生成一个UTXO交易,并在交易输出中使用了OP_CALL操作码,之后交易会广播到区块链网络上。AAL中从UTXO到EVM的适配是通过QtumTxConverter类实现的,在这一步中该类的成员函数extractionQtumTransactions()和parseEthTXParams()完成对所有此类UTXO交易输出的参数提取。代码片段如下:

dev::Address receiveAddress;    valtype vecAddr;    
   if (opcode == OP_CALL)    {        vecAddr = stack.back();        stack.pop_back();        receiveAddress = dev::Address(vecAddr);    }              valtype code(stack.back());    stack.pop_back();    uint64_t gasPrice = CScriptNum::vch_to_uint64(stack.back());    stack.pop_back();    uint64_t gasLimit = CScriptNum::vch_to_uint64(stack.back());    stack.pop_back();    VersionVM version(CScriptNum::vch_to_uint64(stack.back()));    stack.pop_back();    
   return EthTransactionParams{version, dev::u256(gasLimit), dev::u256(gasPrice), code,                 receiveAddress }

以上代码首先判断如果opcode 为OP_CALL,则说明地址为vecAddr的合约已经创建,因此直接转换成EVM格式的地址receiveAddress,否则为OP_CREATE,对应合约的创建,没有该字段,所以不做提取。接下来依次完成了data、gasPrice、gasLimit、VM version的提取,这些都是EVM执行bytecode时必不可少的参数。

2.2 进行EVM账户模型的交易转换

交易转换是通过QtumTxConverter类的函数 createEthTX()完成,使用前面一步提取的参数和UTXO的交易输出vout创建了QtumTransaction类型的交易。由于QtumTransaction派生自EVM中的dev::eth::Transaction类,因此和EVM执行相关的操作QtumTransaction类都支持。

QtumTransaction txEth;
if ( etp.receiveAddress == dev::Address() ) {    txEth = QtumTransaction(txBit.vout[nOut].nValue, etp.gasPrice, (etp.gasLimit *     etp.gasPrice),     etp.code, dev::u256(0)); }
else{    txEth = QtumTransaction(txBit.vout[nOut].nValue, etp.gasPrice, (etp.gasLimit *    etp.gasPrice),     etp.receiveAddress, etp.code, dev::u256(0)); } dev::Address sender(GetSenderAddress(txBit, view)); txEth.forceSender(sender); txEth.setHashWith(uintToh256(txBit.GetHash())); txEth.setNVout(nOut);

首先代码etp.receiveAddress == dev::Address()判断该合约是EVM状态中没有而需要新创建的还是EVM状态已经包含的合约,差别只在于合约地址。然后,QtumTransaction()构造函数完成了部分的交易参数构造,接下来的语句提取交易的发送者(sender),之后设置交易HASH。一个UTXO交易支持多个输入和输出,Qtum的AAL设计考虑到了这种情况,因此AAL支持一个交易输出包含UTXO账号和合约账号,通过最后设置的nOut指示该交易的nOut输出是发送到智能合约的,所以该输出将触发合约执行。这样就按照EVM的账号模型完成了交易的转换。

3.合约执行及执行结果的UTXO转换

合约的执行会改变状态(由QtumState类的实例化对象globalState统一管理),对于合约的状态,Qtum沿用了EVM定义,所以能兼容所有的符合EVM规范的智能合约。但是账户金额的转移(transfer),Qtum做了UTXO的转换,这意味着智能合约和普通的UTXO模型账号之间能完成交互,这是AAL实现UTXO支持智能合约的重要的一环。下面简要介绍一下合约执行和状态结果的转换过程。

3.1 合约执行环境构建及合约执行

合约的执行是对合约处理中很关键的一步,直接对合约的状态产生影响。通过ByteCodeExec类实现了EVM对合约bytecode的执行,主要函数是performByteCode()。这一步的主要流程是使用上面提取的交易参数,来进行虚拟机执行环境的构建,之后完成合约的执行,其代码如下:

for(QtumTransaction& tx : txs){    dev::eth::EnvInfo envInfo(BuildEVMEnvironment());    std::unique_ptr<dev::eth::SealEngineFace>   se(dev::eth::ChainParams(dev::eth::genesisInfo(dev::eth::Network::HomesteadTest)).    createSealEngine());    
   if(!tx.isCreation() && !globalState->addressInUse(tx.receiveAddress())){        dev::eth::ExecutionResult execRes;        execRes.excepted = dev::eth::TransactionException::Unknown;        result.push_back(ResultExecute{execRes, dev::eth::TransactionReceipt(dev::h256(),        dev::u256(), dev::eth::LogEntries()), CTransaction()});      
       continue;    }    result.push_back(globalState->execute(envInfo, *se.get(), tx, type, OnOpFunc())); }

首先是构建合约执行环境,由BuildEVMEnvironment()完成。可以看到这个执行环境是针对每个独立交易进行的,这样就最大限度的把不同交易的合约执行过程隔离开,避免合约执行过程中的交叉影响。然后构建一个新的sealEngine类,该类是EVM执行引擎,由createSealEngine()函数具体完成。中间对出现的可能状态异常进行检查,之后globalState->execute()完成合约的执行,这里使用到了构建的执行环境envInfo和EVM执行引擎se。

3.2 合约执行结果的UTXO转换

合约执行完成后的结果保存在vector<ResultExecute> result,vector向量理记录了每个合约执行产生的EVM账户间transfer关系,AAL通过把这些transfer转换成UTXO交易,完成了从EVM账户模型到UTXO模型交易的转换。这一处理是通过processingResults()函数实现的,以下是代码片段。

ByteCodeExecResult resultBCE;
for(size_t i = 0; i < result.size(); i++){    
   if(result[i].execRes.excepted != dev::eth::TransactionException::None){        
     if(txs[i].value() > 0){            CMutableTransaction tx;            tx.vin.push_back(CTxIn(h256Touint(txs[i].getHashWith()), txs[i].getNVout(), CScript() <<            OP_SPEND));            CScript script(CScript() << OP_DUP << OP_HASH160 << txs[i].sender().asBytes() <<            OP_EQUALVERIFY << OP_CHECKSIG);            tx.vout.push_back(CTxOut(CAmount(txs[i].value()), script));            resultBCE.valueTransfers.push_back(CTransaction(tx));        }    } else {        resultBCE.usedFee += CAmount(result[i].execRes.gasUsed);        CAmount ref((txs[i].gas() - result[i].execRes.gasUsed) * txs[i].gasPrice());      
        if(ref > 0){            CScript script(CScript() << OP_DUP << OP_HASH160 << txs[i].sender().asBytes() <<            OP_EQUALVERIFY << OP_CHECKSIG);            resultBCE.refundOutputs.push_back(CTxOut(ref, script));            resultBCE.refundSender += ref;        }    }    if(result[i].tx != CTransaction()){        resultBCE.valueTransfers.push_back(result[i].tx);    }}

首先定义了ByteCodeExecResult类型的resultBCE变量,用于保存转换的结果。使用操作码OP_SPEND,用于实现交易的花费,这是因为比特币的UTXO通过私钥签名在交易输入解锁后来实现余额花费的,而EVM执行涉及不同账户之间的transfer,所以需要通过OP_SPEND实现这些transfer到UTXO模型交易的转换。如果execRes.excepted不为None,即合约执行异常,则将余额返还给合约调用者。否则,如果没有异常,则将扣除消耗的gas之后的剩余gas返还给合约的调用者。对于合约执行中出现的transfer其UTXO交易保存在result[i].tx中。因此,经过这一步处理合约执行产生的不同UTXO账户之间的交易就保存在valueTransfers向量中了,最终这些交易会包含进新的区块中。至此AAL模块就完成了从EVM交易到UTXO的转换。

4.总结

AAL通过新增的UTXO脚本操作码,协助完成合约的创建、执行和花费。在合约创建和执行前,需要进行UTXO交易到EVM模型交易的转换,之后使用构建的EVM执行环境和引擎,完成合约的执行。AAL最终对合约的执行结果进行处理并从EVM适配至UTXO,这样就实现了基于UTXO的智能合约。AAL使得Qtum兼容符合EVM规范的智能合约,为Dapp提供一个新的基础平台,同时UTXO的优点使得诸如并行处理、隐私性等优点能得以保留。

深度解析Qtum量子链账户抽象层(Qtum AAL)现任Qtum 核心开发人员以及研究员,本科毕业于华中科技大学,并且在中国科学院取得了研究生学位。加入Qtum之前已从事多年无线网络(包括4G LTE和无线自组织网络)算法和协议栈开发;2015年起开始接触区块链技术,曾参加过万向区块链组织的第一届黑客马拉松比赛。

深度解析Qtum量子链账户抽象层(Qtum AAL)

关注Qtum量子链(qtumchain)公众号,回复关键字查阅Qtum量子链相关资料,以下是部分文档关键字

回复:‘白皮书’,查看《Qtum量子链白皮书,设计原理,实现方案,及应用》

回复:‘未来’,查看《Qtum量子链未来2年技术路线规划-简略版》

回复:‘指南’,查看《首篇Qtum量子链区块链开发指南系列面世》

回复:‘专访’,查看《Nasdaq专访Qtum:区块链会成为世界最大的信任服务商》

回复:‘文档’,查看英文版本《Qtum量子链实现文档》

回复:‘中文文档’,查看中文版本《Qtum量子链实现文档》

深度解析Qtum量子链账户抽象层(Qtum AAL)

深度解析Qtum量子链账户抽象层(Qtum AAL)



声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们kefu@lianshijie.com

参与讨论 (0 人参与讨论)

相关推荐

PlatON创新研究院夏伏彪解析隐私计算技术

今天,PlatOn创新研究院的夏博士为我们解析隐私计算的各项技术。差分隐私这个技术的使用场景相对比较有限。同态加密需要解决的一个核心问题是可以支持任意类型的计算。

Circle的高收益USDC商业账户瞄准DeFi

Circle的高收益USDC商业账户瞄准DeFi

但在2020年11月5日,Circle宣布了新的高收益账户,可能会鼓励账户持有人将资金保留在CeFi中。在周四的推特中,Circle宣布了新的计息商业账户的候选名单。Circle的产品只是更广泛的CeFi与DeFi趋势中的最新产品。

彻底读懂零知识证明及其实现方法:解析zk-SNARK

我们已经越来越频繁地见到zk-SNARK,我们还会更多地遇到它。大家都知道它是一种实现零知识证明的方法,也知道它是扩容和隐私方向的利器,但究竟什么是零知识证明,zk-SNARK 是如何实现零知识证明的?

72 小时抢滩登陆,解析 PayPal 的「加密大计」

72 小时抢滩登陆,解析 PayPal 的「加密大计」

作者:张改娟虽然美股三季度财报季渐入高潮,但是支付巨头 PayPal 却凭借着对加密货币市场的「突然袭击」在本周内抢尽了风头。周三(10 月 21 日) PayPal 一纸直接入局加密货币市场的公告直接将比特币推至近 15 个月新高并带动公司股价一度大涨近 5% 的短短 48 小时后,今日(10 月 23 日)其又被爆出正在洽谈收购包括加密托管服务公司 BitGo 等在内的多家加密公司。PayPa

Qtum 量子链提速计划:区块时间从2分钟提速至16秒

从上线开始,Qtum 量子链的目标区块间隔一直为128秒。对于Qtum主网,孤立区块出现的概率目前为2%至3%。致谢作者感谢Qtum 量子链基金会的领导层和核心开发团队为减少区块间距而进行的架构设计。

干货 | 全面解析“数字经济”

干货 | 全面解析“数字经济”

什么是数字经济?数字经济,是以数字化知识和信息为关键生产要素,以现代信息网络为重要载体,以信息通信技术的有效使用为重要推动力,促进效率提升和经济结构优化的一系列经济活动,是一种全新的经济形态。近年来,随着新一代信息技术不断突破和广泛应用,数字经济正在突破时空局限和产业界限,打破传统企业边界和成长规律,颠覆传统商业模式和资源利用方式,加速向经济社会各领域、各环节渗透和覆盖,日益成为经济发展的重要引擎

全面解析 CeFi 双币理财:理财与期权结合的风险对冲方法

双币理财借鉴了传统金融模式加密货币领域各大 CeFi 机构目前推出的双币类理财产品其实是借鉴传统金融市场结合加密市场现状演变出的一种理财形式。美元产生的收益和本金以美元作为双币理财产品整体收益的形式进行返还。

比特币有什么缺点?

1.交易平台的脆弱性。比特币网络很健壮,但比特币交易平台很脆弱。交易平台通常是一个网站,而网站会遭到黑客攻击,或者遭到主管部门的关闭。2.交易确认时间长。比特币钱包初次安装时,会消耗大量时间下载历史交易数据块。而比特币交易时,为了确认数据准确性,会消耗一些时间,与p2p网络进行交互,得到全网确认后,交易才算完成。3.价格波动极大。由于大量炒家介入,导致比特币兑换现金的价格如过山车一般起伏。使得比

麦妖榜
更新日期 2019-09-03
排名用户贡献值
1牛市来了30910
2BitettFan24187
3等待的宿命23810
4区块大康20369
5六叶树20310
6linjm122719429
7天下无双16192
8lizhen00215280
9让时间淡忘14586
10yelanyi050511349
返回顶部 ↑