Merge branch 'develop' of github.com-obscure:ethereum/go-ethereum into develop
This commit is contained in:
		@@ -133,13 +133,10 @@ func (self *peer) addError(code int, format string, params ...interface{}) {
 | 
				
			|||||||
	self.addToBlacklist(self.id)
 | 
						self.addToBlacklist(self.id)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// caller must hold peer lock
 | 
				
			||||||
func (self *peer) setChainInfo(td *big.Int, c common.Hash) {
 | 
					func (self *peer) setChainInfo(td *big.Int, c common.Hash) {
 | 
				
			||||||
	self.lock.Lock()
 | 
					 | 
				
			||||||
	defer self.lock.Unlock()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	self.td = td
 | 
						self.td = td
 | 
				
			||||||
	self.currentBlockHash = c
 | 
						self.currentBlockHash = c
 | 
				
			||||||
 | 
					 | 
				
			||||||
	self.currentBlock = nil
 | 
						self.currentBlock = nil
 | 
				
			||||||
	self.parentHash = common.Hash{}
 | 
						self.parentHash = common.Hash{}
 | 
				
			||||||
	self.headSection = nil
 | 
						self.headSection = nil
 | 
				
			||||||
@@ -171,7 +168,7 @@ func (self *peers) requestBlocks(attempts int, hashes []common.Hash) {
 | 
				
			|||||||
	defer self.lock.RUnlock()
 | 
						defer self.lock.RUnlock()
 | 
				
			||||||
	peerCount := len(self.peers)
 | 
						peerCount := len(self.peers)
 | 
				
			||||||
	// on first attempt use the best peer
 | 
						// on first attempt use the best peer
 | 
				
			||||||
	if attempts == 0 {
 | 
						if attempts == 0 && self.best != nil {
 | 
				
			||||||
		plog.DebugDetailf("request %v missing blocks from best peer <%s>", len(hashes), self.best.id)
 | 
							plog.DebugDetailf("request %v missing blocks from best peer <%s>", len(hashes), self.best.id)
 | 
				
			||||||
		self.best.requestBlocks(hashes)
 | 
							self.best.requestBlocks(hashes)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -219,10 +216,12 @@ func (self *peers) addPeer(
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	self.lock.Lock()
 | 
						self.lock.Lock()
 | 
				
			||||||
 | 
						defer self.lock.Unlock()
 | 
				
			||||||
	p, found := self.peers[id]
 | 
						p, found := self.peers[id]
 | 
				
			||||||
	if found {
 | 
						if found {
 | 
				
			||||||
		// when called on an already connected peer, it means a newBlockMsg is received
 | 
							// when called on an already connected peer, it means a newBlockMsg is received
 | 
				
			||||||
		// peer head info is updated
 | 
							// peer head info is updated
 | 
				
			||||||
 | 
							p.lock.Lock()
 | 
				
			||||||
		if p.currentBlockHash != currentBlockHash {
 | 
							if p.currentBlockHash != currentBlockHash {
 | 
				
			||||||
			previousBlockHash = p.currentBlockHash
 | 
								previousBlockHash = p.currentBlockHash
 | 
				
			||||||
			plog.Debugf("addPeer: Update peer <%s> with td %v and current block %s (was %v)", id, td, hex(currentBlockHash), hex(previousBlockHash))
 | 
								plog.Debugf("addPeer: Update peer <%s> with td %v and current block %s (was %v)", id, td, hex(currentBlockHash), hex(previousBlockHash))
 | 
				
			||||||
@@ -232,6 +231,7 @@ func (self *peers) addPeer(
 | 
				
			|||||||
			self.status.values.NewBlocks++
 | 
								self.status.values.NewBlocks++
 | 
				
			||||||
			self.status.lock.Unlock()
 | 
								self.status.lock.Unlock()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							p.lock.Unlock()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		p = self.newPeer(td, currentBlockHash, id, requestBlockHashes, requestBlocks, peerError)
 | 
							p = self.newPeer(td, currentBlockHash, id, requestBlockHashes, requestBlocks, peerError)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -243,7 +243,6 @@ func (self *peers) addPeer(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		plog.Debugf("addPeer: add new peer <%v> with td %v and current block %s", id, td, hex(currentBlockHash))
 | 
							plog.Debugf("addPeer: add new peer <%v> with td %v and current block %s", id, td, hex(currentBlockHash))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	self.lock.Unlock()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// check if peer's current head block is known
 | 
						// check if peer's current head block is known
 | 
				
			||||||
	if self.bp.hasBlock(currentBlockHash) {
 | 
						if self.bp.hasBlock(currentBlockHash) {
 | 
				
			||||||
@@ -269,7 +268,10 @@ func (self *peers) addPeer(
 | 
				
			|||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		// baseline is our own TD
 | 
							// baseline is our own TD
 | 
				
			||||||
		currentTD := self.bp.getTD()
 | 
							currentTD := self.bp.getTD()
 | 
				
			||||||
		if self.best != nil {
 | 
							bestpeer := self.best
 | 
				
			||||||
 | 
							if bestpeer != nil {
 | 
				
			||||||
 | 
								bestpeer.lock.Lock()
 | 
				
			||||||
 | 
								defer bestpeer.lock.Unlock()
 | 
				
			||||||
			currentTD = self.best.td
 | 
								currentTD = self.best.td
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if td.Cmp(currentTD) > 0 {
 | 
							if td.Cmp(currentTD) > 0 {
 | 
				
			||||||
@@ -277,11 +279,12 @@ func (self *peers) addPeer(
 | 
				
			|||||||
			self.status.bestPeers[p.id]++
 | 
								self.status.bestPeers[p.id]++
 | 
				
			||||||
			self.status.lock.Unlock()
 | 
								self.status.lock.Unlock()
 | 
				
			||||||
			plog.Debugf("addPeer: peer <%v> (td: %v > current td %v) promoted best peer", id, td, currentTD)
 | 
								plog.Debugf("addPeer: peer <%v> (td: %v > current td %v) promoted best peer", id, td, currentTD)
 | 
				
			||||||
			self.bp.switchPeer(self.best, p)
 | 
								self.bp.switchPeer(bestpeer, p)
 | 
				
			||||||
			self.best = p
 | 
								self.best = p
 | 
				
			||||||
			best = true
 | 
								best = true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -127,6 +127,11 @@ func CopyBytes(b []byte) (copiedBytes []byte) {
 | 
				
			|||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func HasHexPrefix(str string) bool {
 | 
				
			||||||
 | 
						l := len(str)
 | 
				
			||||||
 | 
						return l >= 2 && str[0:2] == "0x"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func IsHex(str string) bool {
 | 
					func IsHex(str string) bool {
 | 
				
			||||||
	l := len(str)
 | 
						l := len(str)
 | 
				
			||||||
	return l >= 4 && l%2 == 0 && str[0:2] == "0x"
 | 
						return l >= 4 && l%2 == 0 && str[0:2] == "0x"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										47
									
								
								rpc/api.go
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								rpc/api.go
									
									
									
									
									
								
							@@ -2,6 +2,7 @@ package rpc
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						// "fmt"
 | 
				
			||||||
	"math/big"
 | 
						"math/big"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -112,7 +113,11 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		block := NewBlockRes(api.xeth().EthBlockByHash(args.Hash), false)
 | 
							block := NewBlockRes(api.xeth().EthBlockByHash(args.Hash), false)
 | 
				
			||||||
 | 
							if block == nil {
 | 
				
			||||||
 | 
								*reply = nil
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
			*reply = common.ToHex(big.NewInt(int64(len(block.Transactions))).Bytes())
 | 
								*reply = common.ToHex(big.NewInt(int64(len(block.Transactions))).Bytes())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	case "eth_getBlockTransactionCountByNumber":
 | 
						case "eth_getBlockTransactionCountByNumber":
 | 
				
			||||||
		args := new(BlockNumArg)
 | 
							args := new(BlockNumArg)
 | 
				
			||||||
		if err := json.Unmarshal(req.Params, &args); err != nil {
 | 
							if err := json.Unmarshal(req.Params, &args); err != nil {
 | 
				
			||||||
@@ -192,9 +197,9 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		*reply = br
 | 
							*reply = br
 | 
				
			||||||
	case "eth_getTransactionByHash":
 | 
						case "eth_getTransactionByHash":
 | 
				
			||||||
		// HashIndexArgs used, but only the "Hash" part we need.
 | 
							args := new(HashArgs)
 | 
				
			||||||
		args := new(HashIndexArgs)
 | 
					 | 
				
			||||||
		if err := json.Unmarshal(req.Params, &args); err != nil {
 | 
							if err := json.Unmarshal(req.Params, &args); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		tx, bhash, bnum, txi := api.xeth().EthTransactionByHash(args.Hash)
 | 
							tx, bhash, bnum, txi := api.xeth().EthTransactionByHash(args.Hash)
 | 
				
			||||||
		if tx != nil {
 | 
							if tx != nil {
 | 
				
			||||||
@@ -212,11 +217,16 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		block := api.xeth().EthBlockByHash(args.Hash)
 | 
							block := api.xeth().EthBlockByHash(args.Hash)
 | 
				
			||||||
		br := NewBlockRes(block, true)
 | 
							br := NewBlockRes(block, true)
 | 
				
			||||||
 | 
							if br == nil {
 | 
				
			||||||
 | 
								*reply = nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if args.Index >= int64(len(br.Transactions)) || args.Index < 0 {
 | 
							if args.Index >= int64(len(br.Transactions)) || args.Index < 0 {
 | 
				
			||||||
			return NewValidationError("Index", "does not exist")
 | 
								// return NewValidationError("Index", "does not exist")
 | 
				
			||||||
		}
 | 
								*reply = nil
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
			*reply = br.Transactions[args.Index]
 | 
								*reply = br.Transactions[args.Index]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	case "eth_getTransactionByBlockNumberAndIndex":
 | 
						case "eth_getTransactionByBlockNumberAndIndex":
 | 
				
			||||||
		args := new(BlockNumIndexArgs)
 | 
							args := new(BlockNumIndexArgs)
 | 
				
			||||||
		if err := json.Unmarshal(req.Params, &args); err != nil {
 | 
							if err := json.Unmarshal(req.Params, &args); err != nil {
 | 
				
			||||||
@@ -225,11 +235,16 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		block := api.xeth().EthBlockByNumber(args.BlockNumber)
 | 
							block := api.xeth().EthBlockByNumber(args.BlockNumber)
 | 
				
			||||||
		v := NewBlockRes(block, true)
 | 
							v := NewBlockRes(block, true)
 | 
				
			||||||
 | 
							if v == nil {
 | 
				
			||||||
 | 
								*reply = nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if args.Index >= int64(len(v.Transactions)) || args.Index < 0 {
 | 
							if args.Index >= int64(len(v.Transactions)) || args.Index < 0 {
 | 
				
			||||||
			return NewValidationError("Index", "does not exist")
 | 
								// return NewValidationError("Index", "does not exist")
 | 
				
			||||||
		}
 | 
								*reply = nil
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
			*reply = v.Transactions[args.Index]
 | 
								*reply = v.Transactions[args.Index]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	case "eth_getUncleByBlockHashAndIndex":
 | 
						case "eth_getUncleByBlockHashAndIndex":
 | 
				
			||||||
		args := new(HashIndexArgs)
 | 
							args := new(HashIndexArgs)
 | 
				
			||||||
		if err := json.Unmarshal(req.Params, &args); err != nil {
 | 
							if err := json.Unmarshal(req.Params, &args); err != nil {
 | 
				
			||||||
@@ -243,13 +258,11 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if args.Index >= int64(len(br.Uncles)) || args.Index < 0 {
 | 
							if args.Index >= int64(len(br.Uncles)) || args.Index < 0 {
 | 
				
			||||||
			return NewValidationError("Index", "does not exist")
 | 
								// return NewValidationError("Index", "does not exist")
 | 
				
			||||||
 | 
								*reply = nil
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								*reply = br.Uncles[args.Index]
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		uhash := br.Uncles[args.Index]
 | 
					 | 
				
			||||||
		uncle := NewBlockRes(api.xeth().EthBlockByHash(uhash.String()), false)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		*reply = uncle
 | 
					 | 
				
			||||||
	case "eth_getUncleByBlockNumberAndIndex":
 | 
						case "eth_getUncleByBlockNumberAndIndex":
 | 
				
			||||||
		args := new(BlockNumIndexArgs)
 | 
							args := new(BlockNumIndexArgs)
 | 
				
			||||||
		if err := json.Unmarshal(req.Params, &args); err != nil {
 | 
							if err := json.Unmarshal(req.Params, &args); err != nil {
 | 
				
			||||||
@@ -265,13 +278,11 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if args.Index >= int64(len(v.Uncles)) || args.Index < 0 {
 | 
							if args.Index >= int64(len(v.Uncles)) || args.Index < 0 {
 | 
				
			||||||
			return NewValidationError("Index", "does not exist")
 | 
								// return NewValidationError("Index", "does not exist")
 | 
				
			||||||
 | 
								*reply = nil
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								*reply = v.Uncles[args.Index]
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		uhash := v.Uncles[args.Index]
 | 
					 | 
				
			||||||
		uncle := NewBlockRes(api.xeth().EthBlockByHash(uhash.String()), false)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		*reply = uncle
 | 
					 | 
				
			||||||
	case "eth_getCompilers":
 | 
						case "eth_getCompilers":
 | 
				
			||||||
		c := []string{""}
 | 
							c := []string{""}
 | 
				
			||||||
		*reply = c
 | 
							*reply = c
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,7 +41,11 @@ func blockHeight(raw interface{}, number *int64) error {
 | 
				
			|||||||
	case "pending":
 | 
						case "pending":
 | 
				
			||||||
		*number = -2
 | 
							*number = -2
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
 | 
							if common.HasHexPrefix(str) {
 | 
				
			||||||
			*number = common.String2Big(str).Int64()
 | 
								*number = common.String2Big(str).Int64()
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								return NewInvalidTypeError("blockNumber", "is not a valid string")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
@@ -1021,12 +1025,15 @@ func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) {
 | 
				
			|||||||
		return NewInsufficientParamsError(len(obj), 1)
 | 
							return NewInsufficientParamsError(len(obj), 1)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var argstr string
 | 
						if obj[0].To == nil {
 | 
				
			||||||
 | 
							args.To = ""
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
		argstr, ok := obj[0].To.(string)
 | 
							argstr, ok := obj[0].To.(string)
 | 
				
			||||||
		if !ok {
 | 
							if !ok {
 | 
				
			||||||
			return NewInvalidTypeError("to", "is not a string")
 | 
								return NewInvalidTypeError("to", "is not a string")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		args.To = argstr
 | 
							args.To = argstr
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	t := make([]string, len(obj[0].Topics))
 | 
						t := make([]string, len(obj[0].Topics))
 | 
				
			||||||
	for i, j := range obj[0].Topics {
 | 
						for i, j := range obj[0].Topics {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1805,6 +1805,16 @@ func TestWhisperFilterArgsEmpty(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestWhisperFilterArgsToInt(t *testing.T) {
 | 
				
			||||||
 | 
						input := `[{"to": 2}]`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						args := new(WhisperFilterArgs)
 | 
				
			||||||
 | 
						str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), args))
 | 
				
			||||||
 | 
						if len(str) > 0 {
 | 
				
			||||||
 | 
							t.Error(str)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestWhisperFilterArgsToBool(t *testing.T) {
 | 
					func TestWhisperFilterArgsToBool(t *testing.T) {
 | 
				
			||||||
	input := `[{"topics": ["0x68656c6c6f20776f726c64"], "to": false}]`
 | 
						input := `[{"topics": ["0x68656c6c6f20776f726c64"], "to": false}]`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1815,6 +1825,21 @@ func TestWhisperFilterArgsToBool(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestWhisperFilterArgsToMissing(t *testing.T) {
 | 
				
			||||||
 | 
						input := `[{"topics": ["0x68656c6c6f20776f726c64"]}]`
 | 
				
			||||||
 | 
						expected := new(WhisperFilterArgs)
 | 
				
			||||||
 | 
						expected.To = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						args := new(WhisperFilterArgs)
 | 
				
			||||||
 | 
						if err := json.Unmarshal([]byte(input), &args); err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if args.To != expected.To {
 | 
				
			||||||
 | 
							t.Errorf("To shoud be %v but is %v", expected.To, args.To)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestWhisperFilterArgsTopicInt(t *testing.T) {
 | 
					func TestWhisperFilterArgsTopicInt(t *testing.T) {
 | 
				
			||||||
	input := `[{"topics": [6], "to": "0x34ag445g3455b34"}]`
 | 
						input := `[{"topics": [6], "to": "0x34ag445g3455b34"}]`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2090,6 +2115,51 @@ func TestHashIndexArgsInvalidIndex(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestHashArgs(t *testing.T) {
 | 
				
			||||||
 | 
						input := `["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b"]`
 | 
				
			||||||
 | 
						expected := new(HashIndexArgs)
 | 
				
			||||||
 | 
						expected.Hash = "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						args := new(HashArgs)
 | 
				
			||||||
 | 
						if err := json.Unmarshal([]byte(input), &args); err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if expected.Hash != args.Hash {
 | 
				
			||||||
 | 
							t.Errorf("Hash shoud be %#v but is %#v", expected.Hash, args.Hash)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestHashArgsEmpty(t *testing.T) {
 | 
				
			||||||
 | 
						input := `[]`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						args := new(HashArgs)
 | 
				
			||||||
 | 
						str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), &args))
 | 
				
			||||||
 | 
						if len(str) > 0 {
 | 
				
			||||||
 | 
							t.Error(str)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestHashArgsInvalid(t *testing.T) {
 | 
				
			||||||
 | 
						input := `{}`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						args := new(HashArgs)
 | 
				
			||||||
 | 
						str := ExpectDecodeParamError(json.Unmarshal([]byte(input), &args))
 | 
				
			||||||
 | 
						if len(str) > 0 {
 | 
				
			||||||
 | 
							t.Error(str)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestHashArgsInvalidHash(t *testing.T) {
 | 
				
			||||||
 | 
						input := `[7]`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						args := new(HashArgs)
 | 
				
			||||||
 | 
						str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), &args))
 | 
				
			||||||
 | 
						if len(str) > 0 {
 | 
				
			||||||
 | 
							t.Error(str)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestSubmitWorkArgs(t *testing.T) {
 | 
					func TestSubmitWorkArgs(t *testing.T) {
 | 
				
			||||||
	input := `["0x0000000000000001", "0x1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000"]`
 | 
						input := `["0x0000000000000001", "0x1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000"]`
 | 
				
			||||||
	expected := new(SubmitWorkArgs)
 | 
						expected := new(SubmitWorkArgs)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,7 @@ type BlockRes struct {
 | 
				
			|||||||
	GasUsed         *hexnum           `json:"gasUsed"`
 | 
						GasUsed         *hexnum           `json:"gasUsed"`
 | 
				
			||||||
	UnixTimestamp   *hexnum           `json:"timestamp"`
 | 
						UnixTimestamp   *hexnum           `json:"timestamp"`
 | 
				
			||||||
	Transactions    []*TransactionRes `json:"transactions"`
 | 
						Transactions    []*TransactionRes `json:"transactions"`
 | 
				
			||||||
	Uncles          []*hexdata        `json:"uncles"`
 | 
						Uncles          []*UncleRes       `json:"uncles"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *BlockRes) MarshalJSON() ([]byte, error) {
 | 
					func (b *BlockRes) MarshalJSON() ([]byte, error) {
 | 
				
			||||||
@@ -73,7 +73,10 @@ func (b *BlockRes) MarshalJSON() ([]byte, error) {
 | 
				
			|||||||
		ext.GasUsed = b.GasUsed
 | 
							ext.GasUsed = b.GasUsed
 | 
				
			||||||
		ext.UnixTimestamp = b.UnixTimestamp
 | 
							ext.UnixTimestamp = b.UnixTimestamp
 | 
				
			||||||
		ext.Transactions = b.Transactions
 | 
							ext.Transactions = b.Transactions
 | 
				
			||||||
		ext.Uncles = b.Uncles
 | 
							ext.Uncles = make([]*hexdata, len(b.Uncles))
 | 
				
			||||||
 | 
							for i, u := range b.Uncles {
 | 
				
			||||||
 | 
								ext.Uncles[i] = u.BlockHash
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		return json.Marshal(ext)
 | 
							return json.Marshal(ext)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		var ext struct {
 | 
							var ext struct {
 | 
				
			||||||
@@ -119,14 +122,15 @@ func (b *BlockRes) MarshalJSON() ([]byte, error) {
 | 
				
			|||||||
		for i, tx := range b.Transactions {
 | 
							for i, tx := range b.Transactions {
 | 
				
			||||||
			ext.Transactions[i] = tx.Hash
 | 
								ext.Transactions[i] = tx.Hash
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ext.Uncles = b.Uncles
 | 
							ext.Uncles = make([]*hexdata, len(b.Uncles))
 | 
				
			||||||
 | 
							for i, u := range b.Uncles {
 | 
				
			||||||
 | 
								ext.Uncles[i] = u.BlockHash
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		return json.Marshal(ext)
 | 
							return json.Marshal(ext)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewBlockRes(block *types.Block, fullTx bool) *BlockRes {
 | 
					func NewBlockRes(block *types.Block, fullTx bool) *BlockRes {
 | 
				
			||||||
	// TODO respect fullTx flag
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if block == nil {
 | 
						if block == nil {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -159,9 +163,9 @@ func NewBlockRes(block *types.Block, fullTx bool) *BlockRes {
 | 
				
			|||||||
		res.Transactions[i].TxIndex = newHexNum(i)
 | 
							res.Transactions[i].TxIndex = newHexNum(i)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res.Uncles = make([]*hexdata, len(block.Uncles()))
 | 
						res.Uncles = make([]*UncleRes, len(block.Uncles()))
 | 
				
			||||||
	for i, uncle := range block.Uncles() {
 | 
						for i, uncle := range block.Uncles() {
 | 
				
			||||||
		res.Uncles[i] = newHexData(uncle.Hash())
 | 
							res.Uncles[i] = NewUncleRes(uncle)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return res
 | 
						return res
 | 
				
			||||||
@@ -182,6 +186,10 @@ type TransactionRes struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewTransactionRes(tx *types.Transaction) *TransactionRes {
 | 
					func NewTransactionRes(tx *types.Transaction) *TransactionRes {
 | 
				
			||||||
 | 
						if tx == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var v = new(TransactionRes)
 | 
						var v = new(TransactionRes)
 | 
				
			||||||
	v.Hash = newHexData(tx.Hash())
 | 
						v.Hash = newHexData(tx.Hash())
 | 
				
			||||||
	v.Nonce = newHexNum(tx.Nonce())
 | 
						v.Nonce = newHexNum(tx.Nonce())
 | 
				
			||||||
@@ -198,6 +206,49 @@ func NewTransactionRes(tx *types.Transaction) *TransactionRes {
 | 
				
			|||||||
	return v
 | 
						return v
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UncleRes struct {
 | 
				
			||||||
 | 
						BlockNumber     *hexnum  `json:"number"`
 | 
				
			||||||
 | 
						BlockHash       *hexdata `json:"hash"`
 | 
				
			||||||
 | 
						ParentHash      *hexdata `json:"parentHash"`
 | 
				
			||||||
 | 
						Nonce           *hexdata `json:"nonce"`
 | 
				
			||||||
 | 
						Sha3Uncles      *hexdata `json:"sha3Uncles"`
 | 
				
			||||||
 | 
						ReceiptHash     *hexdata `json:"receiptHash"`
 | 
				
			||||||
 | 
						LogsBloom       *hexdata `json:"logsBloom"`
 | 
				
			||||||
 | 
						TransactionRoot *hexdata `json:"transactionsRoot"`
 | 
				
			||||||
 | 
						StateRoot       *hexdata `json:"stateRoot"`
 | 
				
			||||||
 | 
						Miner           *hexdata `json:"miner"`
 | 
				
			||||||
 | 
						Difficulty      *hexnum  `json:"difficulty"`
 | 
				
			||||||
 | 
						ExtraData       *hexdata `json:"extraData"`
 | 
				
			||||||
 | 
						GasLimit        *hexnum  `json:"gasLimit"`
 | 
				
			||||||
 | 
						GasUsed         *hexnum  `json:"gasUsed"`
 | 
				
			||||||
 | 
						UnixTimestamp   *hexnum  `json:"timestamp"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewUncleRes(h *types.Header) *UncleRes {
 | 
				
			||||||
 | 
						if h == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var v = new(UncleRes)
 | 
				
			||||||
 | 
						v.BlockNumber = newHexNum(h.Number)
 | 
				
			||||||
 | 
						v.BlockHash = newHexData(h.Hash())
 | 
				
			||||||
 | 
						v.ParentHash = newHexData(h.ParentHash)
 | 
				
			||||||
 | 
						v.Sha3Uncles = newHexData(h.UncleHash)
 | 
				
			||||||
 | 
						v.Nonce = newHexData(h.Nonce[:])
 | 
				
			||||||
 | 
						v.LogsBloom = newHexData(h.Bloom)
 | 
				
			||||||
 | 
						v.TransactionRoot = newHexData(h.TxHash)
 | 
				
			||||||
 | 
						v.StateRoot = newHexData(h.Root)
 | 
				
			||||||
 | 
						v.Miner = newHexData(h.Coinbase)
 | 
				
			||||||
 | 
						v.Difficulty = newHexNum(h.Difficulty)
 | 
				
			||||||
 | 
						v.ExtraData = newHexData(h.Extra)
 | 
				
			||||||
 | 
						v.GasLimit = newHexNum(h.GasLimit)
 | 
				
			||||||
 | 
						v.GasUsed = newHexNum(h.GasUsed)
 | 
				
			||||||
 | 
						v.UnixTimestamp = newHexNum(h.Time)
 | 
				
			||||||
 | 
						v.ReceiptHash = newHexData(h.ReceiptHash)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return v
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// type FilterLogRes struct {
 | 
					// type FilterLogRes struct {
 | 
				
			||||||
// 	Hash             string `json:"hash"`
 | 
					// 	Hash             string `json:"hash"`
 | 
				
			||||||
// 	Address          string `json:"address"`
 | 
					// 	Address          string `json:"address"`
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -196,7 +196,7 @@ func (self *XEth) EthTransactionByHash(hash string) (tx *types.Transaction, blha
 | 
				
			|||||||
	// meta
 | 
						// meta
 | 
				
			||||||
	var txExtra struct {
 | 
						var txExtra struct {
 | 
				
			||||||
		BlockHash  common.Hash
 | 
							BlockHash  common.Hash
 | 
				
			||||||
		BlockIndex int64
 | 
							BlockIndex uint64
 | 
				
			||||||
		Index      uint64
 | 
							Index      uint64
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -205,8 +205,10 @@ func (self *XEth) EthTransactionByHash(hash string) (tx *types.Transaction, blha
 | 
				
			|||||||
	err := rlp.Decode(r, &txExtra)
 | 
						err := rlp.Decode(r, &txExtra)
 | 
				
			||||||
	if err == nil {
 | 
						if err == nil {
 | 
				
			||||||
		blhash = txExtra.BlockHash
 | 
							blhash = txExtra.BlockHash
 | 
				
			||||||
		blnum = big.NewInt(txExtra.BlockIndex)
 | 
							blnum = big.NewInt(int64(txExtra.BlockIndex))
 | 
				
			||||||
		txi = txExtra.Index
 | 
							txi = txExtra.Index
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							pipelogger.Errorln(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user