以太坊消息调用数据获取方法
核心 插桩修改
原因:传统的geth客户端命令行trace有限制,即只能向前回溯128个块的数据,更多的历史数据无法解决那如果我修改了回溯限制为足够大的数字呢
其实这样也不行,大量的回溯相当于模拟以太坊历史所有交易,会在内存中产生极大的默克尔树存储,极其消耗内存(约几百G)
——方法:全节点同步模拟执行,不消耗内存
修改文件:
Core/vm/evm.go
Core/vm/interpreter.go
Core/state_transition.go
Core/state_processor.go
Core/vm/instruction.go
全部代码移步git:github
另一个核心要点,evm是不知道你在收块还是挖块,所以说它不会管你的transaction hash,那么为了在全节点同步模拟执行时输出transaction hash,不应只修改evm.go文件,还应该将transaction hash传递下去
粘贴一段很简单的核心代码
//=====================******将call信息写入文件********====================//
var number_str string=evm.Context.BlockNumber.String()
var time_str string=evm.Context.Time.String()
var txorigin string=evm.TxContext.Origin.String()
var address_str string=addr.String()
var caller_str string=caller.Address().String()
var filename string=""
var value_str string=value.String()
var input_str string=hex.EncodeToString(input)
var gas_str string=strconv.FormatUint(gas,10)
var depthStr string=strconv.Itoa(evm.depth)
var f *os.File
for i := 0; i <= 1000; i++ {
str_i := strconv.Itoa(i)
filename="./evmtest_"+str_i+".csv"
if checkFileIsExist_and_sizebig(filename){
continue
}else {
if checkFileIsExist(filename){
f, _ = os.OpenFile(filename, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
break
}else{
f, _ = os.Create(filename) //创建文件
break
}
}
}
var writeString string="Call,"+number_str+","+time_str+","+txorigin+","+caller_str+","+address_str+","+depthStr+","+value_str+","+input_str+","+gas_str+","
var execution_result string="|"
//=====================******将call信息写入文件********====================//