以太坊消息调用数据分析方法

以太坊消息调用数据获取方法

核心 插桩修改
原因:传统的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信息写入文件********====================//

猜你喜欢

转载自blog.csdn.net/BradMoon/article/details/123131293