我需要在geth的控制台中使用自定义API,类似admin,eth,miner,personal等。现在操作如下: 1、自定义API为myAlgo,func为EchoNumber
type API struct {
chain consensus.ChainReader
myAlgo *MyAlgo
}
func (api *API) EchoNumber(ctx context.Context, number uint64) (uint64, error) {
fmt.Println("called echo number")
return number, nil
}
2、在internal/web3ext/web3ext.go中添加echoNumber
方法
var Modules = map[string]string{
"admin": Admin_JS,
...
"txpool": TxPool_JS,
"myalgo": MyAlgo_JS,
}
const MyAlgo_JS = `
web3._extend({
property: 'myalgo',
methods: [
new web3._extend.Method({
name: 'echoNumber',
call: 'myalgo_echoNumber',
params: 1,
inputFormatter: [null]
}),
]
})
3、安装go-bindata,
go get github.com/jteeuwen/go-bindata
go install github.com/jteeuwen/go-bindata/go-bindata
并成功运行如下命令,更新bindata.go文件:
go-bindata -nometadata -pkg deps -o bindata.go bignumber.js web3.js
gofmt -w -s bindata.go
4、重新编译geth后运行进入javascript console控制台,无法运行myalgo及相关命令报错,is not defined:
> myalgo
ReferenceError: 'myalgo' is not defined
at <anonymous>:1:1
> myalgo.echoNumber()
ReferenceError: 'myalgo' is not defined
at <anonymous>:1:1
请问各位高手,如何解决?谢谢。
你需要注册RPC服务才能使用,否则在控制台初始化时因为无法从已注册API中找到myalgo,而过滤掉myalgo。
做法:
在internal/ethapi/backend.go
文件中定义的 GetAPIs
方法中添加注册:
{
Namespace: "myalgo",
Version: "1.0",
Service: &API{},
Public: true,
},
另外不需要额外的执行 go-bindata。 重新使用make命令编译geth即可。
如果觉得我的回答对您有用,请随意打赏。你的支持将鼓励我继续创作!