Go-Ethereum

過濾器將操作碼數據的輸出限制為僅本地節點呼叫的合約/函式

  • August 10, 2017

修改了instructions.go文件後,geth我可以看到各個操作碼的執行時間,它看起來像這樣:

在此處輸入圖像描述

我對該輸出的解釋是,它代表了我正在執行的節點聽到的所有合約的執行,因此,整個網路(ropsten 測試網)的所有交易。

我對geth客戶所做的更改在這裡:

func opAdd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {

   // begin execution time tracking
   var startTime = time.Now().UnixNano();

   x, y := stack.pop(), stack.pop()
   stack.push(math.U256(x.Add(x, y)))

   evm.interpreter.intPool.put(y)

   // log ellapsed execution time
   fmt.Println("execute opAdd consume = ",(time.Now().UnixNano() - startTime))

   return nil, nil
}

我想做的是以某種方式限制該輸出,以便它僅顯示我從本地節點部署的契約/功能,即我稱之為自己的那些。

我現在正在尋找的是,關於如何做到這一點的一些想法 - 甚至不一定是解決方案 - 儘管那會很棒 - 但即使是開始的地方 - 例如一些對應於類似過濾器/標誌的程式碼,所有這些東西,所有這些類型的想法都會非常酷和有幫助!

我一遍又一遍地閱讀 vm 呼叫源,但我找不到計算單個函式(有時一個呼叫另一個)執行時間的有效方法。當我們部署一個合約時,會創建一個交易,input屬性是合約的字節碼,如果我們呼叫一個方法,首先生成方法的簽名(例如:0xe079bdf1),然後通過簽名找到該方法並執行。所以獲得答案的唯一方法是 vm opcode,我已經閱讀了Solidity Assembly並測試了許多方法呼叫,分析了許多操作碼,但我找不到答案,這對我來說太難了。操作碼廣告如下:

.data
 0:
   .code
     PUSH 60           contract Wallet {\n
   mappin...
     PUSH 40           contract Wallet {\n
   mappin...
     MSTORE            contract Wallet {\n
   mappin...
     PUSH 0            contract Wallet {\n
   mappin...
     CALLDATALOAD          contract Wallet {\n
   mappin...
     PUSH 100000000000000000000000000000000000000000000000000000000            contract Wallet {\n
   mappin...
     SWAP1             contract Wallet {\n
   mappin...
     DIV           contract Wallet {\n
   mappin...
     PUSH FFFFFFFF         contract Wallet {\n
   mappin...
     AND 

     ......

也許沒有答案,也許我的分析方法是錯誤的。如果有人知道正確答案,請告訴我。希望有幫助~

引用自:https://ethereum.stackexchange.com/questions/23941