熵消耗机制
介绍
本文介绍Vision中智能合约执行和部署时的熵(entropy)消耗模型。
术语表
术语 | 定义 |
---|---|
OriginEntropyLimit | 合约部署者可提供消耗的熵 |
CallerEntropyLimit | 合约调用者可提供消耗的熵,当部署合约时,等价于 OriginEntropyLimit |
TotalEntropyLimit | OriginEntropyLimit + CallerEntropyLimit |
EntropyLimitOfFeelimit | Feelimit / 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。
消费过程
-
根据合约中设置的 consume_user_resource_percent 比率,消耗合约创建者从冻结VS获得的熵。如果熵不足,继续消耗合约创建者的剩余熵。任何剩余的能源短缺都由合约调用者提供。
-
合约调用者者消费过程:(首先消耗呼叫者通过冻结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数量。
Updated over 3 years ago