FIL message TO 未创建账户 gaslimit 的确定

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

https://github.com/filecoin-project/lotus/blob/4e7d17e889231e2c35c70c8034c87d0c48d9391e/chain/vm/runtime.go#L551

如果接收地址未创建 则

https://github.com/filecoin-project/lotus/blob/4e7d17e889231e2c35c70c8034c87d0c48d9391e/chain/vm/mkactor.go#L43

// 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 正常转账

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值