部署合同
如果DeveloperEnergy <= min(EnergyOfFeelimit, EnergyOfAccount),則合同可以成功部署。 否則,會出現OUT_OF_ENERGY錯誤。
觸發合約
當 consume_user_resource_percent (% ratio user pays) = 100,呼叫方支付操作的全部費用。 呼叫方需要滿足:
CallerNeedEnergy <= min(EnergyOfFeelimit,EnergyOfAccount)
從而成功呼叫合約。 否則,會出現OUT_OF_ENERGY錯誤。
當 0 = < 消耗_user_資源_% < 100 時,這表示操作成本由開發人員和呼叫者按比例支付。 如果開發人員有足夠的能量,呼叫方需要滿足:
● CallerNeedEnergy = NeedEnergy * consume_user_resource_percent / 100
● CallerNeedEnergy <= min(EnergyOfFeelimit,EnergyOfAccount)
開發人員:
DeveloperNeedEnergy = NeedEnergy *(100-consume_user_resource_percent)/ 100
為了成功呼叫合約,DeveloperNeedEnergy <= OriginEnergyLimit 。 否則,報告OUT_OF_ENERGY 。
如果開發人員的能量不足,則剩餘的能量消耗由呼叫方提供,並且不消耗開發者的TRX。 也就是說,呼叫者需要滿足:
TotalEnergy <= min(EnergyOfFeelimit,EnergyOfAccount)+ DeveloperProvideEnergy
為了成功呼叫合約,DeveloperProvideEnergy <= OriginEnergyLimit 。 否則,會出現OUT_OF_ENERGY錯誤。
合約執行
執行合約方法時,OUT_OFO_ENERE 可以根據介面檢視詳細資訊。 呼叫/ walletsolidity / gettransactionInfoByID介面,並將返回的resMessage欄位從十六進位制轉換為字串。
resMessages包括:執行“AND”操作的能量不足:curInvokeEnergyLimit[1000],curOpEnergy[3],usedEnergy[1000] 類似資訊。
術語
定義
curInvokeEnergyLimit
表示最大能耗, 即 min(EnergyOfFeelimit,EnergyOfAccount).
curOpEnergy
當前運營仍需要能源。
usedEnergy
本地用於呼叫的能量。
能源不足解決方案
1. 如果EnergyOFAccount < curInvokeEnergyLimit,表示呼叫方剩餘能量和TRX餘額不足,需要給TRX充值。
2. 如果EnergyOfFeelimit < curInvokeEnergyLimit,表明費用限額設定太小,需要增加費用限額。 最高費用限額為1000 TRX。
消費過程
1. 根據合同中設定的 consume_user_resource_percent 比率,消耗合同建立者從凍結TRX獲得的能量。如果能量不足,繼續消耗合同建立者的剩餘能量。任何剩餘的能源短缺都由合同來電者提供。
2. 合同來電者消費過程:(首先消耗呼叫者透過凍結TRX獲得的能量,以確保合同可以正常執行,並且透過銷燬TRX來抵消不足部分)。
3. 如果合同建立者未凍結能源資源的TRX,則呼叫者需要所有消費。
專業術語
術語解釋
合約建立者
即建立合約的賬戶
合約呼叫者
即呼叫合約的賬戶
Energy
智慧合約執行時每一步指令都需要消耗一定的資源,資源的多少用energy的值來衡量。
Freeze
凍結,即將持有的trx鎖定,無法進行交易,作為抵押,並以此獲得免費使用energy的權利。具體計算與全網所有賬戶凍結有關,可參考相關部分計算。
Fee Limit
使用者在呼叫或者建立智慧合約時,指定的最高可接受的trx費用消耗,包含消耗凍結獲得資源的trx 和消耗使用者本身持有的trx兩部分,優先使用凍結資源。
Call Value
使用者在智慧合約呼叫或建立時給智慧合約本身的賬戶轉賬的trx數量,在判斷feelimit的時候會拋去這部分的值。
consume_user_resource_percent
對於一個智慧合約來說,付費是由兩大部分組成的。一部分是合約開發者付費,另一部分是由合約呼叫者支付。這個值是呼叫者付費的比例。
origin_energy_limit
開發者設定的在一次合約呼叫過程中自己消耗的energy的上限,必須大於0。對於之前老的合約,沒有提供設定該值的引數,會存成0,但是會按照1000萬energy上限計算,開發者可以透過updateEnergyLimit介面重新設定該值,設定新值時也必須大於0。
相關介面
引數getTransactionInfoById 查詢包含合約呼叫或合約建立結果的交易資訊。
getTransactionInfoById 需要1個引數,交易 ID
相關欄位
● 相關欄位
Copy
energy_usage: //本次合約呼叫者消耗的Energy數量
0
energy_fee: //本次合約呼叫者消耗TRX數量(SUN)
120
origin_energy_usage: //本次合約建立者提供的Energy數量
0
energy_usage_total: //本次合約總共消耗的Energy數量(包含energy_usage,origin_energy_usage 和energy_fee對應的Energy數量)
252
net_usage: //本次合約消耗的Bandwidth(不包含NetFee對應的)
0
net_fee: //本次合約因Bandwidth不足消耗的TRX
0
FreezeBalance 凍結TRX以獲得頻寬或能量
freezeBalance frozen_balance frozen_duration [ResourceCode:0 BANDWIDTH,1 ENERGY]
說明
引數 “fee_limit” 在部署合約和呼叫合約的過程中傳遞。 TRX 數量對應於此執行中消耗的能量。
能量部分被凍結: (凍結平衡量/凍結以獲得總能量) * 能量消耗。 銷燬TRX以獲得能量部分:按比例消耗的TRX數量。