diff --git a/core/chain_manager.go b/core/chain_manager.go index dd0dd3cbe..47cad825d 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -396,8 +396,9 @@ func (self *ChainManager) InsertChain(chain types.Blocks) error { self.mu.Unlock() if chain { - //self.setTransState(state.New(block.Root(), self.db)) - //self.eventMux.Post(ChainEvent{block, td}) + fmt.Println("POST START") + self.eventMux.Post(ChainEvent{block, td}) + fmt.Println("POST END") } if split { @@ -413,7 +414,3 @@ func (self *ChainManager) InsertChain(chain types.Blocks) error { func (self *ChainManager) GetAccount(addr []byte) *state.StateObject { return self.State().GetAccount(addr) } - -func (self *ChainManager) TransMut() *sync.RWMutex { - return &self.tsmu -} diff --git a/event/filter/eth_filter.go b/event/filter/eth_filter.go index d298d914d..73d2cd935 100644 --- a/event/filter/eth_filter.go +++ b/event/filter/eth_filter.go @@ -3,6 +3,7 @@ package filter // TODO make use of the generic filtering system import ( + "fmt" "sync" "github.com/ethereum/go-ethereum/core" @@ -37,17 +38,18 @@ func (self *FilterManager) Stop() { func (self *FilterManager) InstallFilter(filter *core.Filter) (id int) { self.filterMu.Lock() + defer self.filterMu.Unlock() id = self.filterId self.filters[id] = filter self.filterId++ - self.filterMu.Unlock() + return id } func (self *FilterManager) UninstallFilter(id int) { self.filterMu.Lock() + defer self.filterMu.Unlock() delete(self.filters, id) - self.filterMu.Unlock() } // GetFilter retrieves a filter installed using InstallFilter. @@ -62,7 +64,7 @@ func (self *FilterManager) filterLoop() { // Subscribe to events events := self.eventMux.Subscribe( core.PendingBlockEvent{}, - core.ChainEvent{}, + //core.ChainEvent{}, state.Logs(nil)) out: @@ -73,6 +75,7 @@ out: case event := <-events.Chan(): switch event := event.(type) { case core.ChainEvent: + fmt.Println("filter start") self.filterMu.RLock() for _, filter := range self.filters { if filter.BlockCallback != nil { @@ -80,6 +83,7 @@ out: } } self.filterMu.RUnlock() + fmt.Println("filter stop") case core.PendingBlockEvent: self.filterMu.RLock() diff --git a/miner/worker.go b/miner/worker.go index 1f3a52ab5..aea5cc535 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -117,9 +117,11 @@ out: case event := <-events.Chan(): switch ev := event.(type) { case core.ChainEvent: + println("miner start") if self.current.block != ev.Block { self.commitNewWork() } + println("miner end") case core.NewMinedBlockEvent: self.commitNewWork() } diff --git a/rpc/message.go b/rpc/message.go index d96c35d7e..825ede05b 100644 --- a/rpc/message.go +++ b/rpc/message.go @@ -201,6 +201,36 @@ func (req *RpcRequest) ToGetCodeAtArgs() (*GetCodeAtArgs, error) { return args, nil } +func (req *RpcRequest) ToBoolArgs() (bool, error) { + if len(req.Params) < 1 { + return false, NewErrorResponse(ErrorArguments) + } + + var args bool + err := json.Unmarshal(req.Params[0], &args) + if err != nil { + return false, NewErrorResponse(ErrorDecodeArgs) + } + + rpclogger.DebugDetailf("%T %v", args, args) + return args, nil +} + +func (req *RpcRequest) ToCompileArgs() (string, error) { + if len(req.Params) < 1 { + return "", NewErrorResponse(ErrorArguments) + } + + var args string + err := json.Unmarshal(req.Params[0], &args) + if err != nil { + return "", NewErrorResponse(ErrorDecodeArgs) + } + + rpclogger.DebugDetailf("%T %v", args, args) + return args, nil +} + func (req *RpcRequest) ToFilterArgs() (*FilterOptions, error) { if len(req.Params) < 1 { return nil, NewErrorResponse(ErrorArguments) @@ -231,6 +261,36 @@ func (req *RpcRequest) ToFilterStringArgs() (string, error) { return args, nil } +func (req *RpcRequest) ToUninstallFilterArgs() (int, error) { + if len(req.Params) < 1 { + return 0, NewErrorResponse(ErrorArguments) + } + + var args int + err := json.Unmarshal(req.Params[0], &args) + if err != nil { + return 0, NewErrorResponse(ErrorDecodeArgs) + } + + rpclogger.DebugDetailf("%T %v", args, args) + return args, nil +} + +func (req *RpcRequest) ToFilterChangedArgs() (int, error) { + if len(req.Params) < 1 { + return 0, NewErrorResponse(ErrorArguments) + } + + var id int + r := bytes.NewReader(req.Params[0]) + err := json.NewDecoder(r).Decode(&id) + if err != nil { + return 0, NewErrorResponse(ErrorDecodeArgs) + } + rpclogger.DebugDetailf("%T %v", id, id) + return id, nil +} + func (req *RpcRequest) ToDbPutArgs() (*DbArgs, error) { if len(req.Params) < 3 { return nil, NewErrorResponse(ErrorArguments) diff --git a/rpc/packages.go b/rpc/packages.go index 7411392c2..56c1751d7 100644 --- a/rpc/packages.go +++ b/rpc/packages.go @@ -113,6 +113,13 @@ func (self *EthereumApi) NewFilter(args *FilterOptions, reply *interface{}) erro return nil } +func (self *EthereumApi) UninstallFilter(id int, reply *interface{}) error { + delete(self.logs, id) + self.filterManager.UninstallFilter(id) + *reply = true + return nil +} + func (self *EthereumApi) NewFilterString(args string, reply *interface{}) error { var id int filter := core.NewFilter(self.xeth.Backend()) @@ -273,6 +280,11 @@ func (p *EthereumApi) GetIsMining(reply *interface{}) error { return nil } +func (p *EthereumApi) SetMining(shouldmine bool, reply *interface{}) error { + *reply = p.xeth.SetMining(shouldmine) + return nil +} + func (p *EthereumApi) BlockNumber(reply *interface{}) error { *reply = p.xeth.Backend().ChainManager().CurrentBlock().Number() return nil @@ -306,6 +318,21 @@ func (p *EthereumApi) GetCodeAt(args *GetCodeAtArgs, reply *interface{}) error { return nil } +func (p *EthereumApi) GetCompilers(reply *interface{}) error { + c := []string{"serpent"} + *reply = c + return nil +} + +func (p *EthereumApi) CompileSerpent(script string, reply *interface{}) error { + res, err := ethutil.Compile(script, false) + if err != nil { + return err + } + *reply = res + return nil +} + func (p *EthereumApi) Sha3(args *Sha3Args, reply *interface{}) error { *reply = toHex(crypto.Sha3(fromHex(args.Data))) return nil @@ -394,6 +421,12 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return p.GetIsListening(reply) case "eth_mining": return p.GetIsMining(reply) + case "eth_setMining": + args, err := req.ToBoolArgs() + if err != nil { + return err + } + return p.SetMining(args, reply) case "eth_peerCount": return p.GetPeerCount(reply) case "eth_number": @@ -460,6 +493,12 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.NewFilterString(args, reply) + case "eth_uninstallFilter": + args, err := req.ToUninstallFilterArgs() + if err != nil { + return err + } + return p.UninstallFilter(args, reply) case "eth_changed": args, err := req.ToIdArgs() if err != nil { @@ -493,6 +532,14 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.WatchTx(args, reply) + case "eth_compilers": + return p.GetCompilers(reply) + case "eth_serpent": + args, err := req.ToCompileArgs() + if err != nil { + return err + } + return p.CompileSerpent(args, reply) case "web3_sha3": args, err := req.ToSha3Args() if err != nil { diff --git a/xeth/xeth.go b/xeth/xeth.go index 67dac948c..f3569e454 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -103,6 +103,17 @@ func (self *XEth) IsMining() bool { return self.miner.Mining() } +func (self *XEth) SetMining(shouldmine bool) bool { + ismining := self.miner.Mining() + if shouldmine && !ismining { + self.miner.Start() + } + if ismining && !shouldmine { + self.miner.Stop() + } + return self.miner.Mining() +} + func (self *XEth) IsListening() bool { return self.eth.IsListening() }