Go-Ethereum
過濾器將操作碼數據的輸出限制為僅本地節點呼叫的合約/函式
修改了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 ......
也許沒有答案,也許我的分析方法是錯誤的。如果有人知道正確答案,請告訴我。希望有幫助~