Show / Hide Table of Contents

合约收费机制

用户在使用 Neo 网络时,需要支付一定的费用,总手续费包含系统费 (System Fee) 和网络费 (Network Fee),费用单位为 GAS。

其中,智能合约执行,包括自身脚本的执行和调用其他合约的脚本,所需的费用为系统手续费。

承载智能合约部署、调用的交易以及执行验证(Verify)方法所需的费用为网络手续费。

一笔调用智能合约的交易的手续费会同时包括系统手续费(sysfee)和网络手续费(netfee)。每一笔交易的 sysfee 都会被燃烧,而 netfee 会奖励给打包当前区块的共识地址。

在 Neo N3 中手续费是可以动态变化的,下面列举的是基础费用。

系统手续费

系统手续费(System Fee)包括以下几项:

  • 操作码执行(OpCode)费用

  • 系统调用(SysCall)费用

  • 原生合约 CPU 使用费用

  • 存储区使用费用

操作码执行(OpCode)费用

执行费用(GAS)操作码(OpCode)指令名称
0.00032768CALLT
0.00008192APPEND,REVERSEITEMS,SETITEM,VALUES
0.00004096PUSHDATA4
0.00002048CAT,CONVERT,LEFT,MEMCPY,RIGHT,SUBSTR
0.00000512CALL,CALLL,CALLA,NEWARRAY,NEWARRAYT,NEWSTRUCT,PACK,PUSHDATA2,THROW,UNPACK
0.00000256NEWBUFFER
0.00000064HASKEY,INITSLOT,PICKITEM
0.00000032EQUAL,NOTEQUAL
0.00000016CLEAR,CLEARITEMS,INITSSLOT,KEYS,NEWARRAY0,NEWSTRUCT0,POPITEM,REMOVE,REVERSEN,ROLL,XDROP
0.00000008ADD,AND,BOOLAND,BOOLOR,DIV,GE,GT,LE,LT,MAX,MIN,MOD,MUL,NEWMAP,NUMEQUAL,NUMNOTEQUAL,OR,PUSHDATA1,SHL,SHR,SUB,WITHIN,XOR
0.00000004ABS,DEC,ENDFINALLY,ENDTRY,ENDTRYL,INC,INVERT,NEGATE,NOT,NZ,PUSHA,PUSHINT128,PUSHINT256,SIGN,SIZE,TRY,TRYL
0.00000002DEPTH,DROP,DUP,ISNULL,ISTYPE,JMP,JMPL,JMPEQ,JMPEQL,JMPGE,JMPGEL,JMPGT,JMPGTL,JMPIF,JMPIFL,JMPIFNOT,JMPIFNOTL,JMPLE,JMPLEL,JMPLT,JMPLTL,JMPNE,JMPNE_L,LDARG,LDARG0,LDARG1,LDARG2,LDARG3,LDARG4,LDARG5,LDARG6,LDLOC,LDLOC0,LDLOC1,LDLOC2,LDLOC3,LDLOC4,LDLOC5,LDLOC6,LDSFLD,LDSFLD0,LDSFLD1,LDSFLD2,LDSFLD3,LDSFLD4,LDSFLD5,LDSFLD6,NIP,OVER,PICK,REVERSE3,REVERSE4,ROT,STARG,STARG0,STARG1,STARG2,STARG3,STARG4,STARG5,STARG6,STLOC,STLOC0,STLOC1,STLOC2,STLOC3,STLOC4,STLOC5,STLOC6,STSFLD,STSFLD0,STSFLD1,STSFLD2,STSFLD3,STSFLD4,STSFLD5,STSFLD6,SWAP,TUCK
0.00000001ASSERT,NOP,PUSH0,PUSH1,PUSH10,PUSH11,PUSH12,PUSH13,PUSH14,PUSH15,PUSH16,PUSH2,PUSH3,PUSH4,PUSH5,PUSH6,PUSH7,PUSH8,PUSH9,PUSHINT16,PUSHINT32,PUSHINT64,PUSHINT8,PUSHM1,PUSHNULL
0ABORT,RET,SYSCALL

参考: ApplicationEngine.OpCodePrices.cs

系统调用费用

