| 
									
										
										
										
											2015-01-13 09:13:43 -06:00
										 |  |  | /* | 
					
						
							|  |  |  | 	This file is part of go-ethereum | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	go-ethereum is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | 	it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  | 	the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | 	(at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	go-ethereum is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | 	but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |   GNU General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | 	along with go-ethereum.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2014-10-21 13:24:48 +02:00
										 |  |  | package rpc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 	"io" | 
					
						
							| 
									
										
										
										
											2015-01-12 23:25:29 -06:00
										 |  |  | 	"net/http" | 
					
						
							| 
									
										
										
										
											2015-02-04 15:05:47 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-29 11:39:59 -06:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethutil" | 
					
						
							| 
									
										
										
										
											2015-02-04 15:05:47 -08:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							| 
									
										
										
										
											2015-01-29 11:39:59 -06:00
										 |  |  | 	"github.com/ethereum/go-ethereum/state" | 
					
						
							| 
									
										
										
										
											2014-10-21 13:24:48 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-25 14:50:43 -06:00
										 |  |  | var rpclogger = logger.NewLogger("RPC") | 
					
						
							| 
									
										
										
										
											2014-10-21 13:24:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-25 14:50:43 -06:00
										 |  |  | type JsonWrapper struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self JsonWrapper) Send(writer io.Writer, v interface{}) (n int, err error) { | 
					
						
							| 
									
										
										
										
											2014-10-21 13:24:48 +02:00
										 |  |  | 	var payload []byte | 
					
						
							|  |  |  | 	payload, err = json.Marshal(v) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-25 14:50:43 -06:00
										 |  |  | 		rpclogger.Fatalln("Error marshalling JSON", err) | 
					
						
							| 
									
										
										
										
											2014-10-21 13:24:48 +02:00
										 |  |  | 		return 0, err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-02-04 15:05:47 -08:00
										 |  |  | 	rpclogger.DebugDetailf("Sending payload: %s", payload) | 
					
						
							| 
									
										
										
										
											2014-10-21 13:24:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return writer.Write(payload) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-25 14:50:43 -06:00
										 |  |  | func (self JsonWrapper) ParseRequestBody(req *http.Request) (RpcRequest, error) { | 
					
						
							| 
									
										
										
										
											2015-01-12 23:25:29 -06:00
										 |  |  | 	var reqParsed RpcRequest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Convert JSON to native types | 
					
						
							|  |  |  | 	d := json.NewDecoder(req.Body) | 
					
						
							|  |  |  | 	defer req.Body.Close() | 
					
						
							|  |  |  | 	err := d.Decode(&reqParsed) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-25 14:50:43 -06:00
										 |  |  | 		rpclogger.Errorln("Error decoding JSON: ", err) | 
					
						
							| 
									
										
										
										
											2015-01-12 23:25:29 -06:00
										 |  |  | 		return reqParsed, err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-02-11 11:56:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-25 14:50:43 -06:00
										 |  |  | 	rpclogger.DebugDetailf("Parsed request: %s", reqParsed) | 
					
						
							| 
									
										
										
										
											2015-01-12 23:25:29 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return reqParsed, nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-29 11:39:59 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | func toHex(b []byte) string { | 
					
						
							|  |  |  | 	return "0x" + ethutil.Bytes2Hex(b) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | func fromHex(s string) []byte { | 
					
						
							|  |  |  | 	if len(s) > 1 { | 
					
						
							|  |  |  | 		if s[0:2] == "0x" { | 
					
						
							|  |  |  | 			s = s[2:] | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return ethutil.Hex2Bytes(s) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type RpcServer interface { | 
					
						
							|  |  |  | 	Start() | 
					
						
							|  |  |  | 	Stop() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Log struct { | 
					
						
							|  |  |  | 	Address string   `json:"address"` | 
					
						
							|  |  |  | 	Topics  []string `json:"topics"` | 
					
						
							|  |  |  | 	Data    string   `json:"data"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func toLogs(logs state.Logs) (ls []Log) { | 
					
						
							|  |  |  | 	ls = make([]Log, len(logs)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, log := range logs { | 
					
						
							|  |  |  | 		var l Log | 
					
						
							|  |  |  | 		l.Topics = make([]string, len(log.Topics())) | 
					
						
							|  |  |  | 		l.Address = toHex(log.Address()) | 
					
						
							|  |  |  | 		l.Data = toHex(log.Data()) | 
					
						
							|  |  |  | 		for j, topic := range log.Topics() { | 
					
						
							|  |  |  | 			l.Topics[j] = toHex(topic) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		ls[i] = l | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | } |