github.com/btcsuite/btcd@v0.24.0/btcjson/doc.go (about) 1 // Copyright (c) 2015 The btcsuite developers 2 // Use of this source code is governed by an ISC 3 // license that can be found in the LICENSE file. 4 5 /* 6 Package btcjson provides primitives for working with the bitcoin JSON-RPC API. 7 8 # Overview 9 10 When communicating via the JSON-RPC protocol, all of the commands need to be 11 marshalled to and from the wire in the appropriate format. This package 12 provides data structures and primitives to ease this process. 13 14 In addition, it also provides some additional features such as custom command 15 registration, command categorization, and reflection-based help generation. 16 17 # JSON-RPC Protocol Overview 18 19 This information is not necessary in order to use this package, but it does 20 provide some intuition into what the marshalling and unmarshalling that is 21 discussed below is doing under the hood. 22 23 As defined by the JSON-RPC spec, there are effectively two forms of messages on 24 the wire: 25 26 - Request Objects 27 {"jsonrpc":"1.0","id":"SOMEID","method":"SOMEMETHOD","params":[SOMEPARAMS]} 28 NOTE: Notifications are the same format except the id field is null. 29 30 - Response Objects 31 {"result":SOMETHING,"error":null,"id":"SOMEID"} 32 {"result":null,"error":{"code":SOMEINT,"message":SOMESTRING},"id":"SOMEID"} 33 34 For requests, the params field can vary in what it contains depending on the 35 method (a.k.a. command) being sent. Each parameter can be as simple as an int 36 or a complex structure containing many nested fields. The id field is used to 37 identify a request and will be included in the associated response. 38 39 When working with asynchronous transports, such as websockets, spontaneous 40 notifications are also possible. As indicated, they are the same as a request 41 object, except they have the id field set to null. Therefore, servers will 42 ignore requests with the id field set to null, while clients can choose to 43 consume or ignore them. 44 45 Unfortunately, the original Bitcoin JSON-RPC API (and hence anything compatible 46 with it) doesn't always follow the spec and will sometimes return an error 47 string in the result field with a null error for certain commands. However, 48 for the most part, the error field will be set as described on failure. 49 50 # Marshalling and Unmarshalling 51 52 Based upon the discussion above, it should be easy to see how the types of this 53 package map into the required parts of the protocol 54 55 - Request Objects (type Request) 56 1. Commands (type <Foo>Cmd) 57 2. Notifications (type <Foo>Ntfn) 58 - Response Objects (type Response) 59 1. Result (type <Foo>Result) 60 61 To simplify the marshalling of the requests and responses, the MarshalCmd and 62 MarshalResponse functions are provided. They return the raw bytes ready to be 63 sent across the wire. 64 65 Unmarshalling a received Request object is a two step process: 66 1. Unmarshal the raw bytes into a Request struct instance via json.Unmarshal 67 2. Use UnmarshalCmd on the Result field of the unmarshalled Request to create 68 a concrete command or notification instance with all struct fields set 69 accordingly 70 71 This approach is used since it provides the caller with access to the additional 72 fields in the request that are not part of the command such as the ID. 73 74 Unmarshalling a received Response object is also a two step process: 75 1. Unmarhsal the raw bytes into a Response struct instance via json.Unmarshal 76 2. Depending on the ID, unmarshal the Result field of the unmarshalled 77 Response to create a concrete type instance 78 79 As above, this approach is used since it provides the caller with access to the 80 fields in the response such as the ID and Error. 81 82 # Command Creation 83 84 This package provides two approaches for creating a new command. This first, 85 and preferred, method is to use one of the New<Foo>Cmd functions. This allows 86 static compile-time checking to help ensure the parameters stay in sync with 87 the struct definitions. 88 89 The second approach is the NewCmd function which takes a method (command) name 90 and variable arguments. The function includes full checking to ensure the 91 parameters are accurate according to provided method, however these checks are, 92 obviously, run-time which means any mistakes won't be found until the code is 93 actually executed. However, it is quite useful for user-supplied commands 94 that are intentionally dynamic. 95 96 # Custom Command Registration 97 98 The command handling of this package is built around the concept of registered 99 commands. This is true for the wide variety of commands already provided by the 100 package, but it also means caller can easily provide custom commands with all 101 of the same functionality as the built-in commands. Use the RegisterCmd 102 function for this purpose. 103 104 A list of all registered methods can be obtained with the RegisteredCmdMethods 105 function. 106 107 # Command Inspection 108 109 All registered commands are registered with flags that identify information such 110 as whether the command applies to a chain server, wallet server, or is a 111 notification along with the method name to use. These flags can be obtained 112 with the MethodUsageFlags flags, and the method can be obtained with the 113 CmdMethod function. 114 115 # Help Generation 116 117 To facilitate providing consistent help to users of the RPC server, this package 118 exposes the GenerateHelp and function which uses reflection on registered 119 commands or notifications, as well as the provided expected result types, to 120 generate the final help text. 121 122 In addition, the MethodUsageText function is provided to generate consistent 123 one-line usage for registered commands and notifications using reflection. 124 125 # Errors 126 127 There are 2 distinct type of errors supported by this package: 128 129 - General errors related to marshalling or unmarshalling or improper use of 130 the package (type Error) 131 - RPC errors which are intended to be returned across the wire as a part of 132 the JSON-RPC response (type RPCError) 133 134 The first category of errors (type Error) typically indicates a programmer error 135 and can be avoided by properly using the API. Errors of this type will be 136 returned from the various functions available in this package. They identify 137 issues such as unsupported field types, attempts to register malformed commands, 138 and attempting to create a new command with an improper number of parameters. 139 The specific reason for the error can be detected by type asserting it to a 140 *btcjson.Error and accessing the ErrorCode field. 141 142 The second category of errors (type RPCError), on the other hand, are useful for 143 returning errors to RPC clients. Consequently, they are used in the previously 144 described Response type. 145 */ 146 package btcjson