熵消耗机制

介绍

本文介绍Vision中智能合约执行和部署时的熵(entropy)消耗模型。

术语表

术语定义
OriginEntropyLimit合约部署者可提供消耗的熵
CallerEntropyLimit合约调用者可提供消耗的熵,当部署合约时,等价于 OriginEntropyLimit
TotalEntropyLimitOriginEntropyLimit + CallerEntropyLimit
EntropyLimitOfFeelimitFeelimit / 10 VDT (主网及官方测试网的 entropy 单价均是 10 VDT, 私有网默认是 100 VDT)。
FeeLimit 在创建合约或调用合约时提供。
EntropyLimitOfAccount用户 freeze 获得的熵剩余 + (Balance of VS / 10 VDT)。
即用户所能支付的最多熵。

部署合约

如果 合约部署所需熵 <= min(EntropyLimitOfFeelimit, EntropyLimitOfAccount),则合约可以成功部署。 否则,会出现 OUT_OF_ENTROPY 错误。

触发调用合约

当 consume_user_resource_percent = 100(用户支付的资源比例),调用方支付操作的全部费用。 调用方需要满足:

调用合约所需熵 <= min(EntropyLimitOfFeelimit,EntropyLimitOfAccount)

从而成功调用合约。 否则,会出现OUT_OF_ENTROPY 错误。

当 0 <= consume_user_resource_percent < 100 时,这表示操作成本由合约部署者和调用者按比例支付。 如果合约部署者有足够的熵,调用方需要满足:

  • 调用者所需熵 = 调用合约所需熵 * consume_user_resource_percent / 100
  • 调用者所需熵 <= min(EntropyLimitOfFeelimit, EntropyLimitOfAccount)

对于合约部署人员(开发者):

开发者所消耗熵 = 调用合约所需熵 *(100 - consume_user_resource_percent)/ 100

其中 开发者所消耗熵 <= OriginEntropyLimit .

如果开发人员的熵不足,则所有的熵消耗由调用者支付,并且不消耗开发者的VS。 也就是说,调用者需要满足:

调用合约所需熵 <= min(EntropyLimitOfFeelimit,EntropyLimitOfAccount) + DeveloperProvideEntropy

为了成功调用合约,DeveloperProvideEntropy <= OriginEntropyLimit 。 否则,会出现OUT_OF_ENTROPY 错误。

合约执行

执行合约方法时,OUT_OF_ENTROPY 可以根据 API 查看详细信息。 调用/walletsolidity/gettransactionInfoByID接口,并将返回的resMessage字段从十六进制转换为字符串。

resMessages包括:执行“AND”操作的熵不足:curInvokeEntropyLimit[1000],curOpEntropy[3],usedEntropy[1000] 类似信息。

术语定义
curInvokeEntropyLimit表示最大能耗, 即 min(EntropyOfFeelimit,EntropyOfAccount).
curOpEntropy运行当前指令需要的熵。
usedEntropy触发合约已经使用的熵。

能源不足解决方案

如果EntropyOFAccount < curInvokeEntropyLimit,表示调用方剩余熵和VS余额不足,需要给VS充值。

如果EntropyOfFeelimit < curInvokeEntropyLimit,表明费用限额设置太小,需要增加费用限额。 最高费用限额为1000 VS。

消费过程

  1. 根据合约中设置的 consume_user_resource_percent 比率,消耗合约创建者从冻结VS获得的熵。如果熵不足,继续消耗合约创建者的剩余熵。任何剩余的能源短缺都由合约调用者提供。

  2. 合约调用者者消费过程:(首先消耗呼叫者通过冻结VS获得的熵,以确保合约可以正常执行,并且通过销毁VS来抵消不足部分)。

3 如果合约创建者未冻结能源资源的VS,则呼叫者需要所有消费。

专业术语

术语解释
合约创建者即创建合约的账户
合约调用者即调用合约的账户
Entropy智能合约运行时每一步指令都需要消耗一定的资源,资源的多少用entropy的值来衡量。
Freeze冻结,即将持有的vs锁定,无法进行交易,作为抵押,并以此获得免费使用entropy的权利。具体计算与全网所有账户冻结有关,可参考相关部分计算。
Fee Limit用户在调用或者创建智能合约时,指定的最高可接受的vs费用消耗,包含消耗冻结获得资源的vs 和消耗用户本身持有的vs两部分,优先使用冻结资源。
Call Value用户在智能合约调用或创建时给智能合约本身的账户转账的vs数量,在判断feelimit的时候会抛去这部分的值。
consume_user_resource_percent对于一个智能合约来说,付费是由两大部分组成的。一部分是合约开发者付费,另一部分是由合约调用者支付。这个值是调用者付费的比例。
origin_entropy_limit开发者设置的在一次合约调用过程中自己消耗的entropy的上限,必须大于0。对于之前老的合约,没有提供设置该值的参数,会存成0,但是会按照1000万entropy上限计算,开发者可以通过updateEntropyLimit接口重新设置该值,设置新值时也必须大于0。

相关接口

参数getTransactionInfoById 查询包含合约调用或合约创建结果的交易信息。

getTransactionInfoById 需要1个参数,交易 ID

相关字段

entropy_usage: //本次合约调用者消耗的Entropy数量
0
entropy_fee: //本次合约调用者消耗VS数量(VDT)
120
origin_entropy_usage: //本次合约创建者提供的Entropy数量
0
entropy_usage_total: //本次合约总共消耗的Entropy数量(包含entropy_usage,origin_entropy_usage 和entropy_fee对应的Entropy数量)
252
photon_usage: //本次合约消耗的photon(不包含PhotonFee对应的)
0
photon_fee: //本次合约因photon不足消耗的VS
0

FreezeBalance 冻结VS以获得光量子或熵

freezeBalance frozen_balance frozen_duration [ResourceCode:0 PHOTON,1 ENTROPY]

说明

参数 “fee_limit” 在部署合约和调用合约的过程中传递。 VS 数量对应于此执行中消耗的熵。

熵部分被冻结: (冻结平衡量/冻结以获得总熵) * 熵消耗。 销毁VS以获得熵部分:按比例消耗的VS数量。