| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							|  |  |  | // This file is part of the go-ethereum library. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library 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 Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							|  |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Package rpc implements bi-directional JSON-RPC 2.0 on multiple transports. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | It provides access to the exported methods of an object across a network or other I/O | 
					
						
							|  |  |  | connection. After creating a server or client instance, objects can be registered to make | 
					
						
							|  |  |  | them visible as 'services'. Exported methods that follow specific conventions can be | 
					
						
							|  |  |  | called remotely. It also has support for the publish/subscribe pattern. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RPC Methods | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | Methods that satisfy the following criteria are made available for remote access: | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  |  - method must be exported | 
					
						
							|  |  |  |  - method returns 0, 1 (response or error) or 2 (response and error) values | 
					
						
							|  |  |  |  - method argument(s) must be exported or builtin types | 
					
						
							|  |  |  |  - method returned value(s) must be exported or builtin types | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | An example method: | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-14 09:38:54 +01:00
										 |  |  |  func (s *CalcService) Add(a, b int) (int, error) | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | When the returned error isn't nil the returned integer is ignored and the error is sent | 
					
						
							|  |  |  | back to the client. Otherwise the returned integer is sent back to the client. | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | Optional arguments are supported by accepting pointer values as arguments. E.g. if we want | 
					
						
							|  |  |  | to do the addition in an optional finite field we can accept a mod argument as pointer | 
					
						
							|  |  |  | value. | 
					
						
							| 
									
										
										
										
											2016-03-14 09:38:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  |  func (s *CalcService) Add(a, b int, mod *int) (int, error) | 
					
						
							| 
									
										
										
										
											2016-03-14 09:38:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | This RPC method can be called with 2 integers and a null value as third argument. In that | 
					
						
							|  |  |  | case the mod argument will be nil. Or it can be called with 3 integers, in that case mod | 
					
						
							|  |  |  | will be pointing to the given third argument. Since the optional argument is the last | 
					
						
							|  |  |  | argument the RPC package will also accept 2 integers as arguments. It will pass the mod | 
					
						
							|  |  |  | argument as nil to the RPC method. | 
					
						
							| 
									
										
										
										
											2016-03-14 09:38:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | The server offers the ServeCodec method which accepts a ServerCodec instance. It will read | 
					
						
							|  |  |  | requests from the codec, process the request and sends the response back to the client | 
					
						
							|  |  |  | using the codec. The server can execute requests concurrently. Responses can be sent back | 
					
						
							|  |  |  | to the client out of order. | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | An example server which uses the JSON codec: | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  |  type CalculatorService struct {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  func (s *CalculatorService) Add(a, b int) int { | 
					
						
							|  |  |  | 	return a + b | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-23 03:09:45 +08:00
										 |  |  |  func (s *CalculatorService) Div(a, b int) (int, error) { | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  | 	if b == 0 { | 
					
						
							|  |  |  | 		return 0, errors.New("divide by zero") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return a/b, nil | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  calculator := new(CalculatorService) | 
					
						
							|  |  |  |  server := NewServer() | 
					
						
							|  |  |  |  server.RegisterName("calculator", calculator") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  l, _ := net.ListenUnix("unix", &net.UnixAddr{Net: "unix", Name: "/tmp/calculator.sock"}) | 
					
						
							|  |  |  |  for { | 
					
						
							|  |  |  | 	c, _ := l.AcceptUnix() | 
					
						
							|  |  |  | 	codec := v2.NewJSONCodec(c) | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | 	go server.ServeCodec(codec, 0) | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  |  } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | Subscriptions | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  | The package also supports the publish subscribe pattern through the use of subscriptions. | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | A method that is considered eligible for notifications must satisfy the following | 
					
						
							|  |  |  | criteria: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  |  - method must be exported | 
					
						
							| 
									
										
										
										
											2016-03-29 15:07:40 +02:00
										 |  |  |  - first method argument type must be context.Context | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  |  - method argument(s) must be exported or builtin types | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  |  - method must have return types (rpc.Subscription, error) | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | An example method: | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |  func (s *BlockChainService) NewBlocks(ctx context.Context) (rpc.Subscription, error) { | 
					
						
							| 
									
										
										
										
											2016-03-29 15:07:40 +02:00
										 |  |  |  	... | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  |  } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-04 13:47:34 +01:00
										 |  |  | When the service containing the subscription method is registered to the server, for | 
					
						
							|  |  |  | example under the "blockchain" namespace, a subscription is created by calling the | 
					
						
							|  |  |  | "blockchain_subscribe" method. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Subscriptions are deleted when the user sends an unsubscribe request or when the | 
					
						
							|  |  |  | connection which was used to create the subscription is closed. This can be initiated by | 
					
						
							|  |  |  | the client and server. The server will close the connection for any write error. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For more information about subscriptions, see https://github.com/ethereum/go-ethereum/wiki/RPC-PUB-SUB. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Reverse Calls | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In any method handler, an instance of rpc.Client can be accessed through the | 
					
						
							|  |  |  | ClientFromContext method. Using this client instance, server-to-client method calls can be | 
					
						
							|  |  |  | performed on the RPC connection. | 
					
						
							| 
									
										
										
										
											2015-10-15 16:07:19 +02:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2015-12-16 10:58:01 +01:00
										 |  |  | package rpc |