https://github.com/filecoin-project/lotus/blob/master/chain/vm/gas.go#L83
var prices = map[abi.ChainEpoch]Pricelist{
abi.ChainEpoch(0): &pricelistV0{
computeGasMulti: 1, //
storageGasMulti: 1000,
onChainMessageComputeBase: 38863,
onChainMessageStorageBase: 36,
onChainMessageStoragePerByte: 1,
onChainReturnValuePerByte: 1,
sendBase: 29233,
sendTransferFunds: 27500,
sendTransferOnlyPremium: 159672,
sendInvokeMethod: -5377,
ipldGetBase: 75242,
ipldPutBase: 84070,
ipldPutPerByte: 1,
createActorCompute: 1108454,
createActorStorage: 36 + 40,
deleteActor: -(36 + 40), // -createActorStorage
verifySignature: map[crypto.SigType]int64{
crypto.SigTypeBLS: 16598605,
crypto.SigTypeSecp256k1: 1637292,
},
hashingBase: 31355,
computeUnsealedSectorCidBase: 98647,
verifySealBase: 2000, // TODO gas , it VerifySeal syscall is not used
verifyAggregateSealBase: 0,
verifyPostLookup: map[abi.RegisteredPoStProof]scalingCost{
abi.RegisteredPoStProof_StackedDrgWindow512MiBV1: {
flat: 123861062,
scale: 9226981,
},
abi.RegisteredPoStProof_StackedDrgWindow32GiBV1: {
flat: 748593537,
scale: 85639,
},
abi.RegisteredPoStProof_StackedDrgWindow64GiBV1: {
flat: 748593537,
scale: 85639,
},
},
verifyPostDiscount: true,
verifyConsensusFault: 495422,
},
https://blog.csdn.net/zgf1991/article/details/108403233
当前操作是转0.001 FIL,对应的消息size是142
实际获取到的结果 433268 (打印日志获取)
GasStorageMulti = 1000
GasComputeMulti = 1
计算方式: (上面代码注释中的 计算2)//转账(只计算)
ret := pl.sendBase
ret += pl.sendTransferFunds
ret += pl.sendTransferOnlyPremium//如果仅仅只是转账,需要该笔
gas = newGasCharge("OnMethodInvocation", ret, 0)
计算ret = 29233 + 27500 + 159672 = 216405
toUse := g.ComputeGas*GasComputeMulti + g.StorageGas*GasStorageMulti
= 216405 * 1 + 0 = 216405
还有一次计算 (上面代码注释中的 计算1)//存储(计算且存储)
newGasCharge("OnChainMessage", pl.onChainMessageComputeBase,
pl.onChainMessageStorageBase+pl.onChainMessageStoragePerByte*int64(msgSize))
转换对应数值,msgSize是sm *SignedMessage 序列化的结果,
打印的size是 142
newGasCharge("OnChainMessage", 38863,
36+142)
gas = newGasCharge("OnChainMessage", ret, 0)
38863 * 1 + (36+142)*1000 = 216,863
216405 + 216,863 = 433268
计算成功
注意:
在得出这个值后, 还需要 * 1.25
433268 * 1.25 = 541585 (约等于平均Gas消耗)
https://www.filscout.com/zh/gas/gas
如果接收地址未创建 则
// TryCreateAccountActor creates account actors from only BLS/SECP256K1 addresses.
func TryCreateAccountActor(rt *Runtime, addr address.Address) (*types.Actor, address.Address, aerrors.ActorError) {
//
if err := rt.chargeGasSafe(PricelistByEpoch(rt.height).OnCreateActor()); err != nil {
return nil, address.Undef, err
}
if addr == build.ZeroAddress && rt.NetworkVersion() >= network.Version10 {
return nil, address.Undef, aerrors.New(exitcode.ErrIllegalArgument, "cannot create the zero bls actor")
}
addrID, err := rt.state.RegisterNewAddress(addr)
if err != nil {
return nil, address.Undef, aerrors.Escalate(err, "registering actor address")
}
act, aerr := makeActor(actors.VersionForNetwork(rt.NetworkVersion()), addr)
if aerr != nil {
return nil, address.Undef, aerr
}
if err := rt.state.SetActor(addrID, act); err != nil {
return nil, address.Undef, aerrors.Escalate(err, "creating new actor failed")
}
p, err := actors.SerializeParams(&addr)
if err != nil {
return nil, address.Undef, aerrors.Escalate(err, "couldn't serialize params for actor construction")
}
// call constructor on account
//构造
_, aerr = rt.internalSend(builtin.SystemActorAddr, addrID, account.Methods.Constructor, big.Zero(), p)
if aerr != nil {
return nil, address.Undef, aerrors.Wrap(aerr, "failed to invoke account constructor")
}
act, err = rt.state.GetActor(addrID)
if err != nil {
return nil, address.Undef, aerrors.Escalate(err, "loading newly created actor failed")
}
return act, addrID, nil
}
chargeGasInternal
回多调用几次internalSend,所以gasUsed 约为正常gasused 的4.5 倍
如
https://www.filscout.com/zh/message/bafy2bzacecgp5uyc5rqnuqy554ghcku7nwruq6mjygkoeq27iorjsryhslsyq to 未创建
https://www.filscout.com/zh/message/bafy2bzaceajyz6fdjh4x7iduz3pled6d7bfg5forqj7lzom6yzl5c6im6dbnk 正常转账