透过eth_call 不断模拟买入 直到模拟成功 才去买入, 为什么gasPrice多高还是会慢1个区块。
然后我又改了geth源码,让他模拟的时候把txpool的交易也算进去了。他就直接比开盘的函数快2个区块。如何让我的交易紧跟着开盘的交易走。是要比开盘的交易的gasprice低一点点吗
bsc的geth 修改过的DoCall的源码在这里
func DoCall(ctx context.Context, b Backend, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride, blockOverrides *BlockOverrides, timeout time.Duration, globalGasCap uint64) (*core.ExecutionResult, error) {
defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now())
state, header, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
if state == nil || err != nil {
return nil, err
}
pendingTxs, err := b.GetPoolTransactions()
if err != nil {
return nil, err
}
tmpStatedb := state.Copy()
for _, tx := range pendingTxs {
if tx.To() == args.To {
msg, err := core.TransactionToMessage(tx, types.LatestSigner(b.ChainConfig()), header.BaseFee)
if err != nil {
return nil, err
}
txCtx := core.NewEVMTxContext(msg)
context := core.NewEVMBlockContext(header, NewChainContext(ctx, b), nil)
evm := vm.NewEVM(context, txCtx, tmpStatedb, b.ChainConfig(), vm.Config{NoBaseFee: true})
_, err = core.ApplyMessage(evm, msg, new(core.GasPool))
if err != nil {
return nil, err
}
} else {
continue
}
}
return doCall(ctx, b, args, tmpStatedb, header, overrides, blockOverrides, timeout, globalGasCap)
}
python中大概的实现就是:
def simulate():
eth_call(xxxx)
def main():
while 1:
if simulate == True:
买入