Go-Ethereum

如何在 geth 控制台中自定義我自己的命令?

  • August 20, 2017

如何在 geth 控制台中自定義我自己的命令?

我們知道,在 geth 控制台中,我們可以輸入 eth.accounts 和其他命令。我發現有一個名為 Otto 的 JavaScript 解析器/解釋器可以執行此操作,但是如何在 geth 控制台中添加新命令,例如 eth.mycommand?

非常感謝你。

可以修改原始碼來實現,創建本地私有鏈。

  1. 安裝
  2. 複製go-ethereum項目git clone https://github.com/ethereum/go-ethereum.git
  3. 重建所有命令make all,例如geth
  4. 測試是否一切正常。./build/bin/geth --datadir=./dev/data0 --networkid 2 console. 首先,您應該創建目錄./dev/data0來保存鏈數據。如果好的,現在你已經進入了 geth 控制台。

現在,我們修改原始碼。啟動時geth會創建一個執行緒通過Interactive方法與控制台互動,最後console.Evaluate()處理輸入命令。所以你可以在這裡實現你的邏輯。現在我們定義一個eth.custom(params)命令來顯示say-hello。修改原始碼如下:

// Evaluate executes code and pretty prints the result to the specified output
// stream.
func (c *Console) Evaluate(statement string) error {
   //fmt.Println(isCustomCommand(statement))
   if (isCustomCommand(statement)) {//custom command,return
       result := "Hello " + statement[strings.Index(statement,"\"")+1:len(statement)-3]
       log.Info(result)
       return nil
   }
   defer func() {
       if r := recover(); r != nil {
           fmt.Fprintf(c.printer, "[native] error: %v\n", r)
       }
   }()
   return c.jsre.Evaluate(statement, c.printer)
}

//our custom is eth.custom(param)
func isCustomCommand(input string) bool{
   return strings.HasPrefix(input,"eth.custom")
}

如果您輸入eth.custom("BinBin"),它會顯示Hello BinBin在終端上。現在執行

make all

命令重建,然後執行命令進入控制台:

./build/bin/geth --datadir=./dev/data0 --networkid 2  console

現在,我們開始測試,輸入命令如下:

eth.custom("BinBin")

結果是

在此處輸入圖像描述

完美的!

希望有幫助~

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