|
@@ -11,6 +11,7 @@ import (
|
|
|
"github.com/ethereum/go-ethereum/logger/glog"
|
|
"github.com/ethereum/go-ethereum/logger/glog"
|
|
|
"github.com/ethereum/go-ethereum/rlp"
|
|
"github.com/ethereum/go-ethereum/rlp"
|
|
|
"github.com/ethereum/go-ethereum/rpc/codec"
|
|
"github.com/ethereum/go-ethereum/rpc/codec"
|
|
|
|
|
+ "github.com/ethereum/go-ethereum/rpc/comms"
|
|
|
"github.com/ethereum/go-ethereum/rpc/shared"
|
|
"github.com/ethereum/go-ethereum/rpc/shared"
|
|
|
"github.com/ethereum/go-ethereum/xeth"
|
|
"github.com/ethereum/go-ethereum/xeth"
|
|
|
)
|
|
)
|
|
@@ -32,6 +33,8 @@ var (
|
|
|
"admin_chainSyncStatus": (*adminApi).ChainSyncStatus,
|
|
"admin_chainSyncStatus": (*adminApi).ChainSyncStatus,
|
|
|
"admin_setSolc": (*adminApi).SetSolc,
|
|
"admin_setSolc": (*adminApi).SetSolc,
|
|
|
"admin_datadir": (*adminApi).DataDir,
|
|
"admin_datadir": (*adminApi).DataDir,
|
|
|
|
|
+ "admin_startRPC": (*adminApi).StartRPC,
|
|
|
|
|
+ "admin_stopRPC": (*adminApi).StopRPC,
|
|
|
}
|
|
}
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -42,25 +45,25 @@ type adminhandler func(*adminApi, *shared.Request) (interface{}, error)
|
|
|
type adminApi struct {
|
|
type adminApi struct {
|
|
|
xeth *xeth.XEth
|
|
xeth *xeth.XEth
|
|
|
ethereum *eth.Ethereum
|
|
ethereum *eth.Ethereum
|
|
|
- methods map[string]adminhandler
|
|
|
|
|
- codec codec.ApiCoder
|
|
|
|
|
|
|
+ codec codec.Codec
|
|
|
|
|
+ coder codec.ApiCoder
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// create a new admin api instance
|
|
// create a new admin api instance
|
|
|
-func NewAdminApi(xeth *xeth.XEth, ethereum *eth.Ethereum, coder codec.Codec) *adminApi {
|
|
|
|
|
|
|
+func NewAdminApi(xeth *xeth.XEth, ethereum *eth.Ethereum, codec codec.Codec) *adminApi {
|
|
|
return &adminApi{
|
|
return &adminApi{
|
|
|
xeth: xeth,
|
|
xeth: xeth,
|
|
|
ethereum: ethereum,
|
|
ethereum: ethereum,
|
|
|
- methods: AdminMapping,
|
|
|
|
|
- codec: coder.New(nil),
|
|
|
|
|
|
|
+ codec: codec,
|
|
|
|
|
+ coder: codec.New(nil),
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// collection with supported methods
|
|
// collection with supported methods
|
|
|
func (self *adminApi) Methods() []string {
|
|
func (self *adminApi) Methods() []string {
|
|
|
- methods := make([]string, len(self.methods))
|
|
|
|
|
|
|
+ methods := make([]string, len(AdminMapping))
|
|
|
i := 0
|
|
i := 0
|
|
|
- for k := range self.methods {
|
|
|
|
|
|
|
+ for k := range AdminMapping {
|
|
|
methods[i] = k
|
|
methods[i] = k
|
|
|
i++
|
|
i++
|
|
|
}
|
|
}
|
|
@@ -69,7 +72,7 @@ func (self *adminApi) Methods() []string {
|
|
|
|
|
|
|
|
// Execute given request
|
|
// Execute given request
|
|
|
func (self *adminApi) Execute(req *shared.Request) (interface{}, error) {
|
|
func (self *adminApi) Execute(req *shared.Request) (interface{}, error) {
|
|
|
- if callback, ok := self.methods[req.Method]; ok {
|
|
|
|
|
|
|
+ if callback, ok := AdminMapping[req.Method]; ok {
|
|
|
return callback(self, req)
|
|
return callback(self, req)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -77,7 +80,7 @@ func (self *adminApi) Execute(req *shared.Request) (interface{}, error) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (self *adminApi) Name() string {
|
|
func (self *adminApi) Name() string {
|
|
|
- return AdminApiName
|
|
|
|
|
|
|
+ return shared.AdminApiName
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (self *adminApi) ApiVersion() string {
|
|
func (self *adminApi) ApiVersion() string {
|
|
@@ -86,7 +89,7 @@ func (self *adminApi) ApiVersion() string {
|
|
|
|
|
|
|
|
func (self *adminApi) AddPeer(req *shared.Request) (interface{}, error) {
|
|
func (self *adminApi) AddPeer(req *shared.Request) (interface{}, error) {
|
|
|
args := new(AddPeerArgs)
|
|
args := new(AddPeerArgs)
|
|
|
- if err := self.codec.Decode(req.Params, &args); err != nil {
|
|
|
|
|
|
|
+ if err := self.coder.Decode(req.Params, &args); err != nil {
|
|
|
return nil, shared.NewDecodeParamError(err.Error())
|
|
return nil, shared.NewDecodeParamError(err.Error())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -120,7 +123,7 @@ func hasAllBlocks(chain *core.ChainManager, bs []*types.Block) bool {
|
|
|
|
|
|
|
|
func (self *adminApi) ImportChain(req *shared.Request) (interface{}, error) {
|
|
func (self *adminApi) ImportChain(req *shared.Request) (interface{}, error) {
|
|
|
args := new(ImportExportChainArgs)
|
|
args := new(ImportExportChainArgs)
|
|
|
- if err := self.codec.Decode(req.Params, &args); err != nil {
|
|
|
|
|
|
|
+ if err := self.coder.Decode(req.Params, &args); err != nil {
|
|
|
return nil, shared.NewDecodeParamError(err.Error())
|
|
return nil, shared.NewDecodeParamError(err.Error())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -163,7 +166,7 @@ func (self *adminApi) ImportChain(req *shared.Request) (interface{}, error) {
|
|
|
|
|
|
|
|
func (self *adminApi) ExportChain(req *shared.Request) (interface{}, error) {
|
|
func (self *adminApi) ExportChain(req *shared.Request) (interface{}, error) {
|
|
|
args := new(ImportExportChainArgs)
|
|
args := new(ImportExportChainArgs)
|
|
|
- if err := self.codec.Decode(req.Params, &args); err != nil {
|
|
|
|
|
|
|
+ if err := self.coder.Decode(req.Params, &args); err != nil {
|
|
|
return nil, shared.NewDecodeParamError(err.Error())
|
|
return nil, shared.NewDecodeParamError(err.Error())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -181,7 +184,7 @@ func (self *adminApi) ExportChain(req *shared.Request) (interface{}, error) {
|
|
|
|
|
|
|
|
func (self *adminApi) Verbosity(req *shared.Request) (interface{}, error) {
|
|
func (self *adminApi) Verbosity(req *shared.Request) (interface{}, error) {
|
|
|
args := new(VerbosityArgs)
|
|
args := new(VerbosityArgs)
|
|
|
- if err := self.codec.Decode(req.Params, &args); err != nil {
|
|
|
|
|
|
|
+ if err := self.coder.Decode(req.Params, &args); err != nil {
|
|
|
return nil, shared.NewDecodeParamError(err.Error())
|
|
return nil, shared.NewDecodeParamError(err.Error())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -202,7 +205,7 @@ func (self *adminApi) ChainSyncStatus(req *shared.Request) (interface{}, error)
|
|
|
|
|
|
|
|
func (self *adminApi) SetSolc(req *shared.Request) (interface{}, error) {
|
|
func (self *adminApi) SetSolc(req *shared.Request) (interface{}, error) {
|
|
|
args := new(SetSolcArgs)
|
|
args := new(SetSolcArgs)
|
|
|
- if err := self.codec.Decode(req.Params, &args); err != nil {
|
|
|
|
|
|
|
+ if err := self.coder.Decode(req.Params, &args); err != nil {
|
|
|
return nil, shared.NewDecodeParamError(err.Error())
|
|
return nil, shared.NewDecodeParamError(err.Error())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -212,3 +215,32 @@ func (self *adminApi) SetSolc(req *shared.Request) (interface{}, error) {
|
|
|
}
|
|
}
|
|
|
return solc.Info(), nil
|
|
return solc.Info(), nil
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+func (self *adminApi) StartRPC(req *shared.Request) (interface{}, error) {
|
|
|
|
|
+ var err error
|
|
|
|
|
+ args := new(StartRPCArgs)
|
|
|
|
|
+ if err := self.coder.Decode(req.Params, &args); err != nil {
|
|
|
|
|
+ return nil, shared.NewDecodeParamError(err.Error())
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ cfg := comms.HttpConfig{
|
|
|
|
|
+ ListenAddress: args.ListenAddress,
|
|
|
|
|
+ ListenPort: args.ListenPort,
|
|
|
|
|
+ CorsDomain: args.CorsDomain,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if apis, err := ParseApiString(args.Apis, self.codec, self.xeth, self.ethereum); err == nil {
|
|
|
|
|
+ err = comms.StartHttp(cfg, self.codec, Merge(apis...))
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if err == nil {
|
|
|
|
|
+ return true, nil
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return false, err
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (self *adminApi) StopRPC(req *shared.Request) (interface{}, error) {
|
|
|
|
|
+ comms.StopHttp()
|
|
|
|
|
+ return true, nil
|
|
|
|
|
+}
|