系统调用名称执行费用(GAS)
System.Contract.Call0.00032768
System.Contract.CallNative参考原生合约费用
System.Contract.IsStandard0.00001024
System.Contract.GetCallFlags0.00001024
System.Contract.CreateStandardAccount0.00000256
System.Contract.CreateMultisigAccount0.00000256
Neo.Crypto.CheckSig0.00032768
Neo.Crypto.CheckMultisig根据签名数量动态计算
System.Iterator.Create0.00000016
System.Iterator.Next0.00032768
System.Iterator.Value0.00000016
System.Runtime.Platform0.00000008
System.Runtime.GetTrigger0.00000008
System.Runtime.GetTime0.00000008
System.Runtime.GetScriptContainer0.00000008
System.Runtime.GetExecutingScriptHash0.00000016
System.Runtime.GetCallingScriptHash0.00000016
System.Runtime.GetEntryScriptHash0.00000016
System.Runtime.CheckWitness0.00001024
System.Runtime.GetInvocationCounter0.00000016
System.Runtime.Log0.00032768
System.Runtime.Notify0.00032768
System.Runtime.GetNotifications0.00000256
System.Runtime.GasLeft0.00000016

参考:

ApplicationEngine.Contract.cs

ApplicationEngine.Crypto.cs

ApplicationEngine.Contract.cs

ApplicationEngine.Iterator.cs

ApplicationEngine.Runtime.cs

ApplicationEngine.Storage.cs

原生合约执行费用

原生合约名称原生合约方法执行费用(GAS)
ContractManagementDeploy参考存储区使用费用,最低 10 GAS
ContractManagementUpdate参考存储区使用费用
LedgerContractGetTransactionFromBlock0.00065536
NeoTokenUnclaimedGas0.00131072
NeoTokenRegisterCandidate动态计算,默认 1000 GAS
NeoTokenUnregisterCandidate0.00065536
NeoTokenVote0.00065536
NeoTokenGetCandidates0.04194304
NeoTokenGetCommittee0.04194304
NeoTokenGetNextBlockValidators0.04194304
NeoToken、GasTokenTransfer0.00131072
OracleContractRequest动态计算,用户调用时指定手续费
StdLibDeserialize0.00008192
StdLibJsonDeserialize0.00008192
StdLib其他0.00002048

其他未列出的原生合约方法的手续费均为 0.00032768 GAS。

参考: neo/SmartContract/Native

存储区费用

按写入字节收费,默认单价为 0.001 GAS / Byte,委员会可动态调整,但最大不会超过 1 GAS / Byte

根据写入的 key 是初次写入还是修改数据,存储区收费规则参见下表。

场景收费规则示例手续费
(默认单价0.001)
首次写入(key.Length + value.Length) × 单价key = key , value= hello world , 共 14 字节 0.014 GAS
非首次写入存储区,且新数据大小 ≤ 旧数据大小不收取 key 的费用,value 部分首字节正常计费,剩余字节 2.5 折 计费修改 value 为 hello neo3 , 共 10 字节(1+(10-1)/4 )×0.001 = 0.003 GAS
非首次写入存储区,且新数据大小 > 旧数据大小不收取 key 的费用,value 部分旧数据大小按照上一条计费,新增数据的大小按照原价计费修改 value 为 hello neo3.0 , 共 12 字节0.003 + (12-10)×0.001 = 0.005 GAS
非首次写入存储区,且新数据大小 > 旧数据大小与上一条相同修改 value 为 hello neo3.0 preview5 , 共 21 字节0.005 + (21-12)×0.001 = 0.014 GAS
删除 value0删除 value 0 GAS

参考: ApplicationEngine.Storage.cs

网络手续费

网络手续费(Network Fee)包括以下几项:

  • 网络字节费

  • 验证脚本执行所需的费用

网络字节费

网络字节费默认 0.00001 GAS / Byte,委员会可动态调整。

参考:

PolicyContract.cs

Transaction.cs#L302

脚本验证费用

验证脚本执行所需的费用最大不超过 0.5 GAS,计算公式为:

脚本验证费 = 脚本验证执行费 * 倍率

其中, 脚本验证执行费 = 操作码执行费 + 系统调用费 + 原生合约 CPU 使用费 + 存储区使用费

验证脚本默认执行费率倍率 默认为 30,委员会可动态调整,但最大不得超过 1000。

开发者可以通过 InvokeContractVerify API 估算验证脚本执行所需费用。

例:

标准地址验证脚本费用为 (OpCode.PUSHDATA1 + OpCode.PUSHDATA1 + OpCode.SYSCALL + Neo.Crypto.CheckSig) ×30 = 0.0098352 GAS。

参考:

PolicyContract.cs

Transaction.cs#L302