连载:Qtum量子链设计文档-- 新增RPC调用(七)

量子链Qtum2018-07-11 12:24:57  阅读 -评论 0

连载:Qtum量子链设计文档-- 新增RPC调用(七)点击上方蓝字关注QTUM公众号,了解最新行业资讯

连载:Qtum量子链设计文档-- 新增RPC调用(七)

以下内容整理来自Qtum量子链吴明

Qtum原始设计文档汇总(7)-- Qtum新增RPC调用

Qtum的核心程序qtumd运行了包括验证和创建区块在内的所有核心逻辑。然而,要实现和qtumd的交互,需要借助于RPC(Remote Procedure Call,即远程过程调用)。通过RPC可以从外部实现与qtumd进行交互,实现收发QTUM,获取区块链信息等基本功能。

初始版本的Qtum RPC调用与比特币保持兼容。在此基础上,由于Qtum区块链与比特币有所不同,且Qtum支持比特币所不具备的智能合约功能,因此需要增加新的RPC,或对已有的RPC进行改进,从而实现与Qtum节点的完全交互。

以下截取部分早期Qtum开发团队针对Qtum RPC调用的相关原始设计文档(附中文翻译)(ps:文档中QTUM<#>或QTUMCORE<#>为内部设计文档编号):

QTUM-35: Add RPC call for off-chain contract execution Description: In Ethereum there are some contract's that can be executed without needing to be on the blockchain. This is useful especially for retrieving the status and results from a contract, and will make no changes to the on-chain storage or state. We should add an RPC call to cover this functionality    callcontract [address] [data] returns/prints hex encoded return data task:添加链下合约运行的RPC(远程过程调用)调用 描述:以太坊中有些合约不在区块链上也能运行,这一点很有用,尤其是在检索合约的状态和结果时,并且不会改变链上的存储和状态。我们应该添加一个RPC调用来实现这个功能。    callcontract [address] [data] 返回/打印十六进制编码的返回数据

QTUMCORE-14: Add "callcontract" RPC call for off-chain computations Description: There should be an RPC call that executes a contract without requiring interaction with the blockchain network, and thus without gas or other fees. callcontract contract-address data (sender) This should execute the contract locally, and if the contract function returns data, it should be returned/printed by the RPC call. Sender is optional and does not require an owned vout (it can be any valid address) Task:添加用于链下计算的“callcontract”RPC调用 描述:应该有一种不需要和区块链网络进行交互就能运行合约的RPC调用,因此它也不需要gas或其他费用。 格式如下: callcontract contract-address data (sender) 它可以在本地运行合约,并且如果合约函数返回了数据,该RPC调用可以返回/打印该数据。sender(发送方)是可选的并且不需要拥有vout(它可以是任何有效的地址)。

上述两个任务添加了callcontract RPC调用接口,从而实现本地链下调用合约,方便查看合约状态或者获得合约结果,并且不会改变任何链上信息。

QTUMCORE-7: Add "createcontract" RPC call Description: A new RPC call should be added call "deploycontract" "createcontract". This RPC call will be used to deploy a new smart contract to the Qtum blockchain. Syntax: deploycontract createcontract gas-price gas-limit bytecode [sender-address] [txfee] [broadcast] sender-address is optional. If no address is specified, then it should be picked randomly from the wallet. If no outputs exist to spend using that sender-address, then an error should be shown and no transaction created. txfee is optional and if not specified should use the same auto txfee as the rest of the wallet (for example sendtoaddress uses an auto txfee) broadcast should default to true. If broadcast is false, then the transaction is created and signed, and then printed to the screen in hex rather than broadcast to the network. If the sender-address does have an output, but it is not enough to cover the gas costs and tx fees, then any UTXO owned by the wallet should be used by the transaction to cover those fees. (not all funds must come from sender-address, but the sender-address must be vin[0]) After execution, if broadcast is true, it should print the txid and the new contract address. Task:添加“createcontract”RPC调用 描述:添加“createcontract” RPC调用,该PRC调用将用于在Qtum区块链上部署新的智能合约。 语法: createcontract gas-price gas-limit bytecode [sender-address] [txfee] [broadcast] 其中,sender-address(发送方地址)是可选的。如果没有指定地址,那么将会从钱包中随机选择一个地址。如果使用的sender-address中没有可花费的outputs,那么将显示出错,并且交易不会创建。 txfee(交易费用)是可选的,如果没有指定,应该使用和钱包其他部分相同的自动的txfee(例如sendtoaddress使用的自动的txfee) broadcast(广播)应该默认为true。如果broadcast为false,那么该交易被创建和签名,并且将以十六进制的形式打印到屏幕上,而不是广播到网络中。 如果sender-address确实有一个output,但是它不够覆盖gas费用和交易费用,那么该钱包拥有的任何UTXO都可以被该交易用于支付这些费用。(不是所有的资金都必须来自于sender-address,但是sender-address必须是vin[0]) 运行后,如果broadcast为true,则打印交易id和新的合约地址。

上述任务增加了用于创建和部署新智能合约的RPC调用createcontract,并描述了参数的具体含义,及其对应的行为。

QTUMCORE-13: Add "sendtocontract" RPC call Description: An rpc call should be adding for sending data and (optionally) money to a contract that has been deployed on the blockchain. The format should be: sendtocontract contract-address data (value gaslimit gasprice sender broadcast) This should create a contract call transaction using OP_CALL. Value defaults to 0. sender-address is optional. If no address is specified, then it should be picked randomly from the wallet. If no outputs exist to spend using that sender-address, then an error should be shown and no transaction created. broadcast should default to true. If broadcast is false, then the transaction is created and signed, and then printed to the screen in hex rather than broadcast to the network. If the sender-address does have an output, but it is not enough to cover the gas costs, tx fees, and value, then any UTXO owned by the wallet should be used by the transaction to cover the remainder. (not all funds must come from sender-address, but the sender-address must be vin[0]) After execution, if broadcast is true, it should print the txid and the new contract address. Task:添加“sendtocontract”RPC调用 描述:为了发送数据或资金给已经部署在区块链上的合约,应该添加一个RPC调用。 格式应该为: sendtocontract contract-address data (value gaslimit gasprice sender broadcast) 可使用OP_CALL创建合约调用交易。 value默认为0. sender-address(发送方地址)是可选的。如果没有指定address,那么将从钱包中随机选择一个地址。如果sender-address中没有可花费的outputs,那么将显示出错并且不创建交易。 broadcast(广播)默认为true。如果broadcast为false,那么该交易被创建和签名,然后以十六进制的形式打印到屏幕上,而不是广播到网络中。 如果sender-address确实有一个output,但是该output不足以覆盖gas费用,交易费用以及value值,那么该钱包拥有的任意UTXO可以被交易用于支付剩余的费用。(不是所有的资金都必须来自于sender-address,但是sender-address必须为vin[0]) 运行后,如果broadcast为true,就应该打印交易id和新的合约地址。

为了实现链上调用合约,上述任务添加了sendtocontract RPC调用。其功能与callcontract类似,都可用于运行合约。最大的区别在于,sendtocontract实现链上调用,即需要耗费Gas费用,并且运行结果需要经过全网节点验证,且会改变合约链上存储状态。

QTUMCORE-81:create getTransactionReceipt rpc call Description:We need to create getTransactionReceipt rpc call that returns the same values as here: https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgettransactionreceipt Most important part is the logs. they can either be stored into a separate db or use one of the existing tx or eth related db. Task:创建getTransactionReceipt RPC调用 描述:我们需要创建getTransactionReceipt RPC调用,其返回的值和下列链接中相同: https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgettransactionreceipt 最重要的部分是日志。它们可以存储在一个单独的数据库中,也可以使用现有的交易或以太坊相关数据库。

上述任务针对智能合约日志添加了gettransactionreceipt RPC调用,用于获取合约交易相关日志,这对了解智能合约状态非常有用。

QTUMCORE-90: add searchlogs rpc call Description: we need to add an rpc call to allow us to search the eth event logs, we need to support similar parameters as eth: https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter so it would be: searchlogs(fromBlock, toBlock, address, topics) fromBlock, toBlock should support latest keyword adderss: optional should be an array of one or more addresses topics: optional (check the link above) unlike eth where you have to call watch, this method should just output the filtered logs Task:添加searchlogs RPC调用 描述:我们需要添加一个允许搜索智能合约event日志的PRC调用,且需要支持类似于以太坊的参数: https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter 因此它的形式如下:searchlogs(fromBlock, toBlock, address, topics) fromBlock,toBlock应该支持最新的关键字 address:可选的,一个或多个地址的数组 topics:可选的(参考上面的链接) 不同于以太坊中需要调用watch,该方法只输出过滤后的日志。

上述任务添加了用于检索智能合约event日志的RPC,方便筛选满足条件的event日志。用户可以快速获取他们关心的合约状态。

QTUMCORE-92: add getcode and getstorageat rpc calls Description: We need to implement Qtum equivalent of these 2 rpc calls: https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgetcode https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgetstorageat No need to implement callback function for now. For the default block, we can use block number, or keyword "latest" (default) Task:添加getcode和getstorageat RPC调用 描述:我们需要实现Qtum版本的和以下两个RPC等效的RPC调用: https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgetcode https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgetstorageat 目前不需要实现回调函数。 对于默认的区块,我们可以使用区块编号,或者关键字“latest”(默认)

上述任务实现了与以太坊类似调用等效的RPC,用于获取合约代码和存储信息。

QTUMCORE-97: Change validation of contract rpc calls inputs Description: Change validation of contract rpc calls inputs to accept only hex Task:修改对合约RPC调用输入值的验证 描述:修改对合约RPC调用输入值的验证为只接受十六进制。

上述任务规定验证合约的RPC只接收十六进制数据参数,使rpc接口尽量保持一致。

QTUMCORE-123: Add "excepted": to gettransactionreceipt Description: We need to add the "excepted": field to gettransactionreceipt rpc call which lists "None" if no exception occured, or lists the actual exception that happened. The same behaviour is in callcontract call. We need the change to be backward compatible, which means it should not break the current logs db, but people who want to see exceptions would have to recreate/reindex the logs db Task:在gettransactionreceipt中添加“excepted”:字段 描述:我们需要在gettransactionreceipt RPC调用中添加“excepted”:字段,如果没有发生异常它会显示“None”,否则列出实际发生的异常。 Callcontract调用也是一样。 我们需要修改为向前兼容的,这意味着它不能破坏当前的日志数据库,但是如果想查看这些异常,则必须重建/重新索引日志数据库。

上述任务使得与智能合约相关的若干RPC能够抛出异常,方便使用者了解合约得错误运行状态,也有助于开发人员调试代码。

QTUMCORE-124: Add "changeToSender" to sendtoaddress and make sure the "Don't use change address" option also affects sendtoaddress Description: We need to add "changeToSender" parameter to sendtoaddress rpc call, same as we did for sendtocontract. Also we need to make sure the "Don't use change address" also affects sendtoaddress Task:添加“changeToSender”到sendtoaddress,并且确保“Don't use change address(不使用找零地址)”选项对于sendtoaddress也有效 描述:我们需要添加“changeToSender”参数到sendtoaddress RPC调用中,同样也要添加到sendtocontract中。 我们也需要确保“Don't use change address(不使用找零地址)”选项对于sendtoaddress也有效

由于采用UTXO模型,合约调用的找零容易使用户感到困惑。因此上述任务为sendtoaddressRPC添加了“不使用找零地址”的选项,从此用户可以选择找零回原地址。

QTUMCORE-125: Add callcontract support to "createrawtransaction" rpc call Description: As requested by some exchanges, which use "createrawtransaction" to create raw transactions before signing on a cold wallet, we need to add 1- raw contract data support to "createrawtransaction" rpc call. Currently "createrawtransaction" supports two types of outputs in the outputs arguments: first is "address": x.xxx which created a standard P2PKH output the second is "data": "hex" which creates an OP_RETURN output we need to add: 1- "callcontract": {contractAddress:"address", data:"data", amount:"amount", gasLimit:"gaslimit", gasPrice:"gasPrice"} where: contractAddress: a valid contract address (valid hash160 hex data) data: the hex data to add in the OP_CALL output (should validate it's hex data, you can check the validation done in sendtocontract) amount (optional): the value of the output (value in QTUM to send with the call), should be a valid amount, default 0 gasLimit (optional): the gas limit for the transaction (same as in sendtocontract), defaults to the default/DGP value gasPrice (optional): the gas price for the transaction (same as in sendtocontract), defaults to the default/DGP value After parsing and validation all the values an OP_CALL output should be constructed Similar to this:  CScript scriptPubKey = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(nGasLimit) << CScriptNum(nGasPrice) << ParseHex(datahex) << ParseHex(contractaddress) << OP_CALL; Task:使“createrawtransaction”RPC调用支持callcontract 描述:一些交易所在冷钱包上签名之前,使用“createrawtransaction”来创建原始交易,应这些交易所的要求,我们应该添加: 1 -- 对“createrawtransaction”RPC调用的原始合约数据支持 当前,对于outputs(输出)参数,“createrawtransaction”支持两类outputs: 第一类是“地址”:x.xxx,它创建了一个标准的P2PKH output 第二类是“数据”:“十六进制”,创建一个OP_RETURN output 我们需要添加: 1 -- "callcontract": {contractAddress:"address", data:"data", amount:"amount", gasLimit:"gaslimit", gasPrice:"gasPrice"} 其中, contractAddress:一个有效的合约地址(有效的哈希160十六进制数据) data:添加在OP_CALL output中的十六进制数据(应该验证是否为十六进制数据,可以检查在sendtocontract中是否进行了验证) amount(可选的):output的值(在QTUM中的值,和该调用一起发送),应该为一个有效的数值,默认为0 gasLimit(可选的):交易的gas limit(和sendtocontract一样),默认为default/DGP值 gasPrice(可选的):交易的gas price(和sendtocontract一样),默认为default/DGP值 在对所有的值进行解析和验证后,应该构建一个OP_CALL output。 构建方法和下面类似: CScript scriptPubKey = CScript() << CScriptNum(VersionVM::GetEVMDefault().toRaw()) << CScriptNum(nGasLimit) << CScriptNum(nGasPrice) << ParseHex(datahex) << ParseHex(contractaddress) << OP_CALL;

在上述任务之前,createrawtransaction RPC调用与比特币一致,只能用于发送标准交易。Qtum将其扩展为兼容合约交易。自此,该RPC即可用于创建原始的合约交易,方便开发者或交易所使用。

小结

RPC调用是与qtumd核心程序进行交互的最重要方式,它提供了获取区块链上以及本地各种信息的调用接口,是钱包、浏览器、交易所等许多应用的基础。好的RPC接口设计能够使开发者获得更准确的信息,从而开发出功能更加丰富的应用。Qtum为开发者提供了完善的RPC调用,使得许多第三方应用(比如预测市场项目菩提)成为可能。

连载:Qtum量子链设计文档-- 新增RPC调用(七)


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

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

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

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

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

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

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

连载:Qtum量子链设计文档-- 新增RPC调用(七)

连载:Qtum量子链设计文档-- 新增RPC调用(七)

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

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

相关推荐

Bebt交易所:深入分析自动化做市商发展掣肘与设计改进

Bebt交易所:深入分析自动化做市商发展掣肘与设计改进

在基于区块链的分布式系统 (如 Ethereum) 上重构一个新的金融世界时,必须认识到区块链世界与链下世界相比,有着完全不同的动态属性。最值得注意的是,链上并非连续计时,而是通过区块来量化时间的流逝。但因为它受到区块大小的限制,这又导致了延迟问题和计算能力的限制。由于这些结构上的差异,分布式金融的设计者应该具有与中心化世界的设计者完全不同的思路。例如,由于区块链的成本和技术基础设施,做市商在基于

谁是更好的去中心化云存储?Filecoin vs Storj设计要点和实测PK

而真正能算得上在去中心化云存储赛道主战场上正面PK的重量级选手,其实只有Filecoin和Storj。

解构灰度比特币信托产品的设计原理

原文标题:解构灰度比特币信托原文作者:Ann Hsu | Chain Hill Capital首席指数分析师本文系Chain Hill Capital首席指数分析师Ann Hsu 撰写,未经授权严禁转

西班牙央行将评估数字货币设计提案,计划持续到2021年底

西班牙央行将评估数字货币设计提案,计划持续到2021年底

作为欧元区成员国之一,西班牙央行并不能单方面发行本国的主权CBDC。这项工作的预期结果将在2021年中期确定。

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

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

红枣科技何亦凡“BSN设计本源:对区块链未来的理解”

红枣科技何亦凡“BSN设计本源:对区块链未来的理解”

2020年9月16日,第三届中国国际区块链+商业未来发展峰会在鹭岛厦门国际会展中心圆满举行。本次峰会由厦门市人民政府、中国商业联合会、福建省数字福建建设领导小组办公室指导,厦门市工业和信息化局、福建省区块链协会、BSN发展联盟支持,熵链学派、思尔福智慧零售主办,链闻、Winkrypto联合主办。会议以"应用无界 创新价值"为主题,汇聚福建省各地级市政府有关部门负责人、行业权威专家、领军企业代表、创

比特币即将接入波卡,一文了解PolkaBTC的设计和路线图

2021 年初,Interlay 将推出 Polkadot 的首个无信任包装的比特币 PolkaBTC,这是波卡迈向真正互操作生态系统的关键一步。保险库是无需信任和担保的中介机构,确保在PolkaBTC存在的情况下,比特币仍被锁定在比特币网络上。

比特币有什么缺点?

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

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