2015-05-01 08:28:01 +02:00
// Copyright (c) 2015 The btcsuite developers
2015-02-21 05:34:57 +01:00
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.
package main
import (
"errors"
"sort"
"strings"
"sync"
2015-04-06 06:15:49 +02:00
"github.com/btcsuite/btcd/btcjson"
2015-02-21 05:34:57 +01:00
)
// helpDescsEnUS defines the English descriptions used for the help strings.
var helpDescsEnUS = map [ string ] string {
// DebugLevelCmd help.
"debuglevel--synopsis" : "Dynamically changes the debug logging level.\n" +
"The levelspec can either a debug level or of the form:\n" +
"<subsystem>=<level>,<subsystem2>=<level2>,...\n" +
"The valid debug levels are trace, debug, info, warn, error, and critical.\n" +
"The valid subsystems are AMGR, ADXR, BCDB, BMGR, BTCD, CHAN, DISC, PEER, RPCS, SCRP, SRVR, and TXMP.\n" +
"Finally the keyword 'show' will return a list of the available subsystems." ,
"debuglevel-levelspec" : "The debug level(s) to use or the keyword 'show'" ,
"debuglevel--condition0" : "levelspec!=show" ,
"debuglevel--condition1" : "levelspec=show" ,
"debuglevel--result0" : "The string 'Done.'" ,
"debuglevel--result1" : "The list of subsystems" ,
// AddNodeCmd help.
"addnode--synopsis" : "Attempts to add or remove a persistent peer." ,
"addnode-addr" : "IP address and port of the peer to operate on" ,
"addnode-subcmd" : "'add' to add a persistent peer, 'remove' to remove a persistent peer, or 'onetry' to try a single connection to a peer" ,
2015-03-05 22:47:54 +01:00
// NodeCmd help.
"node--synopsis" : "Attempts to add or remove a peer." ,
"node-subcmd" : "'disconnect' to remove all matching non-persistent peers, 'remove' to remove a persistent peer, or 'connect' to connect to a peer" ,
"node-target" : "Either the IP address and port of the peer to operate on, or a valid peer ID." ,
"node-connectsubcmd" : "'perm' to make the connected peer a permanent one, 'temp' to try a single connect to a peer" ,
2015-02-21 05:34:57 +01:00
// TransactionInput help.
"transactioninput-txid" : "The hash of the input transaction" ,
"transactioninput-vout" : "The specific output of the input transaction to redeem" ,
// CreateRawTransactionCmd help.
"createrawtransaction--synopsis" : "Returns a new transaction spending the provided inputs and sending to the provided addresses.\n" +
"The transaction inputs are not signed in the created transaction.\n" +
"The signrawtransaction RPC command provided by wallet must be used to sign the resulting transaction." ,
"createrawtransaction-inputs" : "The inputs to the transaction" ,
"createrawtransaction-amounts" : "JSON object with the destination addresses as keys and amounts as values" ,
"createrawtransaction-amounts--key" : "address" ,
"createrawtransaction-amounts--value" : "n.nnn" ,
"createrawtransaction-amounts--desc" : "The destination address as the key and the amount in BTC as the value" ,
"createrawtransaction--result0" : "Hex-encoded bytes of the serialized transaction" ,
// ScriptSig help.
"scriptsig-asm" : "Disassembly of the script" ,
"scriptsig-hex" : "Hex-encoded bytes of the script" ,
2015-08-20 02:46:00 +02:00
// PrevOut help.
"prevout-addresses" : "previous output addresses" ,
"prevout-value" : "previous output value" ,
// VinPrevOut help.
"vinprevout-coinbase" : "The hex-encoded bytes of the signature script (coinbase txns only)" ,
"vinprevout-txid" : "The hash of the origin transaction (non-coinbase txns only)" ,
"vinprevout-vout" : "The index of the output being redeemed from the origin transaction (non-coinbase txns only)" ,
"vinprevout-scriptSig" : "The signature script used to redeem the origin transaction as a JSON object (non-coinbase txns only)" ,
"vinprevout-prevOut" : "Data from the origin transaction output with index vout." ,
"vinprevout-sequence" : "The script sequence number" ,
2015-02-21 05:34:57 +01:00
// Vin help.
"vin-coinbase" : "The hex-encoded bytes of the signature script (coinbase txns only)" ,
"vin-txid" : "The hash of the origin transaction (non-coinbase txns only)" ,
"vin-vout" : "The index of the output being redeemed from the origin transaction (non-coinbase txns only)" ,
"vin-scriptSig" : "The signature script used to redeem the origin transaction as a JSON object (non-coinbase txns only)" ,
"vin-sequence" : "The script sequence number" ,
// ScriptPubKeyResult help.
"scriptpubkeyresult-asm" : "Disassembly of the script" ,
"scriptpubkeyresult-hex" : "Hex-encoded bytes of the script" ,
"scriptpubkeyresult-reqSigs" : "The number of required signatures" ,
"scriptpubkeyresult-type" : "The type of the script (e.g. 'pubkeyhash')" ,
"scriptpubkeyresult-addresses" : "The bitcoin addresses associated with this script" ,
// Vout help.
"vout-value" : "The amount in BTC" ,
"vout-n" : "The index of this transaction output" ,
"vout-scriptPubKey" : "The public key script used to pay coins as a JSON object" ,
// TxRawDecodeResult help.
"txrawdecoderesult-txid" : "The hash of the transaction" ,
"txrawdecoderesult-version" : "The transaction version" ,
"txrawdecoderesult-locktime" : "The transaction lock time" ,
"txrawdecoderesult-vin" : "The transaction inputs as JSON objects" ,
"txrawdecoderesult-vout" : "The transaction outputs as JSON objects" ,
// DecodeRawTransactionCmd help.
"decoderawtransaction--synopsis" : "Returns a JSON object representing the provided serialized, hex-encoded transaction." ,
"decoderawtransaction-hextx" : "Serialized, hex-encoded transaction" ,
// DecodeScriptResult help.
"decodescriptresult-asm" : "Disassembly of the script" ,
"decodescriptresult-reqSigs" : "The number of required signatures" ,
"decodescriptresult-type" : "The type of the script (e.g. 'pubkeyhash')" ,
"decodescriptresult-addresses" : "The bitcoin addresses associated with this script" ,
"decodescriptresult-p2sh" : "The script hash for use in pay-to-script-hash transactions" ,
// DecodeScriptCmd help.
"decodescript--synopsis" : "Returns a JSON object with information about the provided hex-encoded script." ,
"decodescript-hexscript" : "Hex-encoded script" ,
2015-04-27 17:19:02 +02:00
// GenerateCmd help
"generate--synopsis" : "Generates a set number of blocks (simnet or regtest only) and returns a JSON\n" +
" array of their hashes." ,
"generate-numblocks" : "Number of blocks to generate" ,
"generate--result0" : "The hashes, in order, of blocks generated by the call" ,
2015-02-21 05:34:57 +01:00
// GetAddedNodeInfoResultAddr help.
"getaddednodeinforesultaddr-address" : "The ip address for this DNS entry" ,
"getaddednodeinforesultaddr-connected" : "The connection 'direction' (inbound/outbound/false)" ,
// GetAddedNodeInfoResult help.
"getaddednodeinforesult-addednode" : "The ip address or domain of the added peer" ,
"getaddednodeinforesult-connected" : "Whether or not the peer is currently connected" ,
"getaddednodeinforesult-addresses" : "DNS lookup and connection information about the peer" ,
// GetAddedNodeInfo help.
"getaddednodeinfo--synopsis" : "Returns information about manually added (persistent) peers." ,
"getaddednodeinfo-dns" : "Specifies whether the returned data is a JSON object including DNS and connection information, or just a list of added peers" ,
"getaddednodeinfo-node" : "Only return information about this specific peer instead of all added peers" ,
"getaddednodeinfo--condition0" : "dns=false" ,
"getaddednodeinfo--condition1" : "dns=true" ,
"getaddednodeinfo--result0" : "List of added peers" ,
// GetBestBlockResult help.
"getbestblockresult-hash" : "Hex-encoded bytes of the best block hash" ,
"getbestblockresult-height" : "Height of the best block" ,
// GetBestBlockCmd help.
"getbestblock--synopsis" : "Get block height and hash of best block in the main chain." ,
"getbestblock--result0" : "Get block height and hash of best block in the main chain." ,
// GetBestBlockHashCmd help.
"getbestblockhash--synopsis" : "Returns the hash of the of the best (most recent) block in the longest block chain." ,
"getbestblockhash--result0" : "The hex-encoded block hash" ,
// GetBlockCmd help.
"getblock--synopsis" : "Returns information about a block given its hash." ,
"getblock-hash" : "The hash of the block" ,
"getblock-verbose" : "Specifies the block is returned as a JSON object instead of hex-encoded string" ,
"getblock-verbosetx" : "Specifies that each transaction is returned as a JSON object and only applies if the verbose flag is true (btcd extension)" ,
"getblock--condition0" : "verbose=false" ,
"getblock--condition1" : "verbose=true" ,
"getblock--result0" : "Hex-encoded bytes of the serialized block" ,
// TxRawResult help.
"txrawresult-hex" : "Hex-encoded transaction" ,
"txrawresult-txid" : "The hash of the transaction" ,
"txrawresult-version" : "The transaction version" ,
"txrawresult-locktime" : "The transaction lock time" ,
"txrawresult-vin" : "The transaction inputs as JSON objects" ,
"txrawresult-vout" : "The transaction outputs as JSON objects" ,
"txrawresult-blockhash" : "Hash of the block the transaction is part of" ,
"txrawresult-confirmations" : "Number of confirmations of the block" ,
"txrawresult-time" : "Transaction time in seconds since 1 Jan 1970 GMT" ,
"txrawresult-blocktime" : "Block time in seconds since the 1 Jan 1970 GMT" ,
2015-08-20 02:46:00 +02:00
// SearchRawTransactionsResult help.
"searchrawtransactionsresult-hex" : "Hex-encoded transaction" ,
"searchrawtransactionsresult-txid" : "The hash of the transaction" ,
"searchrawtransactionsresult-version" : "The transaction version" ,
"searchrawtransactionsresult-locktime" : "The transaction lock time" ,
"searchrawtransactionsresult-vin" : "The transaction inputs as JSON objects" ,
"searchrawtransactionsresult-vout" : "The transaction outputs as JSON objects" ,
"searchrawtransactionsresult-blockhash" : "Hash of the block the transaction is part of" ,
"searchrawtransactionsresult-confirmations" : "Number of confirmations of the block" ,
"searchrawtransactionsresult-time" : "Transaction time in seconds since 1 Jan 1970 GMT" ,
"searchrawtransactionsresult-blocktime" : "Block time in seconds since the 1 Jan 1970 GMT" ,
2015-02-21 05:34:57 +01:00
// GetBlockVerboseResult help.
"getblockverboseresult-hash" : "The hash of the block (same as provided)" ,
"getblockverboseresult-confirmations" : "The number of confirmations" ,
"getblockverboseresult-size" : "The size of the block" ,
"getblockverboseresult-height" : "The height of the block in the block chain" ,
"getblockverboseresult-version" : "The block version" ,
"getblockverboseresult-merkleroot" : "Root hash of the merkle tree" ,
"getblockverboseresult-tx" : "The transaction hashes (only when verbosetx=false)" ,
"getblockverboseresult-rawtx" : "The transactions as JSON objects (only when verbosetx=true)" ,
"getblockverboseresult-time" : "The block time in seconds since 1 Jan 1970 GMT" ,
"getblockverboseresult-nonce" : "The block nonce" ,
"getblockverboseresult-bits" : "The bits which represent the block difficulty" ,
"getblockverboseresult-difficulty" : "The proof-of-work difficulty as a multiple of the minimum difficulty" ,
"getblockverboseresult-previousblockhash" : "The hash of the previous block" ,
2015-05-04 17:36:23 +02:00
"getblockverboseresult-nextblockhash" : "The hash of the next block (only if there is one)" ,
2015-02-21 05:34:57 +01:00
// GetBlockCountCmd help.
"getblockcount--synopsis" : "Returns the number of blocks in the longest block chain." ,
"getblockcount--result0" : "The current block count" ,
// GetBlockHashCmd help.
"getblockhash--synopsis" : "Returns hash of the block in best block chain at the given height." ,
"getblockhash-index" : "The block height" ,
"getblockhash--result0" : "The block hash" ,
2015-07-04 19:42:43 +02:00
// GetBlockHeaderCmd help.
"getblockheader--synopsis" : "Returns information about a block header given its hash." ,
"getblockheader-hash" : "The hash of the block" ,
"getblockheader-verbose" : "Specifies the block header is returned as a JSON object instead of hex-encoded string" ,
"getblockheader--condition0" : "verbose=false" ,
"getblockheader--condition1" : "verbose=true" ,
"getblockheader--result0" : "The block header hash" ,
// GetBlockHeaderVerboseResult help.
"getblockheaderverboseresult-hash" : "The hash of the block (same as provided)" ,
"getblockheaderverboseresult-confirmations" : "The number of confirmations" ,
"getblockheaderverboseresult-height" : "The height of the block in the block chain" ,
"getblockheaderverboseresult-version" : "The block version" ,
"getblockheaderverboseresult-merkleroot" : "Root hash of the merkle tree" ,
"getblockheaderverboseresult-time" : "The block time in seconds since 1 Jan 1970 GMT" ,
"getblockheaderverboseresult-nonce" : "The block nonce" ,
"getblockheaderverboseresult-bits" : "The bits which represent the block difficulty" ,
"getblockheaderverboseresult-difficulty" : "The proof-of-work difficulty as a multiple of the minimum difficulty" ,
"getblockheaderverboseresult-previousblockhash" : "The hash of the previous block" ,
"getblockheaderverboseresult-nextblockhash" : "The hash of the next block (only if there is one)" ,
2015-02-21 05:34:57 +01:00
// TemplateRequest help.
"templaterequest-mode" : "This is 'template', 'proposal', or omitted" ,
"templaterequest-capabilities" : "List of capabilities" ,
"templaterequest-longpollid" : "The long poll ID of a job to monitor for expiration; required and valid only for long poll requests " ,
"templaterequest-sigoplimit" : "Number of signature operations allowed in blocks (this parameter is ignored)" ,
"templaterequest-sizelimit" : "Number of bytes allowed in blocks (this parameter is ignored)" ,
"templaterequest-maxversion" : "Highest supported block version number (this parameter is ignored)" ,
"templaterequest-target" : "The desired target for the block template (this parameter is ignored)" ,
"templaterequest-data" : "Hex-encoded block data (only for mode=proposal)" ,
"templaterequest-workid" : "The server provided workid if provided in block template (not applicable)" ,
// GetBlockTemplateResultTx help.
"getblocktemplateresulttx-data" : "Hex-encoded transaction data (byte-for-byte)" ,
"getblocktemplateresulttx-hash" : "Hex-encoded transaction hash (little endian if treated as a 256-bit number)" ,
"getblocktemplateresulttx-depends" : "Other transactions before this one (by 1-based index in the 'transactions' list) that must be present in the final block if this one is" ,
"getblocktemplateresulttx-fee" : "Difference in value between transaction inputs and outputs (in Satoshi)" ,
"getblocktemplateresulttx-sigops" : "Total number of signature operations as counted for purposes of block limits" ,
// GetBlockTemplateResultAux help.
"getblocktemplateresultaux-flags" : "Hex-encoded byte-for-byte data to include in the coinbase signature script" ,
// GetBlockTemplateResult help.
"getblocktemplateresult-bits" : "Hex-encoded compressed difficulty" ,
"getblocktemplateresult-curtime" : "Current time as seen by the server (recommended for block time); must fall within mintime/maxtime rules" ,
"getblocktemplateresult-height" : "Height of the block to be solved" ,
"getblocktemplateresult-previousblockhash" : "Hex-encoded big-endian hash of the previous block" ,
"getblocktemplateresult-sigoplimit" : "Number of sigops allowed in blocks " ,
"getblocktemplateresult-sizelimit" : "Number of bytes allowed in blocks" ,
"getblocktemplateresult-transactions" : "Array of transactions as JSON objects" ,
"getblocktemplateresult-version" : "The block version" ,
"getblocktemplateresult-coinbaseaux" : "Data that should be included in the coinbase signature script" ,
"getblocktemplateresult-coinbasetxn" : "Information about the coinbase transaction" ,
"getblocktemplateresult-coinbasevalue" : "Total amount available for the coinbase in Satoshi" ,
"getblocktemplateresult-workid" : "This value must be returned with result if provided (not provided)" ,
"getblocktemplateresult-longpollid" : "Identifier for long poll request which allows monitoring for expiration" ,
"getblocktemplateresult-longpolluri" : "An alternate URI to use for long poll requests if provided (not provided)" ,
"getblocktemplateresult-submitold" : "Not applicable" ,
"getblocktemplateresult-target" : "Hex-encoded big-endian number which valid results must be less than" ,
"getblocktemplateresult-expires" : "Maximum number of seconds (starting from when the server sent the response) this work is valid for" ,
"getblocktemplateresult-maxtime" : "Maximum allowed time" ,
"getblocktemplateresult-mintime" : "Minimum allowed time" ,
"getblocktemplateresult-mutable" : "List of mutations the server explicitly allows" ,
"getblocktemplateresult-noncerange" : "Two concatenated hex-encoded big-endian 32-bit integers which represent the valid ranges of nonces the miner may scan" ,
"getblocktemplateresult-capabilities" : "List of server capabilities including 'proposal' to indicate support for block proposals" ,
"getblocktemplateresult-reject-reason" : "Reason the proposal was invalid as-is (only applies to proposal responses)" ,
// GetBlockTemplateCmd help.
"getblocktemplate--synopsis" : "Returns a JSON object with information necessary to construct a block to mine or accepts a proposal to validate.\n" +
"See BIP0022 and BIP0023 for the full specification." ,
"getblocktemplate-request" : "Request object which controls the mode and several parameters" ,
"getblocktemplate--condition0" : "mode=template" ,
"getblocktemplate--condition1" : "mode=proposal, rejected" ,
"getblocktemplate--condition2" : "mode=proposal, accepted" ,
"getblocktemplate--result1" : "An error string which represents why the proposal was rejected or nothing if accepted" ,
// GetConnectionCountCmd help.
"getconnectioncount--synopsis" : "Returns the number of active connections to other peers." ,
"getconnectioncount--result0" : "The number of connections" ,
// GetCurrentNetCmd help.
"getcurrentnet--synopsis" : "Get bitcoin network the server is running on." ,
"getcurrentnet--result0" : "The network identifer" ,
// GetDifficultyCmd help.
"getdifficulty--synopsis" : "Returns the proof-of-work difficulty as a multiple of the minimum difficulty." ,
"getdifficulty--result0" : "The difficulty" ,
// GetGenerateCmd help.
"getgenerate--synopsis" : "Returns if the server is set to generate coins (mine) or not." ,
"getgenerate--result0" : "True if mining, false if not" ,
// GetHashesPerSecCmd help.
"gethashespersec--synopsis" : "Returns a recent hashes per second performance measurement while generating coins (mining)." ,
"gethashespersec--result0" : "The number of hashes per second" ,
// InfoChainResult help.
"infochainresult-version" : "The version of the server" ,
"infochainresult-protocolversion" : "The latest supported protocol version" ,
"infochainresult-blocks" : "The number of blocks processed" ,
"infochainresult-timeoffset" : "The time offset" ,
"infochainresult-connections" : "The number of connected peers" ,
"infochainresult-proxy" : "The proxy used by the server" ,
"infochainresult-difficulty" : "The current target difficulty" ,
"infochainresult-testnet" : "Whether or not server is using testnet" ,
"infochainresult-relayfee" : "The minimum relay fee for non-free transactions in BTC/KB" ,
"infochainresult-errors" : "Any current errors" ,
// InfoWalletResult help.
"infowalletresult-version" : "The version of the server" ,
"infowalletresult-protocolversion" : "The latest supported protocol version" ,
"infowalletresult-walletversion" : "The version of the wallet server" ,
"infowalletresult-balance" : "The total bitcoin balance of the wallet" ,
"infowalletresult-blocks" : "The number of blocks processed" ,
"infowalletresult-timeoffset" : "The time offset" ,
"infowalletresult-connections" : "The number of connected peers" ,
"infowalletresult-proxy" : "The proxy used by the server" ,
"infowalletresult-difficulty" : "The current target difficulty" ,
"infowalletresult-testnet" : "Whether or not server is using testnet" ,
"infowalletresult-keypoololdest" : "Seconds since 1 Jan 1970 GMT of the oldest pre-generated key in the key pool" ,
"infowalletresult-keypoolsize" : "The number of new keys that are pre-generated" ,
"infowalletresult-unlocked_until" : "The timestamp in seconds since 1 Jan 1970 GMT that the wallet is unlocked for transfers, or 0 if the wallet is locked" ,
"infowalletresult-paytxfee" : "The transaction fee set in BTC/KB" ,
"infowalletresult-relayfee" : "The minimum relay fee for non-free transactions in BTC/KB" ,
"infowalletresult-errors" : "Any current errors" ,
// GetInfoCmd help.
"getinfo--synopsis" : "Returns a JSON object containing various state info." ,
2015-06-23 21:43:39 +02:00
// GetMempoolInfoCmd help.
"getmempoolinfo--synopsis" : "Returns memory pool information" ,
// GetMempoolInfoResult help.
"getmempoolinforesult-bytes" : "Size in bytes of the mempool" ,
"getmempoolinforesult-size" : "Number of transactions in the mempool" ,
2015-02-21 05:34:57 +01:00
// GetMiningInfoResult help.
"getmininginforesult-blocks" : "Height of the latest best block" ,
"getmininginforesult-currentblocksize" : "Size of the latest best block" ,
"getmininginforesult-currentblocktx" : "Number of transactions in the latest best block" ,
"getmininginforesult-difficulty" : "Current target difficulty" ,
"getmininginforesult-errors" : "Any current errors" ,
"getmininginforesult-generate" : "Whether or not server is set to generate coins" ,
"getmininginforesult-genproclimit" : "Number of processors to use for coin generation (-1 when disabled)" ,
"getmininginforesult-hashespersec" : "Recent hashes per second performance measurement while generating coins" ,
"getmininginforesult-networkhashps" : "Estimated network hashes per second for the most recent blocks" ,
"getmininginforesult-pooledtx" : "Number of transactions in the memory pool" ,
"getmininginforesult-testnet" : "Whether or not server is using testnet" ,
// GetMiningInfoCmd help.
"getmininginfo--synopsis" : "Returns a JSON object containing mining-related information." ,
// GetNetworkHashPSCmd help.
"getnetworkhashps--synopsis" : "Returns the estimated network hashes per second for the block heights provided by the parameters." ,
"getnetworkhashps-blocks" : "The number of blocks, or -1 for blocks since last difficulty change" ,
"getnetworkhashps-height" : "Perform estimate ending with this height or -1 for current best chain block height" ,
"getnetworkhashps--result0" : "Estimated hashes per second" ,
// GetNetTotalsCmd help.
"getnettotals--synopsis" : "Returns a JSON object containing network traffic statistics." ,
// GetNetTotalsResult help.
"getnettotalsresult-totalbytesrecv" : "Total bytes received" ,
"getnettotalsresult-totalbytessent" : "Total bytes sent" ,
"getnettotalsresult-timemillis" : "Number of milliseconds since 1 Jan 1970 GMT" ,
// GetPeerInfoResult help.
2015-03-01 22:31:03 +01:00
"getpeerinforesult-id" : "A unique node ID" ,
2015-02-21 05:34:57 +01:00
"getpeerinforesult-addr" : "The ip address and port of the peer" ,
"getpeerinforesult-addrlocal" : "Local address" ,
"getpeerinforesult-services" : "Services bitmask which represents the services supported by the peer" ,
"getpeerinforesult-lastsend" : "Time the last message was received in seconds since 1 Jan 1970 GMT" ,
"getpeerinforesult-lastrecv" : "Time the last message was sent in seconds since 1 Jan 1970 GMT" ,
"getpeerinforesult-bytessent" : "Total bytes sent" ,
"getpeerinforesult-bytesrecv" : "Total bytes received" ,
"getpeerinforesult-conntime" : "Time the connection was made in seconds since 1 Jan 1970 GMT" ,
2015-03-01 22:31:03 +01:00
"getpeerinforesult-timeoffset" : "The time offset of the peer" ,
2015-02-21 05:34:57 +01:00
"getpeerinforesult-pingtime" : "Number of microseconds the last ping took" ,
"getpeerinforesult-pingwait" : "Number of microseconds a queued ping has been waiting for a response" ,
"getpeerinforesult-version" : "The protocol version of the peer" ,
"getpeerinforesult-subver" : "The user agent of the peer" ,
"getpeerinforesult-inbound" : "Whether or not the peer is an inbound connection" ,
"getpeerinforesult-startingheight" : "The latest block height the peer knew about when the connection was established" ,
"getpeerinforesult-currentheight" : "The current height of the peer" ,
"getpeerinforesult-banscore" : "The ban score" ,
"getpeerinforesult-syncnode" : "Whether or not the peer is the sync peer" ,
// GetPeerInfoCmd help.
"getpeerinfo--synopsis" : "Returns data about each connected network peer as an array of json objects." ,
// GetRawMempoolVerboseResult help.
"getrawmempoolverboseresult-size" : "Transaction size in bytes" ,
"getrawmempoolverboseresult-fee" : "Transaction fee in bitcoins" ,
"getrawmempoolverboseresult-time" : "Local time transaction entered pool in seconds since 1 Jan 1970 GMT" ,
"getrawmempoolverboseresult-height" : "Block height when transaction entered the pool" ,
"getrawmempoolverboseresult-startingpriority" : "Priority when transaction entered the pool" ,
"getrawmempoolverboseresult-currentpriority" : "Current priority" ,
"getrawmempoolverboseresult-depends" : "Unconfirmed transactions used as inputs for this transaction" ,
// GetRawMempoolCmd help.
"getrawmempool--synopsis" : "Returns information about all of the transactions currently in the memory pool." ,
"getrawmempool-verbose" : "Returns JSON object when true or an array of transaction hashes when false" ,
"getrawmempool--condition0" : "verbose=false" ,
"getrawmempool--condition1" : "verbose=true" ,
"getrawmempool--result0" : "Array of transaction hashes" ,
// GetRawTransactionCmd help.
"getrawtransaction--synopsis" : "Returns information about a transaction given its hash." ,
"getrawtransaction-txid" : "The hash of the transaction" ,
"getrawtransaction-verbose" : "Specifies the transaction is returned as a JSON object instead of a hex-encoded string" ,
"getrawtransaction--condition0" : "verbose=false" ,
"getrawtransaction--condition1" : "verbose=true" ,
"getrawtransaction--result0" : "Hex-encoded bytes of the serialized transaction" ,
// GetTxOutResult help.
"gettxoutresult-bestblock" : "The block hash that contains the transaction output" ,
"gettxoutresult-confirmations" : "The number of confirmations" ,
"gettxoutresult-value" : "The transaction amount in BTC" ,
"gettxoutresult-scriptPubKey" : "The public key script used to pay coins as a JSON object" ,
"gettxoutresult-version" : "The transaction version" ,
"gettxoutresult-coinbase" : "Whether or not the transaction is a coinbase" ,
// GetTxOutCmd help.
"gettxout--synopsis" : "Returns information about an unspent transaction output.." ,
"gettxout-txid" : "The hash of the transaction" ,
"gettxout-vout" : "The index of the output" ,
"gettxout-includemempool" : "Include the mempool when true" ,
// GetWorkResult help.
"getworkresult-data" : "Hex-encoded block data" ,
"getworkresult-hash1" : "(DEPRECATED) Hex-encoded formatted hash buffer" ,
"getworkresult-midstate" : "(DEPRECATED) Hex-encoded precomputed hash state after hashing first half of the data" ,
"getworkresult-target" : "Hex-encoded little-endian hash target" ,
// GetWorkCmd help.
"getwork--synopsis" : "(DEPRECATED - Use getblocktemplate instead) Returns formatted hash data to work on or checks and submits solved data." ,
"getwork-data" : "Hex-encoded data to check" ,
"getwork--condition0" : "no data provided" ,
"getwork--condition1" : "data provided" ,
"getwork--result1" : "Whether or not the solved data is valid and was added to the chain" ,
// HelpCmd help.
"help--synopsis" : "Returns a list of all commands or help for a specified command." ,
"help-command" : "The command to retrieve help for" ,
"help--condition0" : "no command provided" ,
"help--condition1" : "command specified" ,
"help--result0" : "List of commands" ,
"help--result1" : "Help for specified command" ,
// PingCmd help.
"ping--synopsis" : "Queues a ping to be sent to each connected peer.\n" +
"Ping times are provided by getpeerinfo via the pingtime and pingwait fields." ,
// SearchRawTransactionsCmd help.
"searchrawtransactions--synopsis" : "Returns raw data for transactions involving the passed address.\n" +
"Returned transactions are pulled from both the database, and transactions currently in the mempool.\n" +
"Transactions pulled from the mempool will have the 'confirmations' field set to 0.\n" +
"Usage of this RPC requires the optional --addrindex flag to be activated, otherwise all responses will simply return with an error stating the address index has not yet been built.\n" +
"Similarly, until the address index has caught up with the current best height, all requests will return an error response in order to avoid serving stale data." ,
"searchrawtransactions-address" : "The Bitcoin address to search for" ,
"searchrawtransactions-verbose" : "Specifies the transaction is returned as a JSON object instead of hex-encoded string" ,
"searchrawtransactions--condition0" : "verbose=0" ,
"searchrawtransactions--condition1" : "verbose=1" ,
2015-08-20 02:46:00 +02:00
"searchrawtransactions-skip" : "The number of leading transactions to leave out of the final response" ,
"searchrawtransactions-count" : "The maximum number of transactions to return" ,
"searchrawtransactions-vinextra" : "Specify that extra data from previous output will be returned in vin" ,
2015-02-21 05:34:57 +01:00
"searchrawtransactions--result0" : "Hex-encoded serialized transaction" ,
// SendRawTransactionCmd help.
"sendrawtransaction--synopsis" : "Submits the serialized, hex-encoded transaction to the local peer and relays it to the network." ,
"sendrawtransaction-hextx" : "Serialized, hex-encoded signed transaction" ,
"sendrawtransaction-allowhighfees" : "Whether or not to allow insanely high fees (btcd does not yet implement this parameter, so it has no effect)" ,
"sendrawtransaction--result0" : "The hash of the transaction" ,
// SetGenerateCmd help.
"setgenerate--synopsis" : "Set the server to generate coins (mine) or not." ,
"setgenerate-generate" : "Use true to enable generation, false to disable it" ,
"setgenerate-genproclimit" : "The number of processors (cores) to limit generation to or -1 for default" ,
// StopCmd help.
"stop--synopsis" : "Shutdown btcd." ,
"stop--result0" : "The string 'btcd stopping.'" ,
// SubmitBlockOptions help.
"submitblockoptions-workid" : "This parameter is currently ignored" ,
// SubmitBlockCmd help.
"submitblock--synopsis" : "Attempts to submit a new serialized, hex-encoded block to the network." ,
"submitblock-hexblock" : "Serialized, hex-encoded block" ,
"submitblock-options" : "This parameter is currently ignored" ,
"submitblock--condition0" : "Block successfully submitted" ,
"submitblock--condition1" : "Block rejected" ,
"submitblock--result1" : "The reason the block was rejected" ,
// ValidateAddressResult help.
"validateaddresschainresult-isvalid" : "Whether or not the address is valid" ,
"validateaddresschainresult-address" : "The bitcoin address (only when isvalid is true)" ,
// ValidateAddressCmd help.
"validateaddress--synopsis" : "Verify an address is valid." ,
"validateaddress-address" : "Bitcoin address to validate" ,
// VerifyChainCmd help.
"verifychain--synopsis" : "Verifies the block chain database.\n" +
"The actual checks performed by the checklevel parameter are implementation specific.\n" +
"For btcd this is:\n" +
"checklevel=0 - Look up each block and ensure it can be loaded from the database.\n" +
"checklevel=1 - Perform basic context-free sanity checks on each block." ,
"verifychain-checklevel" : "How thorough the block verification is" ,
"verifychain-checkdepth" : "The number of blocks to check" ,
"verifychain--result0" : "Whether or not the chain verified" ,
// VerifyMessageCmd help.
"verifymessage--synopsis" : "Verify a signed message." ,
"verifymessage-address" : "The bitcoin address to use for the signature" ,
"verifymessage-signature" : "The base-64 encoded signature provided by the signer" ,
"verifymessage-message" : "The signed message" ,
"verifymessage--result0" : "Whether or not the signature verified" ,
// -------- Websocket-specific help --------
2015-09-15 20:03:48 +02:00
// Session help.
"session--synopsis" : "Return details regarding a websocket client's current connection session." ,
"sessionresult-sessionid" : "The unique session ID for a client's websocket connection." ,
2015-02-21 05:34:57 +01:00
// NotifyBlocksCmd help.
"notifyblocks--synopsis" : "Request notifications for whenever a block is connected or disconnected from the main (best) chain." ,
2015-03-03 21:37:02 +01:00
// StopNotifyBlocksCmd help.
"stopnotifyblocks--synopsis" : "Cancel registered notifications for whenever a block is connected or disconnected from the main (best) chain." ,
2015-02-21 05:34:57 +01:00
// NotifyNewTransactionsCmd help.
"notifynewtransactions--synopsis" : "Send either a txaccepted or a txacceptedverbose notification when a new transaction is accepted into the mempool." ,
"notifynewtransactions-verbose" : "Specifies which type of notification to receive. If verbose is true, then the caller receives txacceptedverbose, otherwise the caller receives txaccepted" ,
2015-03-03 21:37:02 +01:00
// StopNotifyNewTransactionsCmd help.
"stopnotifynewtransactions--synopsis" : "Stop sending either a txaccepted or a txacceptedverbose notification when a new transaction is accepted into the mempool." ,
2015-02-21 05:34:57 +01:00
// NotifyReceivedCmd help.
"notifyreceived--synopsis" : "Send a recvtx notification when a transaction added to mempool or appears in a newly-attached block contains a txout pkScript sending to any of the passed addresses.\n" +
"Matching outpoints are automatically registered for redeemingtx notifications." ,
"notifyreceived-addresses" : "List of address to receive notifications about" ,
2015-03-03 21:37:02 +01:00
// StopNotifyReceivedCmd help.
"stopnotifyreceived--synopsis" : "Cancel registered receive notifications for each passed address." ,
"stopnotifyreceived-addresses" : "List of address to cancel receive notifications for" ,
2015-02-21 05:34:57 +01:00
// OutPoint help.
"outpoint-hash" : "The hex-encoded bytes of the outpoint hash" ,
"outpoint-index" : "The index of the outpoint" ,
// NotifySpentCmd help.
"notifyspent--synopsis" : "Send a redeemingtx notification when a transaction spending an outpoint appears in mempool (if relayed to this btcd instance) and when such a transaction first appears in a newly-attached block." ,
"notifyspent-outpoints" : "List of transaction outpoints to monitor." ,
2015-03-03 21:37:02 +01:00
// StopNotifySpentCmd help.
"stopnotifyspent--synopsis" : "Cancel registered spending notifications for each passed outpoint." ,
"stopnotifyspent-outpoints" : "List of transaction outpoints to stop monitoring." ,
2015-02-21 05:34:57 +01:00
// Rescan help.
"rescan--synopsis" : "Rescan block chain for transactions to addresses.\n" +
"When the endblock parameter is omitted, the rescan continues through the best block in the main chain.\n" +
"Rescan results are sent as recvtx and redeemingtx notifications.\n" +
"This call returns once the rescan completes." ,
"rescan-beginblock" : "Hash of the first block to begin rescanning" ,
"rescan-addresses" : "List of addresses to include in the rescan" ,
"rescan-outpoints" : "List of transaction outpoints to include in the rescan" ,
"rescan-endblock" : "Hash of final block to rescan" ,
}
// rpcResultTypes specifies the result types that each RPC command can return.
// This information is used to generate the help. Each result type must be a
// pointer to the type (or nil to indicate no return value).
var rpcResultTypes = map [ string ] [ ] interface { } {
"addnode" : nil ,
"createrawtransaction" : [ ] interface { } { ( * string ) ( nil ) } ,
"debuglevel" : [ ] interface { } { ( * string ) ( nil ) , ( * string ) ( nil ) } ,
"decoderawtransaction" : [ ] interface { } { ( * btcjson . TxRawDecodeResult ) ( nil ) } ,
"decodescript" : [ ] interface { } { ( * btcjson . DecodeScriptResult ) ( nil ) } ,
2015-04-27 17:19:02 +02:00
"generate" : [ ] interface { } { ( * [ ] string ) ( nil ) } ,
2015-02-21 05:34:57 +01:00
"getaddednodeinfo" : [ ] interface { } { ( * [ ] string ) ( nil ) , ( * [ ] btcjson . GetAddedNodeInfoResult ) ( nil ) } ,
"getbestblock" : [ ] interface { } { ( * btcjson . GetBestBlockResult ) ( nil ) } ,
"getbestblockhash" : [ ] interface { } { ( * string ) ( nil ) } ,
"getblock" : [ ] interface { } { ( * string ) ( nil ) , ( * btcjson . GetBlockVerboseResult ) ( nil ) } ,
"getblockcount" : [ ] interface { } { ( * int64 ) ( nil ) } ,
"getblockhash" : [ ] interface { } { ( * string ) ( nil ) } ,
2015-07-04 19:42:43 +02:00
"getblockheader" : [ ] interface { } { ( * string ) ( nil ) , ( * btcjson . GetBlockHeaderVerboseResult ) ( nil ) } ,
2015-02-21 05:34:57 +01:00
"getblocktemplate" : [ ] interface { } { ( * btcjson . GetBlockTemplateResult ) ( nil ) , ( * string ) ( nil ) , nil } ,
"getconnectioncount" : [ ] interface { } { ( * int32 ) ( nil ) } ,
"getcurrentnet" : [ ] interface { } { ( * uint32 ) ( nil ) } ,
"getdifficulty" : [ ] interface { } { ( * float64 ) ( nil ) } ,
"getgenerate" : [ ] interface { } { ( * bool ) ( nil ) } ,
"gethashespersec" : [ ] interface { } { ( * float64 ) ( nil ) } ,
"getinfo" : [ ] interface { } { ( * btcjson . InfoChainResult ) ( nil ) } ,
2015-06-23 21:43:39 +02:00
"getmempoolinfo" : [ ] interface { } { ( * btcjson . GetMempoolInfoResult ) ( nil ) } ,
2015-02-21 05:34:57 +01:00
"getmininginfo" : [ ] interface { } { ( * btcjson . GetMiningInfoResult ) ( nil ) } ,
"getnettotals" : [ ] interface { } { ( * btcjson . GetNetTotalsResult ) ( nil ) } ,
"getnetworkhashps" : [ ] interface { } { ( * int64 ) ( nil ) } ,
"getpeerinfo" : [ ] interface { } { ( * [ ] btcjson . GetPeerInfoResult ) ( nil ) } ,
"getrawmempool" : [ ] interface { } { ( * [ ] string ) ( nil ) , ( * btcjson . GetRawMempoolVerboseResult ) ( nil ) } ,
"getrawtransaction" : [ ] interface { } { ( * string ) ( nil ) , ( * btcjson . TxRawResult ) ( nil ) } ,
"gettxout" : [ ] interface { } { ( * btcjson . GetTxOutResult ) ( nil ) } ,
"getwork" : [ ] interface { } { ( * btcjson . GetWorkResult ) ( nil ) , ( * bool ) ( nil ) } ,
2015-03-05 22:47:54 +01:00
"node" : nil ,
2015-02-21 05:34:57 +01:00
"help" : [ ] interface { } { ( * string ) ( nil ) , ( * string ) ( nil ) } ,
"ping" : nil ,
2015-08-20 02:46:00 +02:00
"searchrawtransactions" : [ ] interface { } { ( * string ) ( nil ) , ( * [ ] btcjson . SearchRawTransactionsResult ) ( nil ) } ,
2015-02-21 05:34:57 +01:00
"sendrawtransaction" : [ ] interface { } { ( * string ) ( nil ) } ,
"setgenerate" : nil ,
"stop" : [ ] interface { } { ( * string ) ( nil ) } ,
"submitblock" : [ ] interface { } { nil , ( * string ) ( nil ) } ,
"validateaddress" : [ ] interface { } { ( * btcjson . ValidateAddressChainResult ) ( nil ) } ,
"verifychain" : [ ] interface { } { ( * bool ) ( nil ) } ,
"verifymessage" : [ ] interface { } { ( * bool ) ( nil ) } ,
// Websocket commands.
2015-09-15 20:03:48 +02:00
"session" : [ ] interface { } { ( * btcjson . SessionResult ) ( nil ) } ,
2015-03-03 21:37:02 +01:00
"notifyblocks" : nil ,
"stopnotifyblocks" : nil ,
"notifynewtransactions" : nil ,
"stopnotifynewtransactions" : nil ,
"notifyreceived" : nil ,
"stopnotifyreceived" : nil ,
"notifyspent" : nil ,
"stopnotifyspent" : nil ,
"rescan" : nil ,
2015-02-21 05:34:57 +01:00
}
// helpCacher provides a concurrent safe type that provides help and usage for
// the RPC server commands and caches the results for future calls.
type helpCacher struct {
sync . Mutex
usage string
methodHelp map [ string ] string
}
// rpcMethodHelp returns an RPC help string for the provided method.
//
// This function is safe for concurrent access.
func ( c * helpCacher ) rpcMethodHelp ( method string ) ( string , error ) {
c . Lock ( )
defer c . Unlock ( )
// Return the cached method help if it exists.
if help , exists := c . methodHelp [ method ] ; exists {
return help , nil
}
// Look up the result types for the method.
resultTypes , ok := rpcResultTypes [ method ]
if ! ok {
return "" , errors . New ( "no result types specified for method " +
method )
}
// Generate, cache, and return the help.
help , err := btcjson . GenerateHelp ( method , helpDescsEnUS , resultTypes ... )
if err != nil {
return "" , err
}
c . methodHelp [ method ] = help
return help , nil
}
// rpcUsage returns one-line usage for all support RPC commands.
//
// This function is safe for concurrent access.
func ( c * helpCacher ) rpcUsage ( includeWebsockets bool ) ( string , error ) {
c . Lock ( )
defer c . Unlock ( )
// Return the cached usage if it is available.
if c . usage != "" {
return c . usage , nil
}
// Generate a list of one-line usage for every command.
usageTexts := make ( [ ] string , 0 , len ( rpcHandlers ) )
for k := range rpcHandlers {
usage , err := btcjson . MethodUsageText ( k )
if err != nil {
return "" , err
}
usageTexts = append ( usageTexts , usage )
}
// Include websockets commands if requested.
if includeWebsockets {
for k := range wsHandlers {
usage , err := btcjson . MethodUsageText ( k )
if err != nil {
return "" , err
}
usageTexts = append ( usageTexts , usage )
}
}
sort . Sort ( sort . StringSlice ( usageTexts ) )
c . usage = strings . Join ( usageTexts , "\n" )
return c . usage , nil
}
// newHelpCacher returns a new instance of a help cacher which provides help and
// usage for the RPC server commands and caches the results for future calls.
func newHelpCacher ( ) * helpCacher {
return & helpCacher {
methodHelp : make ( map [ string ] string ) ,
}
}