mirror of
https://github.com/monero-project/monero-docs.git
synced 2024-12-23 12:09:44 +00:00
1 line
No EOL
456 KiB
JSON
1 line
No EOL
456 KiB
JSON
{"config":{"lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Unofficial Monero Documentation \u00b6 Work in Progress \u00b6 Monerodocs attempts to organize basic technical knowledge on Monero in one place. While technical explanations are out there, knowledge is scattered through reddit posts, git comments, stack exchange answers, chat logs and the source code. This makes it hard to find complete and up-to-date explanations on advanced topics. The goal is to educate and onboard power users faster. Please submit your feedback and corrections directly on github . Find my contact details at qertoip.com .","title":"Home"},{"location":"#unofficial-monero-documentation","text":"","title":"Unofficial Monero Documentation"},{"location":"#work-in-progress","text":"Monerodocs attempts to organize basic technical knowledge on Monero in one place. While technical explanations are out there, knowledge is scattered through reddit posts, git comments, stack exchange answers, chat logs and the source code. This makes it hard to find complete and up-to-date explanations on advanced topics. The goal is to educate and onboard power users faster. Please submit your feedback and corrections directly on github . Find my contact details at qertoip.com .","title":"Work in Progress"},{"location":"multisignature/","text":"Multisignature \u00b6 In cryptocurrencies, multisig feature allows to sign a transaction with more than one private key. Funds protected with multisig can only be spent by signing with M-of-N keys. Example use cases: shared account (1-of-2; both husband and wife individually have full access to their funds) consensus account (2-of-2; both husband and wife must agree to spend their funds) threshold account (2-of-3; an escrow service is involved as an independent 3rd party, to co-sign with either the seller, or with the buyer, if seller and buyer do not agree) secure account (2-of-3; a single owner controlls all 3 keys but secures them via a different means to diversify risks) arbitrary threshold account (M-of-N; some cryptocurrencies provide full flexibility on the number of signers) Monero multisignature \u00b6 Monero doesn't directly implement multisignatures (at least not in a classical sense). Monero emulates the feature by secret splitting. Transactions are still signed with a single spend key. The spend key is a sum of all N private keys. The rationale for such design is to decouple multisig from ring signatures. Let's consider the 2-of-3 scheme. We have 3 participants. Each participant is granted exactly 2 private keys in a way that pairs do not repeat between participants. This way any 2 participants together have all 3 private keys required to create the private spend key. Multi-signing is a wallet-level feature. There is no way to learn from the blockchain which transactions were created using multiple signatures. It is also worth noting in Monero there is no multisig addresses as such. Address structure does not care how the underlying private spend key got created. After multisig wallet setup every participant ends up knowing the public address and private view key. This is necessary for participants to recognize and decipher transactions they are supposed to co-sign. Multisig wallet setup \u00b6 Multisig feature is only available via a command line wallet. You should be familiar with the CLI wallet before playing with multisig. Let's consider a 2-of-3 scheme as it generalizes well. 0. Open your wallet \u00b6 Access your (stagenet) wallet: ./monerod --stagenet --daemon # Run your full node; make sure it is fully synced ./monero-wallet-cli --stagenet --wallet-file=... # Run your wallet; make sure you have some funds to play with 1. prepare_multisig \u00b6 Every participant independently generates initialization data . This is not an address. Every participant sends his initialization data manually to all other participants over secure channel. 2. make_multisig \u00b6 Every participant applies initialization data from other participants. This results in a second round of initialization data . This is still not an address. Every participants sends his second round of init data to all other participants over secure channel. 3. finalize_multisig \u00b6 Every participant finalizes wallet creation by applying the second round of init data from all other participants. This finally results in a wallet public address and private view key to be known for all participants. Please note actions are symmetric for all participants. Even though we considered a 2-of-3 scheme, every participant cooperates with everyone else. The secret splitting is performed internally by the wallet. Secure sharing of initialization data between participants is manual. The wallet itself does not provide any secure communication channel. This is out of scope. Receiving funds \u00b6 Address built by multisig setup is like any other address. You can generate integrated addresses and subaddresses based on it. All participants are able to see incoming funds as they share the private view key. With a CLI, use the following commands to see incoming payments: address refresh show_transfers Spending funds \u00b6 TODO Reference \u00b6 https://monero.stackexchange.com/questions/5646/how-to-use-monero-multisignature-wallets-2-2-2-3","title":"Multisignature"},{"location":"multisignature/#multisignature","text":"In cryptocurrencies, multisig feature allows to sign a transaction with more than one private key. Funds protected with multisig can only be spent by signing with M-of-N keys. Example use cases: shared account (1-of-2; both husband and wife individually have full access to their funds) consensus account (2-of-2; both husband and wife must agree to spend their funds) threshold account (2-of-3; an escrow service is involved as an independent 3rd party, to co-sign with either the seller, or with the buyer, if seller and buyer do not agree) secure account (2-of-3; a single owner controlls all 3 keys but secures them via a different means to diversify risks) arbitrary threshold account (M-of-N; some cryptocurrencies provide full flexibility on the number of signers)","title":"Multisignature"},{"location":"multisignature/#monero-multisignature","text":"Monero doesn't directly implement multisignatures (at least not in a classical sense). Monero emulates the feature by secret splitting. Transactions are still signed with a single spend key. The spend key is a sum of all N private keys. The rationale for such design is to decouple multisig from ring signatures. Let's consider the 2-of-3 scheme. We have 3 participants. Each participant is granted exactly 2 private keys in a way that pairs do not repeat between participants. This way any 2 participants together have all 3 private keys required to create the private spend key. Multi-signing is a wallet-level feature. There is no way to learn from the blockchain which transactions were created using multiple signatures. It is also worth noting in Monero there is no multisig addresses as such. Address structure does not care how the underlying private spend key got created. After multisig wallet setup every participant ends up knowing the public address and private view key. This is necessary for participants to recognize and decipher transactions they are supposed to co-sign.","title":"Monero multisignature"},{"location":"multisignature/#multisig-wallet-setup","text":"Multisig feature is only available via a command line wallet. You should be familiar with the CLI wallet before playing with multisig. Let's consider a 2-of-3 scheme as it generalizes well.","title":"Multisig wallet setup"},{"location":"multisignature/#0-open-your-wallet","text":"Access your (stagenet) wallet: ./monerod --stagenet --daemon # Run your full node; make sure it is fully synced ./monero-wallet-cli --stagenet --wallet-file=... # Run your wallet; make sure you have some funds to play with","title":"0. Open your wallet"},{"location":"multisignature/#1-prepare_multisig","text":"Every participant independently generates initialization data . This is not an address. Every participant sends his initialization data manually to all other participants over secure channel.","title":"1. prepare_multisig"},{"location":"multisignature/#2-make_multisig","text":"Every participant applies initialization data from other participants. This results in a second round of initialization data . This is still not an address. Every participants sends his second round of init data to all other participants over secure channel.","title":"2. make_multisig"},{"location":"multisignature/#3-finalize_multisig","text":"Every participant finalizes wallet creation by applying the second round of init data from all other participants. This finally results in a wallet public address and private view key to be known for all participants. Please note actions are symmetric for all participants. Even though we considered a 2-of-3 scheme, every participant cooperates with everyone else. The secret splitting is performed internally by the wallet. Secure sharing of initialization data between participants is manual. The wallet itself does not provide any secure communication channel. This is out of scope.","title":"3. finalize_multisig"},{"location":"multisignature/#receiving-funds","text":"Address built by multisig setup is like any other address. You can generate integrated addresses and subaddresses based on it. All participants are able to see incoming funds as they share the private view key. With a CLI, use the following commands to see incoming payments: address refresh show_transfers","title":"Receiving funds"},{"location":"multisignature/#spending-funds","text":"TODO","title":"Spending funds"},{"location":"multisignature/#reference","text":"https://monero.stackexchange.com/questions/5646/how-to-use-monero-multisignature-wallets-2-2-2-3","title":"Reference"},{"location":"technical-specs/","text":"Monero Technical Specs \u00b6 Live \u00b6 Monero blockchain is live since 18 April 2014 No premine, no instamine, no ICO, no token \u00b6 Monero had no premine or instamine Monero did not sell any token Monero had no presale of any kind Proof of Work \u00b6 CryptoNight v0 since block height 0 v1 since block height 1546000 (forked on 2018-04-06) v2 since block height 1685555 (forked on 2018-10-18) v3 since block height 1788000 (forked on 2019-03-09); \"CryptonightR\" RandomX v0 since block height 1978433 (forked on 2019-11-30) Difficulty retarget \u00b6 every block based on the last 720 blocks (24h), excluding 20% of the timestamp outliers Block time \u00b6 2 minutes may change in the future as long as emission curve is preserved Block reward \u00b6 smoothly decreasing and subject to penalties for blocks greater then median size of the last 100 blocks (M100) ~1.6 XMR as of June 2020; for the current reward check the coinbase transaction of the latest block Block size \u00b6 dynamic maximum of two times the median size of the last 100 blocks (2 * M100) ~50KB as of June 2020; check the latest block size Emission curve \u00b6 Main emission \u00b6 first, the main emission is about to produce ~18.132 million coins by the end of May 2022 as of June 2020 the emission is about 8 XMR per 10 minutes see charts and details Tail emission \u00b6 the tail emission kicks in once main emission is done it will produce 0.6 XMR per 2-minute block this translates to <1% inflation decreasing over time Max supply \u00b6 ~18.132 million XMR + 0.6 XMR per 2 minutes technically infinite but practically deflationary if accounted for lost coins Divisibility \u00b6 Monero is divisible up to 12 digits The smallest unit is called piconero and equals 1e-12 XMR, or 0.000000000001 XMR Sender privacy \u00b6 ring signatures the ring size is 11 (10 decoys) assurance: probabilistic / plausible deniability Recipient privacy \u00b6 stealth addresses assurance: strong Amount privacy \u00b6 ring confidential transactions assurance: strong IP address privacy \u00b6 For the full node ( monerod ): dandelion++ assurance: won't protect against ISP/VPN provider, won't protect against the very first remote node in Dandellion++ protocol for the full protection user must manually wrap monerod with Tor For the wallet ( monero-wallet-gui or monero-wallet-cli ): typically wallet runs on the same machine as full node so there is no risk if wallet connects to remote full node, there is no IP protection by default user must manually wrap wallet with Tor","title":"Technical specs"},{"location":"technical-specs/#monero-technical-specs","text":"","title":"Monero Technical Specs"},{"location":"technical-specs/#live","text":"Monero blockchain is live since 18 April 2014","title":"Live"},{"location":"technical-specs/#no-premine-no-instamine-no-ico-no-token","text":"Monero had no premine or instamine Monero did not sell any token Monero had no presale of any kind","title":"No premine, no instamine, no ICO, no token"},{"location":"technical-specs/#proof-of-work","text":"CryptoNight v0 since block height 0 v1 since block height 1546000 (forked on 2018-04-06) v2 since block height 1685555 (forked on 2018-10-18) v3 since block height 1788000 (forked on 2019-03-09); \"CryptonightR\" RandomX v0 since block height 1978433 (forked on 2019-11-30)","title":"Proof of Work"},{"location":"technical-specs/#difficulty-retarget","text":"every block based on the last 720 blocks (24h), excluding 20% of the timestamp outliers","title":"Difficulty retarget"},{"location":"technical-specs/#block-time","text":"2 minutes may change in the future as long as emission curve is preserved","title":"Block time"},{"location":"technical-specs/#block-reward","text":"smoothly decreasing and subject to penalties for blocks greater then median size of the last 100 blocks (M100) ~1.6 XMR as of June 2020; for the current reward check the coinbase transaction of the latest block","title":"Block reward"},{"location":"technical-specs/#block-size","text":"dynamic maximum of two times the median size of the last 100 blocks (2 * M100) ~50KB as of June 2020; check the latest block size","title":"Block size"},{"location":"technical-specs/#emission-curve","text":"","title":"Emission curve"},{"location":"technical-specs/#main-emission","text":"first, the main emission is about to produce ~18.132 million coins by the end of May 2022 as of June 2020 the emission is about 8 XMR per 10 minutes see charts and details","title":"Main emission"},{"location":"technical-specs/#tail-emission","text":"the tail emission kicks in once main emission is done it will produce 0.6 XMR per 2-minute block this translates to <1% inflation decreasing over time","title":"Tail emission"},{"location":"technical-specs/#max-supply","text":"~18.132 million XMR + 0.6 XMR per 2 minutes technically infinite but practically deflationary if accounted for lost coins","title":"Max supply"},{"location":"technical-specs/#divisibility","text":"Monero is divisible up to 12 digits The smallest unit is called piconero and equals 1e-12 XMR, or 0.000000000001 XMR","title":"Divisibility"},{"location":"technical-specs/#sender-privacy","text":"ring signatures the ring size is 11 (10 decoys) assurance: probabilistic / plausible deniability","title":"Sender privacy"},{"location":"technical-specs/#recipient-privacy","text":"stealth addresses assurance: strong","title":"Recipient privacy"},{"location":"technical-specs/#amount-privacy","text":"ring confidential transactions assurance: strong","title":"Amount privacy"},{"location":"technical-specs/#ip-address-privacy","text":"For the full node ( monerod ): dandelion++ assurance: won't protect against ISP/VPN provider, won't protect against the very first remote node in Dandellion++ protocol for the full protection user must manually wrap monerod with Tor For the wallet ( monero-wallet-gui or monero-wallet-cli ): typically wallet runs on the same machine as full node so there is no risk if wallet connects to remote full node, there is no IP protection by default user must manually wrap wallet with Tor","title":"IP address privacy"},{"location":"accepting-monero/overview/","text":"Accepting Monero for Businesses \u00b6 This is for businesses that want to accept Monero in an automated way, including: merchants service providers exchanges We prepared a comparison of available venues to accept Monero, as of 2019-01-28: Accepting Monero as a Business - Comparison Matrix","title":"Overview"},{"location":"accepting-monero/overview/#accepting-monero-for-businesses","text":"This is for businesses that want to accept Monero in an automated way, including: merchants service providers exchanges We prepared a comparison of available venues to accept Monero, as of 2019-01-28: Accepting Monero as a Business - Comparison Matrix","title":"Accepting Monero for Businesses"},{"location":"cryptography/base58/","text":"Base58 \u00b6 Base58 is a binary-to-text encoding scheme. It is similar to Base64 but has been modified to avoid both non-alphanumeric characters and letters which might look ambiguous when printed. The characters excluded in relation to Base64 are: IOl0+/ Base58 does not strictly specify the format. This results in some implementations being incompatible with others, for example with regard to alphabet order. For details, see Wikipedia . Base58 in Monero \u00b6 Monero has its own variant of Base58. In Monero the Base58 encoding is performed in 8-byte blocks, except the last block which is the remaining (8 or less) bytes . The 8-byte block converts to 11 or less Base58 characters. If the block converted to less then 11 characters, the output is padded with \"1\"s (0 in Base58). The final block is padded as well to whatever would be the maximum size of this number of bytes encoded in Base58. The advantage of Monero implementation is that output is of a fixed size which is not the case with plain Base58. The disadvantage is that default libraries won't work. For details, see reference C++ Base58 implementation and unofficial Python Base58 implementation.","title":"Base58"},{"location":"cryptography/base58/#base58","text":"Base58 is a binary-to-text encoding scheme. It is similar to Base64 but has been modified to avoid both non-alphanumeric characters and letters which might look ambiguous when printed. The characters excluded in relation to Base64 are: IOl0+/ Base58 does not strictly specify the format. This results in some implementations being incompatible with others, for example with regard to alphabet order. For details, see Wikipedia .","title":"Base58"},{"location":"cryptography/base58/#base58-in-monero","text":"Monero has its own variant of Base58. In Monero the Base58 encoding is performed in 8-byte blocks, except the last block which is the remaining (8 or less) bytes . The 8-byte block converts to 11 or less Base58 characters. If the block converted to less then 11 characters, the output is padded with \"1\"s (0 in Base58). The final block is padded as well to whatever would be the maximum size of this number of bytes encoded in Base58. The advantage of Monero implementation is that output is of a fixed size which is not the case with plain Base58. The disadvantage is that default libraries won't work. For details, see reference C++ Base58 implementation and unofficial Python Base58 implementation.","title":"Base58 in Monero"},{"location":"cryptography/introduction/","text":"Cryptography in Monero \u00b6 Monero uses a wide variety of cryptographic primitives for various use cases. Comparing to altcoins, Monero cryptography is considered conservative, sound and robust. Comparing to Bitcoin, Monero uses much more primitives, and some of them are more advanced, especially those related to privacy and Proof of Work. Some choices are deliberately non-standard (for better or worse) - oftentimes a legacy of the CryptoNote protocol.","title":"Introduction"},{"location":"cryptography/introduction/#cryptography-in-monero","text":"Monero uses a wide variety of cryptographic primitives for various use cases. Comparing to altcoins, Monero cryptography is considered conservative, sound and robust. Comparing to Bitcoin, Monero uses much more primitives, and some of them are more advanced, especially those related to privacy and Proof of Work. Some choices are deliberately non-standard (for better or worse) - oftentimes a legacy of the CryptoNote protocol.","title":"Cryptography in Monero"},{"location":"cryptography/keccak-256/","text":"Keccak-256 Hash Function \u00b6 Monero employs Keccak as a hashing function. In most context specifically Keccak-256 is used, providing 32-byte hashes. Keccak is the leading hashing function, designed by non-NSA designers. Keccak won NIST competition to become the official SHA3. Use Cases \u00b6 Monero does not employ Keccak for Proof-of-Work. Instead, Keccak is used for: random number generator block hashing transaction hashing stealth address private key image (for double spend protection) public address checksum RingCT multisig bulletproofs ...and likely a few other things. Keccak-256 vs SHA3-256 \u00b6 SHA3-256 is Keccak-256, except NIST changed padding. For that reason original Keccak-256 gives in a different hash value than NIST SHA3-256. Monero uses original Keccak-256. The NIST standard was only published on August 2015, while Monero went live on 18 April 2014. Reference \u00b6 Keccak source code used in Monero SHA3 on Wikipedia Keccak-256 vs SHA3-256 explained on Ethereum stackexchange Online tool to calculate Keccak-256 and SHA3-256","title":"Keccak-256"},{"location":"cryptography/keccak-256/#keccak-256-hash-function","text":"Monero employs Keccak as a hashing function. In most context specifically Keccak-256 is used, providing 32-byte hashes. Keccak is the leading hashing function, designed by non-NSA designers. Keccak won NIST competition to become the official SHA3.","title":"Keccak-256 Hash Function"},{"location":"cryptography/keccak-256/#use-cases","text":"Monero does not employ Keccak for Proof-of-Work. Instead, Keccak is used for: random number generator block hashing transaction hashing stealth address private key image (for double spend protection) public address checksum RingCT multisig bulletproofs ...and likely a few other things.","title":"Use Cases"},{"location":"cryptography/keccak-256/#keccak-256-vs-sha3-256","text":"SHA3-256 is Keccak-256, except NIST changed padding. For that reason original Keccak-256 gives in a different hash value than NIST SHA3-256. Monero uses original Keccak-256. The NIST standard was only published on August 2015, while Monero went live on 18 April 2014.","title":"Keccak-256 vs SHA3-256"},{"location":"cryptography/keccak-256/#reference","text":"Keccak source code used in Monero SHA3 on Wikipedia Keccak-256 vs SHA3-256 explained on Ethereum stackexchange Online tool to calculate Keccak-256 and SHA3-256","title":"Reference"},{"location":"cryptography/prng/","text":"Monero Pseudorandom Number Generator \u00b6 Monero uses PRNG based on the Keccak hashing function. Basically, output of the previous hashing round is input for the next one. The initial seed comes from entropy sources provided by operating system. On Linux and MacOS the seed comes from /dev/urandom . On Windows the WinAPI CryptGenRandom call is used for seeding. There is no reseeding. Caveats \u00b6 This concerns the reference C++ implementation of Monero. Please note there are many alternative implementations of private key generation, including JavaScript, Python, Android/Java. These should be researched case by case for correctness. In Monero source code you can also find libsodium based random bytes generator. It is part of the embedded library and apparently is not used in actual Monero code. Reference \u00b6 Source code StackExchange answer","title":"PRNG"},{"location":"cryptography/prng/#monero-pseudorandom-number-generator","text":"Monero uses PRNG based on the Keccak hashing function. Basically, output of the previous hashing round is input for the next one. The initial seed comes from entropy sources provided by operating system. On Linux and MacOS the seed comes from /dev/urandom . On Windows the WinAPI CryptGenRandom call is used for seeding. There is no reseeding.","title":"Monero Pseudorandom Number Generator"},{"location":"cryptography/prng/#caveats","text":"This concerns the reference C++ implementation of Monero. Please note there are many alternative implementations of private key generation, including JavaScript, Python, Android/Java. These should be researched case by case for correctness. In Monero source code you can also find libsodium based random bytes generator. It is part of the embedded library and apparently is not used in actual Monero code.","title":"Caveats"},{"location":"cryptography/prng/#reference","text":"Source code StackExchange answer","title":"Reference"},{"location":"cryptography/asymmetric/edwards25519/","text":"Edwards25519 Elliptic Curve \u00b6 Note Author is nowhere close to being a cryptographer. Be sceptical on accuracy. Note This article is only about the underlying curve. Public key derivation and signing algorithm will be treated separately. Monero employs edwards25519 elliptic curve as a basis for its key pair generation. The curve comes from the Ed25519 signature scheme. While Monero takes the curve unchanged, it does not exactly follow rest of the Ed25519. The edwards25519 curve is birationally equivalent to Curve25519 . Definition \u00b6 This is the standard edwards25519 curve definition, no Monero specific stuff here, except the naming convention. The convention comes from the CryptoNote whitepaper and is widely used in Monero literature. Curve equation \u00b6 \u2212x^2 + y^2 = 1 \u2212 (121665/121666) * x^2 * y^2 Note: curve is in two dimensions (nothing fancy, like all the curves is high school) curve is mirrored below y axis due to y^2 part of the equation (not a polynomial) Base point: G \u00b6 The base point is a specific point on the curve. It is used as a basis for further calculations. It is an arbitrary choice by the curve authors, just to standardize the scheme. Note that it is enough to specify the y value and the sign of the x value. That's because the specific x can be calculated from the curve equation. G = (x, 4/5) # take the point with the positive x # The hex representation of the base point 5866666666666666666666666666666666666666666666666666666666666666 Prime order of the base point: l \u00b6 In layment terms, the \"canvas\" where the curve is drawn is assumed to have a finite \"resolution\", so point coordinates must \"wrap around\" at some point. This is achieved by modulo the l value (lowercase L). In other words, the l defines the maximum scalar we can use. l = 2^252 + 27742317777372353535851937790883648493 # => 7237005577332262213973186563042994240857116359379907606001950938285454250989 The l is a prime number specified by the curve authors. In practice this is the private key's strength. Total number of points on the curve \u00b6 The total number of points on the curve is also a prime number: q = 2^255 - 19 In practice not all points are \"useful\" and so the private key strength is limited to l describe above. Implementation \u00b6 Monero uses (apparently modified) Ref10 implementation by Daniel J. Bernstein. Reference \u00b6 A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography RFC 8032 defining EdDSA Understanding Monero Cryptography - excellent writeup by Luigi StackOverflow answer Python implementation - not the reference one but easier to understand Encoding point to hex EdDSA on Wikipedia","title":"Edwards25519 curve"},{"location":"cryptography/asymmetric/edwards25519/#edwards25519-elliptic-curve","text":"Note Author is nowhere close to being a cryptographer. Be sceptical on accuracy. Note This article is only about the underlying curve. Public key derivation and signing algorithm will be treated separately. Monero employs edwards25519 elliptic curve as a basis for its key pair generation. The curve comes from the Ed25519 signature scheme. While Monero takes the curve unchanged, it does not exactly follow rest of the Ed25519. The edwards25519 curve is birationally equivalent to Curve25519 .","title":"Edwards25519 Elliptic Curve"},{"location":"cryptography/asymmetric/edwards25519/#definition","text":"This is the standard edwards25519 curve definition, no Monero specific stuff here, except the naming convention. The convention comes from the CryptoNote whitepaper and is widely used in Monero literature.","title":"Definition"},{"location":"cryptography/asymmetric/edwards25519/#curve-equation","text":"\u2212x^2 + y^2 = 1 \u2212 (121665/121666) * x^2 * y^2 Note: curve is in two dimensions (nothing fancy, like all the curves is high school) curve is mirrored below y axis due to y^2 part of the equation (not a polynomial)","title":"Curve equation"},{"location":"cryptography/asymmetric/edwards25519/#base-point-g","text":"The base point is a specific point on the curve. It is used as a basis for further calculations. It is an arbitrary choice by the curve authors, just to standardize the scheme. Note that it is enough to specify the y value and the sign of the x value. That's because the specific x can be calculated from the curve equation. G = (x, 4/5) # take the point with the positive x # The hex representation of the base point 5866666666666666666666666666666666666666666666666666666666666666","title":"Base point: G"},{"location":"cryptography/asymmetric/edwards25519/#prime-order-of-the-base-point-l","text":"In layment terms, the \"canvas\" where the curve is drawn is assumed to have a finite \"resolution\", so point coordinates must \"wrap around\" at some point. This is achieved by modulo the l value (lowercase L). In other words, the l defines the maximum scalar we can use. l = 2^252 + 27742317777372353535851937790883648493 # => 7237005577332262213973186563042994240857116359379907606001950938285454250989 The l is a prime number specified by the curve authors. In practice this is the private key's strength.","title":"Prime order of the base point: l"},{"location":"cryptography/asymmetric/edwards25519/#total-number-of-points-on-the-curve","text":"The total number of points on the curve is also a prime number: q = 2^255 - 19 In practice not all points are \"useful\" and so the private key strength is limited to l describe above.","title":"Total number of points on the curve"},{"location":"cryptography/asymmetric/edwards25519/#implementation","text":"Monero uses (apparently modified) Ref10 implementation by Daniel J. Bernstein.","title":"Implementation"},{"location":"cryptography/asymmetric/edwards25519/#reference","text":"A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography RFC 8032 defining EdDSA Understanding Monero Cryptography - excellent writeup by Luigi StackOverflow answer Python implementation - not the reference one but easier to understand Encoding point to hex EdDSA on Wikipedia","title":"Reference"},{"location":"cryptography/asymmetric/introduction/","text":"Asymmetric Cryptography in Monero \u00b6 Note Author is nowhere close to being a cryptographer. Be sceptical on accuracy. Before we get to Monero specific stuff, a little bit of context. We are talking asymmetric cryptography here. The \"asymmetric\" simply means the are two keys: the private key (used primarily for signing data and for decrypting data) the public key (used primarily for signature verification and encrypting data) This is in contrast to symmetric cryptography which uses a single key. This key is a secret shared among the parties. Historically, asymmetric cryptography was based on the problem of factorization of a very large integers back into prime numbers (which is practically impossible for large enough integers). Recently, asymmetric cryptography is based on a mathematical notion of elliptic curves. Edwards25519 is a specific, well researched and standardized elliptic curve used in Monero.","title":"Introduction"},{"location":"cryptography/asymmetric/introduction/#asymmetric-cryptography-in-monero","text":"Note Author is nowhere close to being a cryptographer. Be sceptical on accuracy. Before we get to Monero specific stuff, a little bit of context. We are talking asymmetric cryptography here. The \"asymmetric\" simply means the are two keys: the private key (used primarily for signing data and for decrypting data) the public key (used primarily for signature verification and encrypting data) This is in contrast to symmetric cryptography which uses a single key. This key is a secret shared among the parties. Historically, asymmetric cryptography was based on the problem of factorization of a very large integers back into prime numbers (which is practically impossible for large enough integers). Recently, asymmetric cryptography is based on a mathematical notion of elliptic curves. Edwards25519 is a specific, well researched and standardized elliptic curve used in Monero.","title":"Asymmetric Cryptography in Monero"},{"location":"cryptography/asymmetric/key-image/","text":"Monero Private Key Image \u00b6 Note Author is nowhere close to being a cryptographer. Be sceptical on accuracy. Private key image serves to detect double spending attempts. In Monero funds are always sent to a one-time public key P . Related one-time private key x is specific to unspent output. As output can be spent only once (in whole), the related private key can be used only once as well. Thus, specific private key image I being present on the blockchain means that related output was already spent, and subsequent attempts must not be allowed. This whole scheme is necessary because Monero uses Ring Signatures which make it impossible to know whom exactly signed the transaction. This is why a simple Bitcoin-like double spending check wouldn't work here. Definition \u00b6 I = x*Hp(P) Where: I - private key image (or \"key image\" for short) x - one-time private key used to unlock an unspent output P - one-time public key of an unspent output Hp() - hash function accepting an EC point as an argument The P comes from this: P = xG Where G is the edwards25519 base point. Substitute P with xG and we get: I = x*Hp(xG) The key image I is a one-way function of the private key x . Reference \u00b6 StackExchange answer Another SE answer Critical bug regarding key image verification that was once present in Monero","title":"Key image"},{"location":"cryptography/asymmetric/key-image/#monero-private-key-image","text":"Note Author is nowhere close to being a cryptographer. Be sceptical on accuracy. Private key image serves to detect double spending attempts. In Monero funds are always sent to a one-time public key P . Related one-time private key x is specific to unspent output. As output can be spent only once (in whole), the related private key can be used only once as well. Thus, specific private key image I being present on the blockchain means that related output was already spent, and subsequent attempts must not be allowed. This whole scheme is necessary because Monero uses Ring Signatures which make it impossible to know whom exactly signed the transaction. This is why a simple Bitcoin-like double spending check wouldn't work here.","title":"Monero Private Key Image"},{"location":"cryptography/asymmetric/key-image/#definition","text":"I = x*Hp(P) Where: I - private key image (or \"key image\" for short) x - one-time private key used to unlock an unspent output P - one-time public key of an unspent output Hp() - hash function accepting an EC point as an argument The P comes from this: P = xG Where G is the edwards25519 base point. Substitute P with xG and we get: I = x*Hp(xG) The key image I is a one-way function of the private key x .","title":"Definition"},{"location":"cryptography/asymmetric/key-image/#reference","text":"StackExchange answer Another SE answer Critical bug regarding key image verification that was once present in Monero","title":"Reference"},{"location":"cryptography/asymmetric/private-key/","text":"Private Keys in Monero \u00b6 Note Author is nowhere close to being a cryptographer. Be sceptical on accuracy. In Monero, the root private key is generated randomly . Other private keys are derived deterministically from the root private key. Private key must be kept secret. Private key is a large integer impossible to guess, like: 108555083659983933209597798445644913612440610624038028786991485007418559037440 Private key is 256 bits long. Private key is a scalar , meaning it is a single value. In equations scalars are represented by lowercase letters . Relation to Ed25519 \u00b6 Being simply a random integer, private key is not specific to any particular asymmetric cryptography scheme. In context of Monero EC cryptography the private key is a number the base point G is multiplied by. The result of the multiplication is the public key P (another point on the curve). Multiplication of a point by a number has a very special definition in EC cryptography. See this this guide for details. Key strength \u00b6 Before deriving the public key, private key is subject to modulo l , where l is the maximum scalar allowed by the edwards25519 curve . The l is on the order of 2^252, so the effective key strength is technically 252 bits, not 256 bits. This is standard for EC cryptography and is more of a cosmetic nuance than any concern. Encoding \u00b6 In user-facing contexts, the private key integer is: Taken modulo l to avoid malleability Put as array of 32 bytes in a little-endian direction (the first byte is the least significant) Converted to hexadecimal form, like: b3588a87056fb21dc4d052d59e83b54293882e646b543c29478e4cf45c28a402 Private spend key \u00b6 Private spend key is used to spend moneros. More specifically, it is used to build one-time private keys which allow to spend related outputs. Private view key \u00b6 Private view key is used to recognize your incoming transactions on the otherwise opaque blockchain. One-time private keys \u00b6 One-time private key like construct is used in stealth addresses .","title":"Private keys"},{"location":"cryptography/asymmetric/private-key/#private-keys-in-monero","text":"Note Author is nowhere close to being a cryptographer. Be sceptical on accuracy. In Monero, the root private key is generated randomly . Other private keys are derived deterministically from the root private key. Private key must be kept secret. Private key is a large integer impossible to guess, like: 108555083659983933209597798445644913612440610624038028786991485007418559037440 Private key is 256 bits long. Private key is a scalar , meaning it is a single value. In equations scalars are represented by lowercase letters .","title":"Private Keys in Monero"},{"location":"cryptography/asymmetric/private-key/#relation-to-ed25519","text":"Being simply a random integer, private key is not specific to any particular asymmetric cryptography scheme. In context of Monero EC cryptography the private key is a number the base point G is multiplied by. The result of the multiplication is the public key P (another point on the curve). Multiplication of a point by a number has a very special definition in EC cryptography. See this this guide for details.","title":"Relation to Ed25519"},{"location":"cryptography/asymmetric/private-key/#key-strength","text":"Before deriving the public key, private key is subject to modulo l , where l is the maximum scalar allowed by the edwards25519 curve . The l is on the order of 2^252, so the effective key strength is technically 252 bits, not 256 bits. This is standard for EC cryptography and is more of a cosmetic nuance than any concern.","title":"Key strength"},{"location":"cryptography/asymmetric/private-key/#encoding","text":"In user-facing contexts, the private key integer is: Taken modulo l to avoid malleability Put as array of 32 bytes in a little-endian direction (the first byte is the least significant) Converted to hexadecimal form, like: b3588a87056fb21dc4d052d59e83b54293882e646b543c29478e4cf45c28a402","title":"Encoding"},{"location":"cryptography/asymmetric/private-key/#private-spend-key","text":"Private spend key is used to spend moneros. More specifically, it is used to build one-time private keys which allow to spend related outputs.","title":"Private spend key"},{"location":"cryptography/asymmetric/private-key/#private-view-key","text":"Private view key is used to recognize your incoming transactions on the otherwise opaque blockchain.","title":"Private view key"},{"location":"cryptography/asymmetric/private-key/#one-time-private-keys","text":"One-time private key like construct is used in stealth addresses .","title":"One-time private keys"},{"location":"cryptography/asymmetric/public-key/","text":"Public Keys in Monero \u00b6 Note Author is nowhere close to being a cryptographer. Be sceptical on accuracy. Public key is deterministically derived from private key based on edwards25519 curve with a little Monero-specific twist. Public key is meant to be shared. Assuming correct implementation, it is not practically possible to recover private key from public key. Public key is a point (x,y) on the elliptic curve. In equations points are represented by uppercase letters . In user-facing contexts, public key is encoded in a little-endian hexadecimal form, like: 016a941812293cf9a86071060fb090ab38d67945e659968cb8cf30e1bc725683 Deriving public key \u00b6 Say: P is a public key x is a private key G is a \"base point\"; this is simply a constant specific to edwards25519 ; this point lies on the elliptic curve Then: P = xG The public key is simply the base point (G) multiplied by the private key (x). Multiplying the point is adding the point to itself a number of times. However, the addition is not a simple vector addition. It has a very specific definition nicely described in this article . What is important is that result of addition is always a point on the curve. For example, G + G is another point on the curve. Use cases \u00b6 Monero address is composed of public spend key and public view key. These keys are used to build stealth addresses to receive payments.","title":"Public keys"},{"location":"cryptography/asymmetric/public-key/#public-keys-in-monero","text":"Note Author is nowhere close to being a cryptographer. Be sceptical on accuracy. Public key is deterministically derived from private key based on edwards25519 curve with a little Monero-specific twist. Public key is meant to be shared. Assuming correct implementation, it is not practically possible to recover private key from public key. Public key is a point (x,y) on the elliptic curve. In equations points are represented by uppercase letters . In user-facing contexts, public key is encoded in a little-endian hexadecimal form, like: 016a941812293cf9a86071060fb090ab38d67945e659968cb8cf30e1bc725683","title":"Public Keys in Monero"},{"location":"cryptography/asymmetric/public-key/#deriving-public-key","text":"Say: P is a public key x is a private key G is a \"base point\"; this is simply a constant specific to edwards25519 ; this point lies on the elliptic curve Then: P = xG The public key is simply the base point (G) multiplied by the private key (x). Multiplying the point is adding the point to itself a number of times. However, the addition is not a simple vector addition. It has a very specific definition nicely described in this article . What is important is that result of addition is always a point on the curve. For example, G + G is another point on the curve.","title":"Deriving public key"},{"location":"cryptography/asymmetric/public-key/#use-cases","text":"Monero address is composed of public spend key and public view key. These keys are used to build stealth addresses to receive payments.","title":"Use cases"},{"location":"infrastructure/monero-pulse/","text":"MoneroPulse \u00b6 What is MoneroPulse? \u00b6 MoneroPulse is infrastructure for emergency checkpointing the blockchain. It aims to mitigate chain-splits resulting from consensus bugs (like this one from 2014 ). Effectively, MoneroPulse operators can publish which fork they consider the valid one. Technically, the \"checkpoint\" they publish is a block hash and the block height. By default, Monero full node will simply warn users when MoneroPulse checkpoint does not match the fork it is on. The error will be present in the log and on the console in red. Users are free to discard it. Ideally though, users should consult community on what is going on, and make educated decission on whether to follow the checkpoint-compatible fork or the default fork. Users can also set auto-enforcing the checkpoints via --enforce-dns-checkpointing option to monerod . In case of mismatch, monerod will rollback the local blockchain by a few blocks. Eventually, the alternative (\"fixed\") fork will get heavier and the node will follow it, leaving the \"invalid\" fork behind. This option is recommended for unattended full nodes. Summing up, MoneroPulse is emergency checkpointing mechanism. It is opt-in for the users. MoneroPulse is DNS based \u00b6 The ckeckpoints are stored as DNS TXT records for domains owned by MoneroPulse operators. To get the idea you can access the checkpoints manually with any DNS client: Try: dig -t txt checkpoints.moneropulse.net +dnssec Result: (cut) ;; ANSWER SECTION: checkpoints.moneropulse.net. 299 IN TXT \"1288616:875ac1bc7aa6c5eedc5410abb9c694034f9e7f79dce4c60698baf37009cb6365\" checkpoints.moneropulse.net. 299 IN TXT \"375000:c80c23e387585e12ffb6649d678e9ba328181797b9583a6d8911b77e25375737\" checkpoints.moneropulse.net. 299 IN TXT \"325000:4260d56368267bc2a70dd58d73c5ecf23b4e4d96e63c29a868e4a679b0741c7f\" checkpoints.moneropulse.net. 299 IN TXT \"233000:4f69bec2af6c0852412bdd10c19e6af10c8d738fe2618b5511a98efd03ab477e\" checkpoints.moneropulse.net. 299 IN TXT \"450000:4d098b511ca97723e81737c448343cfd4e6dadb3d8a0e757c6e4d595e6e48357\" checkpoints.moneropulse.net. 299 IN TXT \"250000:f59d31839bd909ec8830b4f7f66ff213f0bd006334c8523daee452725e5c7a79\" checkpoints.moneropulse.net. 299 IN TXT \"550000:c2e80a636438bd9f7a7ab432a6ad297e35540d80ff5b868bca098124cad2ff8c\" checkpoints.moneropulse.net. 299 IN TXT \"650000:1d567f2b491324375a825895c5e7b52857b38e4fed0e42c40909c2d52240b4e0\" checkpoints.moneropulse.net. 299 IN TXT \"800000:2ced10aa85357ab6c14bb12b6b56d1dde28940820dda30911b73a5cc9a301760\" checkpoints.moneropulse.net. 299 IN TXT \"850000:00e2b557dde9fd4a9e2e3dd7ddac962f5ca475eb1095bc50aa757fd1218ab0a5\" checkpoints.moneropulse.net. 299 IN TXT \"900000:d9958d0e7dcf91a5a7b11de225927bf7efc6eb26240315ce12372be902cc1337\" checkpoints.moneropulse.net. 299 IN TXT \"913193:5292d5d56f6ba4de33a58d9a34d263e2cb3c6fee0aed2286fd4ac7f36d53c85f\" checkpoints.moneropulse.net. 299 IN TXT \"913269:f8302e6b8ba1c49aad9a854b8d6c79d8272c6239dcbba5a75ed0784c1d4f56a1\" checkpoints.moneropulse.net. 299 IN TXT \"350000:74da79f6a136969abd6364bd3d37af273c408d6471e8ab598e80569b42415f86\" checkpoints.moneropulse.net. 299 IN TXT \"400000:1b2b0e7a30e59691491529a3d506d1ba3d6052d0f6b52198b7330b28a6f1b6ac\" checkpoints.moneropulse.net. 299 IN TXT \"500000:2428f0dbe49796be05ed81b347f53e1f7f44aed0abf641446ec2b94cae066b02\" checkpoints.moneropulse.net. 299 IN TXT \"600000:f5828ebf7d7d1cb61762c4dfe3ccf4ecab2e1aad23e8113668d981713b7a54c5\" checkpoints.moneropulse.net. 299 IN TXT \"700000:12be9b3d210b93f574d2526abb9c1ab2a881b479131fd0d4f7dac93875f503cd\" checkpoints.moneropulse.net. 299 IN TXT \"300000:0c1cd46df6ccff90ec4ab493281f2583c344cd62216c427628990fe9db1bb8b6\" checkpoints.moneropulse.net. 299 IN RRSIG TXT 13 3 300 20180922151845 20180920131845 35273 moneropulse.net. 8CyqtsM2f9o6OHZYqtGPVf+8gcFM+eUyoMi29LlkcLtK1AXbZlKqCcdN NvdvB+4OzepmpTanSc+TbLWbz/sIzA== Please note the DNSSEC signature entry at the end. The checkpoints are mirrored on several DNS servers: Mainnet: checkpoints.moneropulse.se checkpoints.moneropulse.org checkpoints.moneropulse.net checkpoints.moneropulse.co Stagenet: stagenetpoints.moneropulse.se stagenetpoints.moneropulse.org stagenetpoints.moneropulse.net stagenetpoints.moneropulse.co Testnet: testpoints.moneropulse.se testpoints.moneropulse.org testpoints.moneropulse.net testpoints.moneropulse.co MoneroPulse as attack vector \u00b6 It is worth noting that MoneroPulse does not produce blocks and cannot split the chain on its own. It only suggests the valid fork. Should MoneroPulse got entirely compromised, attacker could stop all auto-enforcing nodes from advancing, by feeding them with the fake checkpoint. This is partially mitigated by DNSSEC and by operating multiple domains. Monero expects checkpoints are consistent across domains. Thus, compromising a single domain or registrar should not lead to any disruption. MoneroPulse also increases the say of its operators in case of possible contentious hard forks. While well intended, this effectively centralizes more power in hands of core developers, or whomever is at the time running MoneroPulse infrastructure. Who are MoneroPulse operators? \u00b6 MoneroPulse is operated by selected core developers. Fixing \"WARNING: no two valid MoneroPulse DNS checkpoint records were received\" \u00b6 This means DNS server you are using does not ackonwledge the +dnssec flag necessary for securely query for checkpoints. By default, your operating system will use DNS server provided by your Internet Service Provider. To fix this warning, change your DNS server either system-wide in your network configuration, or specifically for monerod . Many people find Google's or Cloudflare's DNS servers superior to those offered by their ISPs. Using Google DNS: DNS_PUBLIC=tcp://8.8.8.8 ./monerod Using Cloudflare DNS: DNS_PUBLIC=tcp://1.1.1.1 ./monerod Reference \u00b6 StackExchange answer Reddit answer Monero source code","title":"MoneroPulse"},{"location":"infrastructure/monero-pulse/#moneropulse","text":"","title":"MoneroPulse"},{"location":"infrastructure/monero-pulse/#what-is-moneropulse","text":"MoneroPulse is infrastructure for emergency checkpointing the blockchain. It aims to mitigate chain-splits resulting from consensus bugs (like this one from 2014 ). Effectively, MoneroPulse operators can publish which fork they consider the valid one. Technically, the \"checkpoint\" they publish is a block hash and the block height. By default, Monero full node will simply warn users when MoneroPulse checkpoint does not match the fork it is on. The error will be present in the log and on the console in red. Users are free to discard it. Ideally though, users should consult community on what is going on, and make educated decission on whether to follow the checkpoint-compatible fork or the default fork. Users can also set auto-enforcing the checkpoints via --enforce-dns-checkpointing option to monerod . In case of mismatch, monerod will rollback the local blockchain by a few blocks. Eventually, the alternative (\"fixed\") fork will get heavier and the node will follow it, leaving the \"invalid\" fork behind. This option is recommended for unattended full nodes. Summing up, MoneroPulse is emergency checkpointing mechanism. It is opt-in for the users.","title":"What is MoneroPulse?"},{"location":"infrastructure/monero-pulse/#moneropulse-is-dns-based","text":"The ckeckpoints are stored as DNS TXT records for domains owned by MoneroPulse operators. To get the idea you can access the checkpoints manually with any DNS client: Try: dig -t txt checkpoints.moneropulse.net +dnssec Result: (cut) ;; ANSWER SECTION: checkpoints.moneropulse.net. 299 IN TXT \"1288616:875ac1bc7aa6c5eedc5410abb9c694034f9e7f79dce4c60698baf37009cb6365\" checkpoints.moneropulse.net. 299 IN TXT \"375000:c80c23e387585e12ffb6649d678e9ba328181797b9583a6d8911b77e25375737\" checkpoints.moneropulse.net. 299 IN TXT \"325000:4260d56368267bc2a70dd58d73c5ecf23b4e4d96e63c29a868e4a679b0741c7f\" checkpoints.moneropulse.net. 299 IN TXT \"233000:4f69bec2af6c0852412bdd10c19e6af10c8d738fe2618b5511a98efd03ab477e\" checkpoints.moneropulse.net. 299 IN TXT \"450000:4d098b511ca97723e81737c448343cfd4e6dadb3d8a0e757c6e4d595e6e48357\" checkpoints.moneropulse.net. 299 IN TXT \"250000:f59d31839bd909ec8830b4f7f66ff213f0bd006334c8523daee452725e5c7a79\" checkpoints.moneropulse.net. 299 IN TXT \"550000:c2e80a636438bd9f7a7ab432a6ad297e35540d80ff5b868bca098124cad2ff8c\" checkpoints.moneropulse.net. 299 IN TXT \"650000:1d567f2b491324375a825895c5e7b52857b38e4fed0e42c40909c2d52240b4e0\" checkpoints.moneropulse.net. 299 IN TXT \"800000:2ced10aa85357ab6c14bb12b6b56d1dde28940820dda30911b73a5cc9a301760\" checkpoints.moneropulse.net. 299 IN TXT \"850000:00e2b557dde9fd4a9e2e3dd7ddac962f5ca475eb1095bc50aa757fd1218ab0a5\" checkpoints.moneropulse.net. 299 IN TXT \"900000:d9958d0e7dcf91a5a7b11de225927bf7efc6eb26240315ce12372be902cc1337\" checkpoints.moneropulse.net. 299 IN TXT \"913193:5292d5d56f6ba4de33a58d9a34d263e2cb3c6fee0aed2286fd4ac7f36d53c85f\" checkpoints.moneropulse.net. 299 IN TXT \"913269:f8302e6b8ba1c49aad9a854b8d6c79d8272c6239dcbba5a75ed0784c1d4f56a1\" checkpoints.moneropulse.net. 299 IN TXT \"350000:74da79f6a136969abd6364bd3d37af273c408d6471e8ab598e80569b42415f86\" checkpoints.moneropulse.net. 299 IN TXT \"400000:1b2b0e7a30e59691491529a3d506d1ba3d6052d0f6b52198b7330b28a6f1b6ac\" checkpoints.moneropulse.net. 299 IN TXT \"500000:2428f0dbe49796be05ed81b347f53e1f7f44aed0abf641446ec2b94cae066b02\" checkpoints.moneropulse.net. 299 IN TXT \"600000:f5828ebf7d7d1cb61762c4dfe3ccf4ecab2e1aad23e8113668d981713b7a54c5\" checkpoints.moneropulse.net. 299 IN TXT \"700000:12be9b3d210b93f574d2526abb9c1ab2a881b479131fd0d4f7dac93875f503cd\" checkpoints.moneropulse.net. 299 IN TXT \"300000:0c1cd46df6ccff90ec4ab493281f2583c344cd62216c427628990fe9db1bb8b6\" checkpoints.moneropulse.net. 299 IN RRSIG TXT 13 3 300 20180922151845 20180920131845 35273 moneropulse.net. 8CyqtsM2f9o6OHZYqtGPVf+8gcFM+eUyoMi29LlkcLtK1AXbZlKqCcdN NvdvB+4OzepmpTanSc+TbLWbz/sIzA== Please note the DNSSEC signature entry at the end. The checkpoints are mirrored on several DNS servers: Mainnet: checkpoints.moneropulse.se checkpoints.moneropulse.org checkpoints.moneropulse.net checkpoints.moneropulse.co Stagenet: stagenetpoints.moneropulse.se stagenetpoints.moneropulse.org stagenetpoints.moneropulse.net stagenetpoints.moneropulse.co Testnet: testpoints.moneropulse.se testpoints.moneropulse.org testpoints.moneropulse.net testpoints.moneropulse.co","title":"MoneroPulse is DNS based"},{"location":"infrastructure/monero-pulse/#moneropulse-as-attack-vector","text":"It is worth noting that MoneroPulse does not produce blocks and cannot split the chain on its own. It only suggests the valid fork. Should MoneroPulse got entirely compromised, attacker could stop all auto-enforcing nodes from advancing, by feeding them with the fake checkpoint. This is partially mitigated by DNSSEC and by operating multiple domains. Monero expects checkpoints are consistent across domains. Thus, compromising a single domain or registrar should not lead to any disruption. MoneroPulse also increases the say of its operators in case of possible contentious hard forks. While well intended, this effectively centralizes more power in hands of core developers, or whomever is at the time running MoneroPulse infrastructure.","title":"MoneroPulse as attack vector"},{"location":"infrastructure/monero-pulse/#who-are-moneropulse-operators","text":"MoneroPulse is operated by selected core developers.","title":"Who are MoneroPulse operators?"},{"location":"infrastructure/monero-pulse/#fixing-warning-no-two-valid-moneropulse-dns-checkpoint-records-were-received","text":"This means DNS server you are using does not ackonwledge the +dnssec flag necessary for securely query for checkpoints. By default, your operating system will use DNS server provided by your Internet Service Provider. To fix this warning, change your DNS server either system-wide in your network configuration, or specifically for monerod . Many people find Google's or Cloudflare's DNS servers superior to those offered by their ISPs. Using Google DNS: DNS_PUBLIC=tcp://8.8.8.8 ./monerod Using Cloudflare DNS: DNS_PUBLIC=tcp://1.1.1.1 ./monerod","title":"Fixing \"WARNING: no two valid MoneroPulse DNS checkpoint records were received\""},{"location":"infrastructure/monero-pulse/#reference","text":"StackExchange answer Reddit answer Monero source code","title":"Reference"},{"location":"infrastructure/networks/","text":"Networks \u00b6 Monero offers three separate networks and blockchains: mainnet , stagenet and testnet . Every blockchain has its own genesis block and is entirely seperate from others. Also, corresponding p2p networks are separate. Mainnet \u00b6 Mainnet is the \"production\" network and blockchain. Mainnet is the only blockchain where XMR units have value. Mainnet is what people mean by default. Default TCP ports (listening): 18080 - p2p network 18081 - JSON-RPC server 18082 - ZMQ server Stagenet \u00b6 Stagenet is what you need to learn Monero safely. Stagenet is technically equivalent to mainnet, both in terms of features and consensus rules. Similar to mainnet, use the latest official Monero release to be compatible with stagenet. To get started: Connect your GUI or CLI to stagenet open node monero-stagenet.exan.tech:38081 Get free XMR from stagenet faucet 1 or stagenet faucet 2 Check the stagenet block explorer 1 or stagenet block explorer 2 Default TCP ports (listening): 38080 - p2p network 38081 - JSON-RPC server 38082 - ZMQ server Stagenet was introduced in March 2018 as part of Monero 0.12.0.0. Testnet \u00b6 As a normal user, use stagenet instead. Testnet is for developers. Testnet is the \"experimental\" network and blockchain where things get released long before mainnet. Testnet forks early and often. Most of the time you need to compile Monero from source to be compatible with testnet. Otherwise you will get stuck on the old not-forked version. To get started: Build Monero from source Connect your GUI or CLI to testnet open node monero-testnet.exan.tech:28081 Get free XMR from testnet faucet 1 or testnet faucet 2 Check the testnet block explorer 1 or testnet block explorer 2 Default TCP ports (listening): 28080 - p2p network 28081 - JSON-RPC server 28082 - ZMQ server Private Testnet \u00b6 You can also create your private version of the testnet. Private testnet gives more flexibility to arange for specific situations for developers. Check the private testnet guide . Why stagenet and testnet coins have no value? \u00b6 If mainnet and stagenet are technically equivalent then why only mainnet coins have value? This is simply the convention community embraced. Value only comes from a shared believe that mainnet coins will be accepted by other people in the future.","title":"Mainnet, stagenet, testnet"},{"location":"infrastructure/networks/#networks","text":"Monero offers three separate networks and blockchains: mainnet , stagenet and testnet . Every blockchain has its own genesis block and is entirely seperate from others. Also, corresponding p2p networks are separate.","title":"Networks"},{"location":"infrastructure/networks/#mainnet","text":"Mainnet is the \"production\" network and blockchain. Mainnet is the only blockchain where XMR units have value. Mainnet is what people mean by default. Default TCP ports (listening): 18080 - p2p network 18081 - JSON-RPC server 18082 - ZMQ server","title":"Mainnet"},{"location":"infrastructure/networks/#stagenet","text":"Stagenet is what you need to learn Monero safely. Stagenet is technically equivalent to mainnet, both in terms of features and consensus rules. Similar to mainnet, use the latest official Monero release to be compatible with stagenet. To get started: Connect your GUI or CLI to stagenet open node monero-stagenet.exan.tech:38081 Get free XMR from stagenet faucet 1 or stagenet faucet 2 Check the stagenet block explorer 1 or stagenet block explorer 2 Default TCP ports (listening): 38080 - p2p network 38081 - JSON-RPC server 38082 - ZMQ server Stagenet was introduced in March 2018 as part of Monero 0.12.0.0.","title":"Stagenet"},{"location":"infrastructure/networks/#testnet","text":"As a normal user, use stagenet instead. Testnet is for developers. Testnet is the \"experimental\" network and blockchain where things get released long before mainnet. Testnet forks early and often. Most of the time you need to compile Monero from source to be compatible with testnet. Otherwise you will get stuck on the old not-forked version. To get started: Build Monero from source Connect your GUI or CLI to testnet open node monero-testnet.exan.tech:28081 Get free XMR from testnet faucet 1 or testnet faucet 2 Check the testnet block explorer 1 or testnet block explorer 2 Default TCP ports (listening): 28080 - p2p network 28081 - JSON-RPC server 28082 - ZMQ server","title":"Testnet"},{"location":"infrastructure/networks/#private-testnet","text":"You can also create your private version of the testnet. Private testnet gives more flexibility to arange for specific situations for developers. Check the private testnet guide .","title":"Private Testnet"},{"location":"infrastructure/networks/#why-stagenet-and-testnet-coins-have-no-value","text":"If mainnet and stagenet are technically equivalent then why only mainnet coins have value? This is simply the convention community embraced. Value only comes from a shared believe that mainnet coins will be accepted by other people in the future.","title":"Why stagenet and testnet coins have no value?"},{"location":"infrastructure/tor-onion-p2p-seed-nodes/","text":"Tor onion seed nodes for Monero network \u00b6 When this is necessary? \u00b6 This is only necessary if you run a full node and you want to propagate locally-originating transactions over Tor (using tx-proxy option, see monerod reference ). This allows you to mask your IP (as transaction originator) against P2P network surveillence, on top of Monero's built-in Dandelion++. What are P2P seed nodes? \u00b6 Your monero daemon will discover other P2P nodes but it needs to start somewhere. These starting nodes are known as \"seed nodes\". For clearnet the seed nodes are hardcoded in the software so no configuration is needed. For the Tor network there are no hardcoded seed nodes. You must specify them manually by using the add-peer option in monero.conf . Config snippet \u00b6 These were tested working as of 2020-01-11. They are ran by volunteers and are not guaranteed to work or be maintained. See below how you can quickly test them. # monero.conf snippet # ... add-peer=moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion:18080 add-peer=monerozf6koypqrt.onion:18080 add-peer=zbjkbsxc5munw3qusl7j2hpcmikhqocdf4pqhnhtpzw5nt5jrmofptid.onion:18083 # https://github.com/monero-project/monero/blob/master/src/p2p/net_node.inl add-peer=rno75kjcw3ein6i446sqby2xkyqjarb75oq36ah6c2mribyklzhurpyd.onion:28083 # it is mainnet despite the weird port add-peer=sqzrokz36lgkng2i2nlzgzns2ugcxqosflygsxbkybb4xn6gq3ouugqd.onion:18083 # very flaky, works 1 in 3 times add-peer=blzchctiibfjfvtukctsydhquucz2oajnxnfc5hh4ix35gyqjhdnaqqd.onion:18083 # full node by author of monerodocs.org # ... How to test onion seed nodes? \u00b6 You need Tor daemon installed and running on your laptop. You will also need torsocks command line tool that either comes with Tor or needs to be installed separately. Test using torsocks and telnet \u00b6 You need tor, torsocks and telnet installed. To test speficic onion: torsocks telnet moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion 18080 The expected output (domain resolution errors are fine): 1610372702 ERROR torsocks[11332]: Unable to resolve. Status reply: 4 (in socks5_recv_resolve_reply() at socks5.c:677) Trying 127.42.42.0... Connected to moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion. Escape character is '^]'. Test using torsocks and proxychains \u00b6 You need tor, torsocks and proxychains installed. To test specific onion: proxychains nmap -Pn -p 18080 moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion The expected output (example): [proxychains] Strict chain ... 127.0.0.1:9050 ... moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion:18080 ... OK Nmap scan report for moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion (224.0.0.1) Host is up (0.74s latency). rDNS record for 224.0.0.1: all-systems.mcast.net PORT STATE SERVICE 18080/tcp open unknown Not enough onion seed nodes \u00b6 The onion seed nodes are a scarce resource. Most nodes are only maintained temporarily by their authors. You can greatly contribute to Monero P2P network performance and resillience by running onion-enabled monero full node.","title":"Tor onion seed nodes"},{"location":"infrastructure/tor-onion-p2p-seed-nodes/#tor-onion-seed-nodes-for-monero-network","text":"","title":"Tor onion seed nodes for Monero network"},{"location":"infrastructure/tor-onion-p2p-seed-nodes/#when-this-is-necessary","text":"This is only necessary if you run a full node and you want to propagate locally-originating transactions over Tor (using tx-proxy option, see monerod reference ). This allows you to mask your IP (as transaction originator) against P2P network surveillence, on top of Monero's built-in Dandelion++.","title":"When this is necessary?"},{"location":"infrastructure/tor-onion-p2p-seed-nodes/#what-are-p2p-seed-nodes","text":"Your monero daemon will discover other P2P nodes but it needs to start somewhere. These starting nodes are known as \"seed nodes\". For clearnet the seed nodes are hardcoded in the software so no configuration is needed. For the Tor network there are no hardcoded seed nodes. You must specify them manually by using the add-peer option in monero.conf .","title":"What are P2P seed nodes?"},{"location":"infrastructure/tor-onion-p2p-seed-nodes/#config-snippet","text":"These were tested working as of 2020-01-11. They are ran by volunteers and are not guaranteed to work or be maintained. See below how you can quickly test them. # monero.conf snippet # ... add-peer=moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion:18080 add-peer=monerozf6koypqrt.onion:18080 add-peer=zbjkbsxc5munw3qusl7j2hpcmikhqocdf4pqhnhtpzw5nt5jrmofptid.onion:18083 # https://github.com/monero-project/monero/blob/master/src/p2p/net_node.inl add-peer=rno75kjcw3ein6i446sqby2xkyqjarb75oq36ah6c2mribyklzhurpyd.onion:28083 # it is mainnet despite the weird port add-peer=sqzrokz36lgkng2i2nlzgzns2ugcxqosflygsxbkybb4xn6gq3ouugqd.onion:18083 # very flaky, works 1 in 3 times add-peer=blzchctiibfjfvtukctsydhquucz2oajnxnfc5hh4ix35gyqjhdnaqqd.onion:18083 # full node by author of monerodocs.org # ...","title":"Config snippet"},{"location":"infrastructure/tor-onion-p2p-seed-nodes/#how-to-test-onion-seed-nodes","text":"You need Tor daemon installed and running on your laptop. You will also need torsocks command line tool that either comes with Tor or needs to be installed separately.","title":"How to test onion seed nodes?"},{"location":"infrastructure/tor-onion-p2p-seed-nodes/#test-using-torsocks-and-telnet","text":"You need tor, torsocks and telnet installed. To test speficic onion: torsocks telnet moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion 18080 The expected output (domain resolution errors are fine): 1610372702 ERROR torsocks[11332]: Unable to resolve. Status reply: 4 (in socks5_recv_resolve_reply() at socks5.c:677) Trying 127.42.42.0... Connected to moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion. Escape character is '^]'.","title":"Test using torsocks and telnet"},{"location":"infrastructure/tor-onion-p2p-seed-nodes/#test-using-torsocks-and-proxychains","text":"You need tor, torsocks and proxychains installed. To test specific onion: proxychains nmap -Pn -p 18080 moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion The expected output (example): [proxychains] Strict chain ... 127.0.0.1:9050 ... moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion:18080 ... OK Nmap scan report for moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion (224.0.0.1) Host is up (0.74s latency). rDNS record for 224.0.0.1: all-systems.mcast.net PORT STATE SERVICE 18080/tcp open unknown","title":"Test using torsocks and proxychains"},{"location":"infrastructure/tor-onion-p2p-seed-nodes/#not-enough-onion-seed-nodes","text":"The onion seed nodes are a scarce resource. Most nodes are only maintained temporarily by their authors. You can greatly contribute to Monero P2P network performance and resillience by running onion-enabled monero full node.","title":"Not enough onion seed nodes"},{"location":"interacting/download-monero-binaries/","text":"Download Monero \u00b6 A single archive contains all you need to start using Monero (the full node and the wallet). We recommend downloading Monero binaries directly from GitHub: GUI + CLI: https://github.com/monero-project/monero-gui/releases CLI only: https://github.com/monero-project/monero/releases GUI is a graphical desktop wallet. CLI is a commandline desktop wallet. If you need more guidance check download Monero section on Monero website. It is critical to verify the signature of downloaded archive. Which version to download? \u00b6 Download the latest version matching your operating system and processor architecture. The CLI version is released earlier and is suitable for server deployments. The GUI version contains both CLI and GUI. It is preferable for end-users. All versions contain a full node and a wallet. Why prefer GitHub over getmonero.org? \u00b6 Binaries appear earlier on GitHub. On top of that, if you fail to properly verify the signature, GitHub is safer, simply because you don't need to trust a separate website to not be compromised. Obviously, you should still carefully verify the signature for each release. Signature verification is always the primary line of defense.","title":"Download"},{"location":"interacting/download-monero-binaries/#download-monero","text":"A single archive contains all you need to start using Monero (the full node and the wallet). We recommend downloading Monero binaries directly from GitHub: GUI + CLI: https://github.com/monero-project/monero-gui/releases CLI only: https://github.com/monero-project/monero/releases GUI is a graphical desktop wallet. CLI is a commandline desktop wallet. If you need more guidance check download Monero section on Monero website. It is critical to verify the signature of downloaded archive.","title":"Download Monero"},{"location":"interacting/download-monero-binaries/#which-version-to-download","text":"Download the latest version matching your operating system and processor architecture. The CLI version is released earlier and is suitable for server deployments. The GUI version contains both CLI and GUI. It is preferable for end-users. All versions contain a full node and a wallet.","title":"Which version to download?"},{"location":"interacting/download-monero-binaries/#why-prefer-github-over-getmoneroorg","text":"Binaries appear earlier on GitHub. On top of that, if you fail to properly verify the signature, GitHub is safer, simply because you don't need to trust a separate website to not be compromised. Obviously, you should still carefully verify the signature for each release. Signature verification is always the primary line of defense.","title":"Why prefer GitHub over getmonero.org?"},{"location":"interacting/monero-blockchain-export-reference/","text":"monero-blockchain-export - Reference \u00b6 Note Nowadays, there is little usage for raw blockchain export / import. In the past the p2p blockchain download was much slower. Back than blockchain.raw file was used to speed up the process of bootstrapping a node. Overview \u00b6 The tool dumps local blockchain to raw format, known as the blockchain.raw file. This could be useful if you want to process blockchain efficiently with your custom tools, as the raw format is probably easier to work with than Monero's custom lmdb database. The tool works on your local copy of the blockchain. It does not require monerod running. Syntax \u00b6 ./monero-blockchain-export [options] Example: ./monero-blockchain-export --help Running \u00b6 Go to directory where you unpacked Monero. ./monero-blockchain-export --stagenet --output-file=/tmp/blockchain.raw Options \u00b6 Help \u00b6 Option Description --help Enlist available options. Pick network \u00b6 Option Description (missing) By default monero-blockchain-export assumes mainnet . --stagenet Export stagenet blockchain. --testnet Export testnet blockchain. Logging \u00b6 Specifying the log file path is not supported. Option Description --log-level 0-4 with 0 being minimal logging and 4 being full tracing. Defaults to 0 . These are general presets and do not directly map to severity levels. For example, even with minimal 0 , you may see some most important INFO entries. Example: ./monero-blockchain-export --log-level=1 Input \u00b6 Option Description --data-dir Full path to data directory. This is where the blockchain, log files, and p2p network memory are stored. For defaults and details see data directory . --database , --db-type The default and only valid value is lmdb . Output \u00b6 Option Description --output-file Specify output file path. The default is $DATA_DIR/export/blockchain.raw . Example: ./monero-blockchain-export --output-file=/tmp/blockchain.raw --blocksdat Output in blocks.dat format. --block-stop Only export up to this block number. By default do the full export (value 0 ). Reference \u00b6 https://github.com/monero-project/monero/tree/master/src/blockchain_utilities","title":"monero-blockchain-export"},{"location":"interacting/monero-blockchain-export-reference/#monero-blockchain-export-reference","text":"Note Nowadays, there is little usage for raw blockchain export / import. In the past the p2p blockchain download was much slower. Back than blockchain.raw file was used to speed up the process of bootstrapping a node.","title":"monero-blockchain-export - Reference"},{"location":"interacting/monero-blockchain-export-reference/#overview","text":"The tool dumps local blockchain to raw format, known as the blockchain.raw file. This could be useful if you want to process blockchain efficiently with your custom tools, as the raw format is probably easier to work with than Monero's custom lmdb database. The tool works on your local copy of the blockchain. It does not require monerod running.","title":"Overview"},{"location":"interacting/monero-blockchain-export-reference/#syntax","text":"./monero-blockchain-export [options] Example: ./monero-blockchain-export --help","title":"Syntax"},{"location":"interacting/monero-blockchain-export-reference/#running","text":"Go to directory where you unpacked Monero. ./monero-blockchain-export --stagenet --output-file=/tmp/blockchain.raw","title":"Running"},{"location":"interacting/monero-blockchain-export-reference/#options","text":"","title":"Options"},{"location":"interacting/monero-blockchain-export-reference/#help","text":"Option Description --help Enlist available options.","title":"Help"},{"location":"interacting/monero-blockchain-export-reference/#pick-network","text":"Option Description (missing) By default monero-blockchain-export assumes mainnet . --stagenet Export stagenet blockchain. --testnet Export testnet blockchain.","title":"Pick network"},{"location":"interacting/monero-blockchain-export-reference/#logging","text":"Specifying the log file path is not supported. Option Description --log-level 0-4 with 0 being minimal logging and 4 being full tracing. Defaults to 0 . These are general presets and do not directly map to severity levels. For example, even with minimal 0 , you may see some most important INFO entries. Example: ./monero-blockchain-export --log-level=1","title":"Logging"},{"location":"interacting/monero-blockchain-export-reference/#input","text":"Option Description --data-dir Full path to data directory. This is where the blockchain, log files, and p2p network memory are stored. For defaults and details see data directory . --database , --db-type The default and only valid value is lmdb .","title":"Input"},{"location":"interacting/monero-blockchain-export-reference/#output","text":"Option Description --output-file Specify output file path. The default is $DATA_DIR/export/blockchain.raw . Example: ./monero-blockchain-export --output-file=/tmp/blockchain.raw --blocksdat Output in blocks.dat format. --block-stop Only export up to this block number. By default do the full export (value 0 ).","title":"Output"},{"location":"interacting/monero-blockchain-export-reference/#reference","text":"https://github.com/monero-project/monero/tree/master/src/blockchain_utilities","title":"Reference"},{"location":"interacting/monero-blockchain-import-reference/","text":"monero-blockchain-import - Reference \u00b6 Note Nowadays, there is little usage for raw blockchain export / import. In the past the p2p blockchain download was much slower. Back than blockchain.raw file was used to speed up download process of bootstrapping a node. Overview \u00b6 The tool imports bootstrap file blockchain.raw to your full node. This could be useful if you want to decouple download from verification for any reason (like testing performance in isolation). In this case, you may download the blockchain.raw file from https://downloads.getmonero.org/blockchain.raw . Ideally though, you should use your own trusted blockchain.raw file that you exported earlier. Please note that importing blockchain.raw will not speed up the process over syncing up from p2p network. This is because usual bottlenecks are disk IO and verification, not the download. The tool works on your local files. It does not require monerod running. Syntax \u00b6 ./monero-blockchain-import [options] Example: ./monero-blockchain-import --help Running \u00b6 Go to directory where you unpacked Monero. ./monero-blockchain-import --stagenet --output-file=/tmp/blockchain.raw Options \u00b6 Help \u00b6 Option Description --help Enlist available options. Pick network \u00b6 Option Description (missing) By default monero-blockchain-import assumes the mainnet blockchain. --stagenet Import stagenet blockchain. --testnet Import testnet blockchain. Logging \u00b6 Specifying the log file path is not supported. Option Description --log-level 0-4 with 0 being minimal logging and 4 being full tracing. Defaults to 0 . These are general presets and do not directly map to severity levels. For example, even with minimal 0 , you may see some most important INFO entries. Example: ./monero-blockchain-import --log-level=1 Input \u00b6 Option Description --input-file Full path to raw blockchain file. The default is $DATA_DIR/export/blockchain.raw . --block-stop Only import up to this block height. By default import all blocks (value 0 ). --pop-blocks Discard specified number of blocks from the tip of the bootstrapped blockchain. By default don't discard anything (value 0 ). Output \u00b6 Option Description --data-dir Full path to data directory. This is where the blockchain, log files, and p2p network memory are stored. For defaults and details see data directory . --count-blocks Count blocks in the bootstrap file and exit. --drop-hard-fork Whether to drop hard fork data. Off by default ( 0 ). --database The only valid value seems to be lmdb (the default). Performance \u00b6 Option Description --dangerous-unverified-import The safe default is to run verification (value 0 ). You can enable --dangerous-unverified-import if you are importing from your own and trusted blockchain.raw (which we assume was already verified). The \"dangerous\" mode will greatly speed up the process. --batch Whether to save to disk on an ongoing basis (the default, value 1 ) or maybe do everything in RAM and save everything in the end (value 0 ). No batching is only effective in combination with no verification ( --dangerous-unverified-import ). See also --batch-size . --batch-size How often to save to disk expressed in number of blocks. By default save every 5000 blocks (when verifying) or every 20000 blocks (when not verifying). Big batches are faster but require more RAM. --resume Resume from current height if output database already exists (the default, value 1 ). Changing to --resume=0 doesn't change much \u2014 existing blocks are skipped pretty quickly and the process is resumed anyway. Reference \u00b6 https://github.com/monero-project/monero/tree/master/src/blockchain_utilities","title":"monero-blockchain-import"},{"location":"interacting/monero-blockchain-import-reference/#monero-blockchain-import-reference","text":"Note Nowadays, there is little usage for raw blockchain export / import. In the past the p2p blockchain download was much slower. Back than blockchain.raw file was used to speed up download process of bootstrapping a node.","title":"monero-blockchain-import - Reference"},{"location":"interacting/monero-blockchain-import-reference/#overview","text":"The tool imports bootstrap file blockchain.raw to your full node. This could be useful if you want to decouple download from verification for any reason (like testing performance in isolation). In this case, you may download the blockchain.raw file from https://downloads.getmonero.org/blockchain.raw . Ideally though, you should use your own trusted blockchain.raw file that you exported earlier. Please note that importing blockchain.raw will not speed up the process over syncing up from p2p network. This is because usual bottlenecks are disk IO and verification, not the download. The tool works on your local files. It does not require monerod running.","title":"Overview"},{"location":"interacting/monero-blockchain-import-reference/#syntax","text":"./monero-blockchain-import [options] Example: ./monero-blockchain-import --help","title":"Syntax"},{"location":"interacting/monero-blockchain-import-reference/#running","text":"Go to directory where you unpacked Monero. ./monero-blockchain-import --stagenet --output-file=/tmp/blockchain.raw","title":"Running"},{"location":"interacting/monero-blockchain-import-reference/#options","text":"","title":"Options"},{"location":"interacting/monero-blockchain-import-reference/#help","text":"Option Description --help Enlist available options.","title":"Help"},{"location":"interacting/monero-blockchain-import-reference/#pick-network","text":"Option Description (missing) By default monero-blockchain-import assumes the mainnet blockchain. --stagenet Import stagenet blockchain. --testnet Import testnet blockchain.","title":"Pick network"},{"location":"interacting/monero-blockchain-import-reference/#logging","text":"Specifying the log file path is not supported. Option Description --log-level 0-4 with 0 being minimal logging and 4 being full tracing. Defaults to 0 . These are general presets and do not directly map to severity levels. For example, even with minimal 0 , you may see some most important INFO entries. Example: ./monero-blockchain-import --log-level=1","title":"Logging"},{"location":"interacting/monero-blockchain-import-reference/#input","text":"Option Description --input-file Full path to raw blockchain file. The default is $DATA_DIR/export/blockchain.raw . --block-stop Only import up to this block height. By default import all blocks (value 0 ). --pop-blocks Discard specified number of blocks from the tip of the bootstrapped blockchain. By default don't discard anything (value 0 ).","title":"Input"},{"location":"interacting/monero-blockchain-import-reference/#output","text":"Option Description --data-dir Full path to data directory. This is where the blockchain, log files, and p2p network memory are stored. For defaults and details see data directory . --count-blocks Count blocks in the bootstrap file and exit. --drop-hard-fork Whether to drop hard fork data. Off by default ( 0 ). --database The only valid value seems to be lmdb (the default).","title":"Output"},{"location":"interacting/monero-blockchain-import-reference/#performance","text":"Option Description --dangerous-unverified-import The safe default is to run verification (value 0 ). You can enable --dangerous-unverified-import if you are importing from your own and trusted blockchain.raw (which we assume was already verified). The \"dangerous\" mode will greatly speed up the process. --batch Whether to save to disk on an ongoing basis (the default, value 1 ) or maybe do everything in RAM and save everything in the end (value 0 ). No batching is only effective in combination with no verification ( --dangerous-unverified-import ). See also --batch-size . --batch-size How often to save to disk expressed in number of blocks. By default save every 5000 blocks (when verifying) or every 20000 blocks (when not verifying). Big batches are faster but require more RAM. --resume Resume from current height if output database already exists (the default, value 1 ). Changing to --resume=0 doesn't change much \u2014 existing blocks are skipped pretty quickly and the process is resumed anyway.","title":"Performance"},{"location":"interacting/monero-blockchain-import-reference/#reference","text":"https://github.com/monero-project/monero/tree/master/src/blockchain_utilities","title":"Reference"},{"location":"interacting/monero-config-file/","text":"Monero Configuration File \u00b6 Applicability \u00b6 By default Monero looks for bitmonero.conf in Monero data directory . To use a specific config file add --config-file option: ./monerod --config-file=/etc/monerod.conf The --config-file option is available for: monerod monero-wallet-cli monero-wallet-rpc monero-gen-trusted-multisig Syntax \u00b6 option-name=value valueless-option-name=1 for options that don't expect value # comment whitespace is ignored Reference \u00b6 All configuration options are the same as command line options for the binary. monerod reference monero-wallet-cli reference monero-wallet-rpc reference Skip the -- from --option-name . Example: ./monerod --log-level=4 --stagenet translates to: log-level=4 stagenet=1 # use value \"1\" to enable the value-less options like --stagenet Examples \u00b6 monerod.conf \u00b6 This config is tailored for production server usage. # /etc/monero/monerod.conf # Data directory (blockchain db and indices) data-dir=/home/monero/.monero # Remember to create the monero user first # Log file log-file=/var/log/monero/monerod.log max-log-file-size=0 # Prevent monerod from managing the log files; we want logrotate to take care of that # P2P full node p2p-bind-ip=0.0.0.0 # Bind to all interfaces (the default) p2p-bind-port=18080 # Bind to default port # RPC open node rpc-bind-ip=0.0.0.0 # Bind to all interfaces rpc-bind-port=18081 # Bind on default port confirm-external-bind=1 # Open node (confirm) restricted-rpc=1 # Prevent unsafe RPC calls no-igd=1 # Disable UPnP port mapping # Slow but reliable db writes db-sync-mode=safe # Emergency checkpoints set by MoneroPulse operators will be enforced to workaround potential consensus bugs # Check https://monerodocs.org/infrastructure/monero-pulse/ for explanation and trade-offs enforce-dns-checkpointing=1 out-peers=64 # This will enable much faster sync and tx awareness; the default 8 is suboptimal nowadays in-peers=1024 # The default is unlimited; we prefer to put a cap on this limit-rate-up=1048576 # 1048576 kB/s == 1GB/s; a raise from default 2048 kB/s; contribute more to p2p network limit-rate-down=1048576 # 1048576 kB/s == 1GB/s; a raise from default 8192 kB/s; allow for faster initial sync monero-wallet-cli.conf \u00b6 This config is tailored for desktop usage on stagenet . # $HOME/.bitmonero/stagenet/monero-wallet-cli.conf # Pick network stagenet=1 # Connect to a remote full node daemon-address=monero-stagenet.exan.tech:38081 untrusted-daemon=1 # Log file log-file=/tmp/monero-wallet-cli.log # wallet-file=/home/YOUR-USER/.bitmonero/stagenet/wallets/MoneroExampleStagenetWallet","title":"Config file"},{"location":"interacting/monero-config-file/#monero-configuration-file","text":"","title":"Monero Configuration File"},{"location":"interacting/monero-config-file/#applicability","text":"By default Monero looks for bitmonero.conf in Monero data directory . To use a specific config file add --config-file option: ./monerod --config-file=/etc/monerod.conf The --config-file option is available for: monerod monero-wallet-cli monero-wallet-rpc monero-gen-trusted-multisig","title":"Applicability"},{"location":"interacting/monero-config-file/#syntax","text":"option-name=value valueless-option-name=1 for options that don't expect value # comment whitespace is ignored","title":"Syntax"},{"location":"interacting/monero-config-file/#reference","text":"All configuration options are the same as command line options for the binary. monerod reference monero-wallet-cli reference monero-wallet-rpc reference Skip the -- from --option-name . Example: ./monerod --log-level=4 --stagenet translates to: log-level=4 stagenet=1 # use value \"1\" to enable the value-less options like --stagenet","title":"Reference"},{"location":"interacting/monero-config-file/#examples","text":"","title":"Examples"},{"location":"interacting/monero-config-file/#monerodconf","text":"This config is tailored for production server usage. # /etc/monero/monerod.conf # Data directory (blockchain db and indices) data-dir=/home/monero/.monero # Remember to create the monero user first # Log file log-file=/var/log/monero/monerod.log max-log-file-size=0 # Prevent monerod from managing the log files; we want logrotate to take care of that # P2P full node p2p-bind-ip=0.0.0.0 # Bind to all interfaces (the default) p2p-bind-port=18080 # Bind to default port # RPC open node rpc-bind-ip=0.0.0.0 # Bind to all interfaces rpc-bind-port=18081 # Bind on default port confirm-external-bind=1 # Open node (confirm) restricted-rpc=1 # Prevent unsafe RPC calls no-igd=1 # Disable UPnP port mapping # Slow but reliable db writes db-sync-mode=safe # Emergency checkpoints set by MoneroPulse operators will be enforced to workaround potential consensus bugs # Check https://monerodocs.org/infrastructure/monero-pulse/ for explanation and trade-offs enforce-dns-checkpointing=1 out-peers=64 # This will enable much faster sync and tx awareness; the default 8 is suboptimal nowadays in-peers=1024 # The default is unlimited; we prefer to put a cap on this limit-rate-up=1048576 # 1048576 kB/s == 1GB/s; a raise from default 2048 kB/s; contribute more to p2p network limit-rate-down=1048576 # 1048576 kB/s == 1GB/s; a raise from default 8192 kB/s; allow for faster initial sync","title":"monerod.conf"},{"location":"interacting/monero-config-file/#monero-wallet-cliconf","text":"This config is tailored for desktop usage on stagenet . # $HOME/.bitmonero/stagenet/monero-wallet-cli.conf # Pick network stagenet=1 # Connect to a remote full node daemon-address=monero-stagenet.exan.tech:38081 untrusted-daemon=1 # Log file log-file=/tmp/monero-wallet-cli.log # wallet-file=/home/YOUR-USER/.bitmonero/stagenet/wallets/MoneroExampleStagenetWallet","title":"monero-wallet-cli.conf"},{"location":"interacting/monero-wallet-cli-reference/","text":"monero-wallet-cli - Reference \u00b6 Note Get yourself comfortable with a friendly Monero CLI wallet. It is the most reliable and most complete wallet for Monero. Use stagenet for learning. Overview \u00b6 Command line wallet \u00b6 The \"official\" command line wallet for Monero. Available for Linux, macOS and Windows. Wallet uses your private keys to understand your total balance, transactions history, and to facilitate creating transactions. However, wallet does not store the blockchain and does not directly participate in the p2p network. The CLI wallet is the most reliable and most feature complete wallet for Monero. Depends on the full node \u00b6 Wallet connects to a full node to scan the blockchain for your transaction outputs and to send your transactions out to the network. The full node can be either local (same computer) or remote. Normally, you run the full node on the same computer as wallet (or within your home network). Connection happens over HTTP and uses this API . Any transaction leaving the wallet is already blinded by all Monero privacy features. This means plain text HTTP communication isn't an issue on its own even if you connect to a remote node. However, connecting to a remote node has other nuanced trade-offs, which is a topic for a separate article. Syntax \u00b6 ./monero-wallet-cli [options] [command] Example: ./monero-wallet-cli --stagenet Running \u00b6 Go to directory where you unpacked Monero. Run the full node and wait until it syncs up with the network (may take up to a few days): ./monerod --stagenet In a separate terminal window, run the wallet: ./monero-wallet-cli --stagenet --generate-new-wallet MoneroExampleStagenetWallet Options \u00b6 Help and version \u00b6 Option Description --help Enlist available options. --version Show monero-wallet-cli version to stdout. Example: Monero 'Boron Butterfly' (v0.14.0.0-release) Pick network \u00b6 Option Description (missing) By default wallet assumes mainnet . --stagenet Run on stagenet . Remember to run your daemon with --stagenet as well. --testnet Run on testnet . Remember to run your daemon with --testnet as well. Logging \u00b6 Option Description --log-file <arg> Full path to the log file. --log-level <arg> 0-4 with 0 being minimal logging and 4 being full tracing. Defaults to 0 . These are general presets and do not directly map to severity levels. For example, even with minimal 0 , you may see some most important INFO entries. --max-log-file-size <arg> Soft limit in bytes for the log file (=104850000 by default, which is just under 100MB). Once log file grows past that limit, monero creates the next log file with a UTC timestamp postfix -YYYY-MM-DD-HH-MM-SS . In production deployments, you would probably prefer to use established solutions like logrotate instead. In that case, set --max-log-file-size 0 to prevent monero from managing the log files. --max-log-files <arg> Limit on the number of log files (=50 by default). The oldest log files are removed. In production deployments, you would probably prefer to use established solutions like logrotate instead. Full node connection \u00b6 Wallet depends on a full node for all non-local operations. The following options define how to connect to monerod : Option Description --daemon-address <arg> Use monerod instance at <host>:<port> . Example: ./monero-wallet-cli --daemon-address monero-stagenet.exan.tech:38081 --stagenet --daemon-host <arg> Use monerod instance at host <arg> instead of localhost. --daemon-port <arg> Use monerod instance at port <arg> instead of 18081. --daemon-login <arg> Specify username[:password] for monerod RPC API. It is based on HTTP Basic Auth. Mind that connections are by default unencrypted. Authentication only makes sense if you establish a secure connection (maybe via Tor, or SSH tunneling, or reverse proxy w/ TLS). --trusted-daemon Enable commands and behaviors which rely on monerod instance being trusted. Default for localhost connection. The trust in this context concerns preserving your privacy. Only use this flag if you do control monerod . Trusted daemon allows for commands like rescan_spent , start_mining , import_key_images and behaviors like not warning about potential attack on transient problems with transaction sending. --untrusted-daemon Disable commands and behaviors which rely on monerod instance being trusted. Default for a non-localhost connections. See --trusted-daemon for more details. --do-not-relay The newly created transaction will not be relayed to the Monero network. Instead it will be dumped to a file in a raw hexadecimal format. Useful if you want to push the transaction through a gateway like https://xmrchain.net/rawtx . This may be easier to use over Tor than Monero wallet. --allow-mismatched-daemon-version Allow communicating with monerod that uses a different RPC version. Create new wallet \u00b6 Option Description --generate-new-wallet <arg> Create a new Monero wallet and save it to <arg> file. You will be asked for a password. The password is used to encrypt the wallet file but it is unrelated to your master spend key or mnemonic seed. Generate a very strong password with your password manager (~256 bits of entropy). Example: ./monero-wallet-cli --stagenet --generate-new-wallet $HOME/.bitmonero/stagenet/wallets/MoneroExampleStagenetWallet --kdf-rounds <arg> Concerns encrypting the wallet file. The wallet file is encrypted with ChaCha stream cipher. The encryption key is derived from the user supplied password by hashing the password with CryptoNight. This option defines how many times the CryptoNight hashing will be applied. The default is 1 round of hashing. Note this is unrelated to spend key generation. The more rounds the longer you will wait to open the wallet or send transaction. But also the attacker will have it harder to brute force your wallet password. Note: You will have to remember and provide the same kdf-rounds on every wallet access! Recommendation: Do not change the default value. Instead generate a very strong wallet password with your password manager (256 bits of entropy). Open existing wallet \u00b6 Option Description --wallet-file <arg> Open existing wallet. Example: ./monero-wallet-cli --stagenet --wallet-file $HOME/.bitmonero/stagenet/wallets/MoneroExampleStagenetWallet This is only for wallet files generated with monero-wallet-cli , monero-wallet-gui , or monero-wallet-rpc tools. If you have other type of wallet then see importing options. --password <arg> Provide wallet password as a parameter instead of interactively. Remember to escape/quote as needed. Not recommended because the password will remain in your command history and will also be visible in the process table. For automation prefer --password-file . The option also works in combination with --generate-new-wallet . --password-file <arg> Provide password as a file in stead of interactively. Trailing \\n are discarded when reading the password file. Prefer this over --password if you automate wallet access. Make sure the password file is meaningfully separated from the wallet file. Otherwise it provides no security benefit. The option also works in combination with --generate-new-wallet . Restore wallet \u00b6 Option Description --generate-from-device <arg> Restore/generate a special wallet to work with a hardware device like Ledger or Trezor and save it to <arg> file. Example: ./monero-wallet-cli --stagenet --generate-from-device MoneroExampleDeviceWallet --subaddress-lookahead 5:20 This is a one-time action. Next time you simply open the wallet . By default the command expects Ledger hardware connected. For Trezor hardware add --hw-device Trezor (expected ~May 2019). It will take up to 25 minutes with default settings. This is because hardware devices are slow to pre-generate subaddresses. To mitigate use low --subaddress-lookahead 5:20 . The local wallet will not have private spend key and will not be able to spend on its own. It serves as a user interface and a bridge for low-power hardware devices. Transaction signing with a private spend key always happens on the hardware device. See the complete guide to hardware wallet setup . --generate-from-view-key <arg> Restore a view-only version of the wallet to track incoming transactions and save it to <arg> file. The wallet is created based on a secret view key and standard address . The secret view key is meant to be pasted as hexadecimal. --generate-from-spend-key <arg> Restore a wallet from secret spend key and save it to <arg> file. The secret spend key is meant to be pasted as hexadecimal. --restore-deterministic-wallet Restore a wallet from secret mnemonic seed . Use this to restore from your 25 words backup. You will be asked for a password to encrypt the wallet file (once restored). Note this is not a passphrase to mnemonic seed. Mnemonic seeds generated by Monero official wallets are naked. --restore-height <arg> Only scan for transactions later than specific blockchain height. The default is 0 . Raising the value makes wallet restoration radically faster . The optimal value should match the day you originally created the wallet (but cannot be later). The mapping between the block height and date/time is available on block explorers like https://xmrchain.net . For instance, if you created the wallet in 2019+ use 1730000 . Multisig wallet \u00b6 Option Description --generate-from-multisig-keys <arg> Create a standard wallet from multisig keys. This is useful to combine all multisig secret keys back into the standard wallet (when you no longer need the multisig). The wallet will then have control of the funds. It only supports providing all secret keys even if the multisig scheme allowed for less (only N/N not N/M ). --restore-multisig-wallet Restore a multisig wallet from secret seed that was earlier exported with the seed interactive command. This only restores your part of the wallet. Other multisig participants will still be necessary to sign the transaction. Config file \u00b6 Option Description --config-file <arg> Full path to the configuration file . Note this should be a separate config than monerod uses because these tools accept different set of options. Performance \u00b6 Option Description --subaddress-lookahead <arg> Accepts m:n , by default 50:200 . The first value is the number of accounts and the second value is the number of subaddresses per account. The wallet will not check for payments to subaddresses further than n away from the last received payment. This can happen if you generated unique subaddresses for n clients in a row but none of them paid. On the other hand the more subaddresses you set to look ahead, the longer it takes to create your wallet, because they must be pre-computed. This is normally not a concern, except for hardware wallets. On the Ledger the default value of 50:200 can take over 20 minutes (one time on wallet creation)! --max-concurrency <arg> Max number of threads to use for parallel jobs. The default value 0 uses the number of CPU threads. Internationalization \u00b6 Option Description --mnemonic-language <arg> Language for mnemonic seed words. One of english , english_old , esperanto , french , german , italian , japanese , lojban , portuguese , russian , spanish . It might be a good idea to stick to default English which is by far the most popular and well tested. It also avoids potential non-ASCII characters pitfalls or bugs. --use-english-language-names If your display freezes, exit blind with ^C, then run again with --use-english-language-names . This can happen when Monero prompts for a language displaying language names in their natives alphabets. Legacy \u00b6 These options are either legacy or rarely useful. Option Description --non-deterministic Generate legacy non-deterministic wallet. The view key will not be derived from the spend key. You would also have to backup the .keys. To restore non-deterministic wallet (standard address) use --generate-from-keys . To restore fully you will need the .keys file. --generate-from-keys <arg> Restore legacy non-deterministic wallet by providing both spend and view keys and the standard address. --shared-ringdb-dir <arg> Set shared ring database path. No longer worthwhile . --create-address-file Has no effect. The *.address.txt file is created regardless of this option. --electrum-seed <arg> Provide mnemonic seed as a commandline option for --restore-deterministic-wallet instead of interactively. This is not recommended b/c the seed will be saved in your command history and also visible in the process list. --generate-from-json <arg> You would run monero-wallet-rpc to use this option. It seems exposed in monero-wallet-cli by accident. --tx-notify <arg> You would run monero-wallet-rpc to use this option. It seems exposed in monero-wallet-cli by accident. Defaults \u00b6 Wallet files are created and seek in current directory. This is rarely what you want. Use --wallet-file and similar options to control this. Log files are created in the same directory as monero-wallet-cli binary. Use --log-file to specify the location. Commands \u00b6 Commands are used interactively in the monero-wallet-cli prompt. You can also run a one-off command by providing it as a commandline parameter. This is rarely useful though. For automation prefer monero-wallet-rpc . The CLI wallet has built-in help for individual commands - we will not attempt to reproduce that. Instead we focus on grouping commands so you can quickly find what you are looking for. Use help command_name to learn more. Help and version \u00b6 help - list all commands help command_name - show help for individual command version - show version of the monero-wallet-cli binary Network status \u00b6 status - show if synced up to the blockchain height fee - show current fee-per-byte and full node's mempool (the backlog of transactions depending on the priority) wallet_info - show wallet file path, standard address, type and network Balance \u00b6 account - total balance; list accounts with respective balances balance detail - within the current account, list addresses with respective balances refresh - force refresh the balance and transactions by pulling latest blocks from the full node; this is often useful because auto-refresh only kicks in once in 90 seconds Manage accounts \u00b6 account account new account switch account label Manage addresses \u00b6 address all address new address label View transactions \u00b6 show_transfers - show all transactions on the current account; optionally provide a filter: in | out | pending | failed | pool | coinbase ; optionally provide subaddress index for output selection show_transfer <txid> - show details of specific transaction incoming_transfers [available|unavailable] [verbose] [index=<N1>[,<N2>[,...]]] - show the incoming transactions, all or filtered by availability and address index within current account; this will only show confirmed transactions; you will not see transactions awaiting in the mempool get_tx_note <txid> - get a string note for transaction id Keys and Passwords \u00b6 Secret mnemonic seed \u00b6 seed - show raw mnemonic seed encrypted_seed - create mnemonic seed encrypted with the passphrase; you will need to remember or store the passphrase separately; restoring will not be possible without the passphrase Secret keys \u00b6 spendkey - show secret spend key and public spend key viewkey - show secret view key and public view key Wallet password \u00b6 password - change wallet password; this password is used to encrypt the local wallet files; it does not change secret keys or backups Proofs \u00b6 get_reserve_proof -> check_reserve_proof - prove the balance get_spend_proof -> check_spend_proof - prove you made the payment sign <file> -> verify <filename> <address> <signature> - prove ownership of the address; allows to verify the file was signed by the owner of specific Monero address get_tx_proof -> check_tx_proof Multisig \u00b6 Setup \u00b6 prepare_multisig make_multisig finalize_multisig Update \u00b6 export_multisig_info import_multisig_info Other \u00b6 submit_multisig exchange_multisig_keys export_raw_multisig_tx sign_multisig <filename> Hardware wallet \u00b6 hw_reconnect - attempts to reconnect HW wallet Mining \u00b6 start_mining stop_mining Advanced \u00b6 Outputs \u00b6 unspent_outputs - show a list of, and a histogram of unspent outputs (indivisible pieces of your total balance) export_outputs <file> -> import_outputs <file> - helps with cold spending; export outputs from a view-wallet to the cold-wallet to make it aware of what had been sent to it mark_output_spent <amount>/<offset> | <filename> [add] mark_output_unspent <amount>/<offset> is_output_spent <amount>/<offset> Key images \u00b6 export_key_images <file> -> import_key_images <file> - used to inform the view-only wallet about outgoing transactions so it can calculate the real balance; normally view-only wallets only learn about incoming transactions, not outgoing Tx private key \u00b6 These allow to learn and verify transaction's private key r . This was useful to create a proof of payment but got superseded by get_spend_proof . get_tx_key <txid> check_tx_key <txid> <txkey> <address> set_tx_key <txid> <tx_key> Debugging \u00b6 rescan_spent - rescan the blockchain for spent outputs; sometimes, the wallet's idea of what outputs are spent and what outputs are not get out of sync with the blockchain. This can happen if you exit the wallet without saving after sending a tx, or if it crashes. This will look for the key images on the blockchain to make sure it's up to date. Cosmetics \u00b6 donate <amount> - donate <amount> to development team address_book [(add ((<address> [pid <id>])|<integrated address>) [<description possibly with whitespaces>])|(delete <index>)] set_description [free text note] -> get_description - manage convenience description of the wallet (the information is local) Legacy \u00b6 save - this now happens automatically save_bc - this now happens automatically bc_height - show blockchain height (superseded with status ) sweep_unmixable - only relevant for very old wallets (<= 2016); send all unmixable outputs to yourself with ring_size 10 locked_sweep_all - see rescan_bc - rescan the blockchain from scratch, losing any information which can not be recovered from the blockchain itself TODO: document remaining commands","title":"monero-wallet-cli"},{"location":"interacting/monero-wallet-cli-reference/#monero-wallet-cli-reference","text":"Note Get yourself comfortable with a friendly Monero CLI wallet. It is the most reliable and most complete wallet for Monero. Use stagenet for learning.","title":"monero-wallet-cli - Reference"},{"location":"interacting/monero-wallet-cli-reference/#overview","text":"","title":"Overview"},{"location":"interacting/monero-wallet-cli-reference/#command-line-wallet","text":"The \"official\" command line wallet for Monero. Available for Linux, macOS and Windows. Wallet uses your private keys to understand your total balance, transactions history, and to facilitate creating transactions. However, wallet does not store the blockchain and does not directly participate in the p2p network. The CLI wallet is the most reliable and most feature complete wallet for Monero.","title":"Command line wallet"},{"location":"interacting/monero-wallet-cli-reference/#depends-on-the-full-node","text":"Wallet connects to a full node to scan the blockchain for your transaction outputs and to send your transactions out to the network. The full node can be either local (same computer) or remote. Normally, you run the full node on the same computer as wallet (or within your home network). Connection happens over HTTP and uses this API . Any transaction leaving the wallet is already blinded by all Monero privacy features. This means plain text HTTP communication isn't an issue on its own even if you connect to a remote node. However, connecting to a remote node has other nuanced trade-offs, which is a topic for a separate article.","title":"Depends on the full node"},{"location":"interacting/monero-wallet-cli-reference/#syntax","text":"./monero-wallet-cli [options] [command] Example: ./monero-wallet-cli --stagenet","title":"Syntax"},{"location":"interacting/monero-wallet-cli-reference/#running","text":"Go to directory where you unpacked Monero. Run the full node and wait until it syncs up with the network (may take up to a few days): ./monerod --stagenet In a separate terminal window, run the wallet: ./monero-wallet-cli --stagenet --generate-new-wallet MoneroExampleStagenetWallet","title":"Running"},{"location":"interacting/monero-wallet-cli-reference/#options","text":"","title":"Options"},{"location":"interacting/monero-wallet-cli-reference/#help-and-version","text":"Option Description --help Enlist available options. --version Show monero-wallet-cli version to stdout. Example: Monero 'Boron Butterfly' (v0.14.0.0-release)","title":"Help and version"},{"location":"interacting/monero-wallet-cli-reference/#pick-network","text":"Option Description (missing) By default wallet assumes mainnet . --stagenet Run on stagenet . Remember to run your daemon with --stagenet as well. --testnet Run on testnet . Remember to run your daemon with --testnet as well.","title":"Pick network"},{"location":"interacting/monero-wallet-cli-reference/#logging","text":"Option Description --log-file <arg> Full path to the log file. --log-level <arg> 0-4 with 0 being minimal logging and 4 being full tracing. Defaults to 0 . These are general presets and do not directly map to severity levels. For example, even with minimal 0 , you may see some most important INFO entries. --max-log-file-size <arg> Soft limit in bytes for the log file (=104850000 by default, which is just under 100MB). Once log file grows past that limit, monero creates the next log file with a UTC timestamp postfix -YYYY-MM-DD-HH-MM-SS . In production deployments, you would probably prefer to use established solutions like logrotate instead. In that case, set --max-log-file-size 0 to prevent monero from managing the log files. --max-log-files <arg> Limit on the number of log files (=50 by default). The oldest log files are removed. In production deployments, you would probably prefer to use established solutions like logrotate instead.","title":"Logging"},{"location":"interacting/monero-wallet-cli-reference/#full-node-connection","text":"Wallet depends on a full node for all non-local operations. The following options define how to connect to monerod : Option Description --daemon-address <arg> Use monerod instance at <host>:<port> . Example: ./monero-wallet-cli --daemon-address monero-stagenet.exan.tech:38081 --stagenet --daemon-host <arg> Use monerod instance at host <arg> instead of localhost. --daemon-port <arg> Use monerod instance at port <arg> instead of 18081. --daemon-login <arg> Specify username[:password] for monerod RPC API. It is based on HTTP Basic Auth. Mind that connections are by default unencrypted. Authentication only makes sense if you establish a secure connection (maybe via Tor, or SSH tunneling, or reverse proxy w/ TLS). --trusted-daemon Enable commands and behaviors which rely on monerod instance being trusted. Default for localhost connection. The trust in this context concerns preserving your privacy. Only use this flag if you do control monerod . Trusted daemon allows for commands like rescan_spent , start_mining , import_key_images and behaviors like not warning about potential attack on transient problems with transaction sending. --untrusted-daemon Disable commands and behaviors which rely on monerod instance being trusted. Default for a non-localhost connections. See --trusted-daemon for more details. --do-not-relay The newly created transaction will not be relayed to the Monero network. Instead it will be dumped to a file in a raw hexadecimal format. Useful if you want to push the transaction through a gateway like https://xmrchain.net/rawtx . This may be easier to use over Tor than Monero wallet. --allow-mismatched-daemon-version Allow communicating with monerod that uses a different RPC version.","title":"Full node connection"},{"location":"interacting/monero-wallet-cli-reference/#create-new-wallet","text":"Option Description --generate-new-wallet <arg> Create a new Monero wallet and save it to <arg> file. You will be asked for a password. The password is used to encrypt the wallet file but it is unrelated to your master spend key or mnemonic seed. Generate a very strong password with your password manager (~256 bits of entropy). Example: ./monero-wallet-cli --stagenet --generate-new-wallet $HOME/.bitmonero/stagenet/wallets/MoneroExampleStagenetWallet --kdf-rounds <arg> Concerns encrypting the wallet file. The wallet file is encrypted with ChaCha stream cipher. The encryption key is derived from the user supplied password by hashing the password with CryptoNight. This option defines how many times the CryptoNight hashing will be applied. The default is 1 round of hashing. Note this is unrelated to spend key generation. The more rounds the longer you will wait to open the wallet or send transaction. But also the attacker will have it harder to brute force your wallet password. Note: You will have to remember and provide the same kdf-rounds on every wallet access! Recommendation: Do not change the default value. Instead generate a very strong wallet password with your password manager (256 bits of entropy).","title":"Create new wallet"},{"location":"interacting/monero-wallet-cli-reference/#open-existing-wallet","text":"Option Description --wallet-file <arg> Open existing wallet. Example: ./monero-wallet-cli --stagenet --wallet-file $HOME/.bitmonero/stagenet/wallets/MoneroExampleStagenetWallet This is only for wallet files generated with monero-wallet-cli , monero-wallet-gui , or monero-wallet-rpc tools. If you have other type of wallet then see importing options. --password <arg> Provide wallet password as a parameter instead of interactively. Remember to escape/quote as needed. Not recommended because the password will remain in your command history and will also be visible in the process table. For automation prefer --password-file . The option also works in combination with --generate-new-wallet . --password-file <arg> Provide password as a file in stead of interactively. Trailing \\n are discarded when reading the password file. Prefer this over --password if you automate wallet access. Make sure the password file is meaningfully separated from the wallet file. Otherwise it provides no security benefit. The option also works in combination with --generate-new-wallet .","title":"Open existing wallet"},{"location":"interacting/monero-wallet-cli-reference/#restore-wallet","text":"Option Description --generate-from-device <arg> Restore/generate a special wallet to work with a hardware device like Ledger or Trezor and save it to <arg> file. Example: ./monero-wallet-cli --stagenet --generate-from-device MoneroExampleDeviceWallet --subaddress-lookahead 5:20 This is a one-time action. Next time you simply open the wallet . By default the command expects Ledger hardware connected. For Trezor hardware add --hw-device Trezor (expected ~May 2019). It will take up to 25 minutes with default settings. This is because hardware devices are slow to pre-generate subaddresses. To mitigate use low --subaddress-lookahead 5:20 . The local wallet will not have private spend key and will not be able to spend on its own. It serves as a user interface and a bridge for low-power hardware devices. Transaction signing with a private spend key always happens on the hardware device. See the complete guide to hardware wallet setup . --generate-from-view-key <arg> Restore a view-only version of the wallet to track incoming transactions and save it to <arg> file. The wallet is created based on a secret view key and standard address . The secret view key is meant to be pasted as hexadecimal. --generate-from-spend-key <arg> Restore a wallet from secret spend key and save it to <arg> file. The secret spend key is meant to be pasted as hexadecimal. --restore-deterministic-wallet Restore a wallet from secret mnemonic seed . Use this to restore from your 25 words backup. You will be asked for a password to encrypt the wallet file (once restored). Note this is not a passphrase to mnemonic seed. Mnemonic seeds generated by Monero official wallets are naked. --restore-height <arg> Only scan for transactions later than specific blockchain height. The default is 0 . Raising the value makes wallet restoration radically faster . The optimal value should match the day you originally created the wallet (but cannot be later). The mapping between the block height and date/time is available on block explorers like https://xmrchain.net . For instance, if you created the wallet in 2019+ use 1730000 .","title":"Restore wallet"},{"location":"interacting/monero-wallet-cli-reference/#multisig-wallet","text":"Option Description --generate-from-multisig-keys <arg> Create a standard wallet from multisig keys. This is useful to combine all multisig secret keys back into the standard wallet (when you no longer need the multisig). The wallet will then have control of the funds. It only supports providing all secret keys even if the multisig scheme allowed for less (only N/N not N/M ). --restore-multisig-wallet Restore a multisig wallet from secret seed that was earlier exported with the seed interactive command. This only restores your part of the wallet. Other multisig participants will still be necessary to sign the transaction.","title":"Multisig wallet"},{"location":"interacting/monero-wallet-cli-reference/#config-file","text":"Option Description --config-file <arg> Full path to the configuration file . Note this should be a separate config than monerod uses because these tools accept different set of options.","title":"Config file"},{"location":"interacting/monero-wallet-cli-reference/#performance","text":"Option Description --subaddress-lookahead <arg> Accepts m:n , by default 50:200 . The first value is the number of accounts and the second value is the number of subaddresses per account. The wallet will not check for payments to subaddresses further than n away from the last received payment. This can happen if you generated unique subaddresses for n clients in a row but none of them paid. On the other hand the more subaddresses you set to look ahead, the longer it takes to create your wallet, because they must be pre-computed. This is normally not a concern, except for hardware wallets. On the Ledger the default value of 50:200 can take over 20 minutes (one time on wallet creation)! --max-concurrency <arg> Max number of threads to use for parallel jobs. The default value 0 uses the number of CPU threads.","title":"Performance"},{"location":"interacting/monero-wallet-cli-reference/#internationalization","text":"Option Description --mnemonic-language <arg> Language for mnemonic seed words. One of english , english_old , esperanto , french , german , italian , japanese , lojban , portuguese , russian , spanish . It might be a good idea to stick to default English which is by far the most popular and well tested. It also avoids potential non-ASCII characters pitfalls or bugs. --use-english-language-names If your display freezes, exit blind with ^C, then run again with --use-english-language-names . This can happen when Monero prompts for a language displaying language names in their natives alphabets.","title":"Internationalization"},{"location":"interacting/monero-wallet-cli-reference/#legacy","text":"These options are either legacy or rarely useful. Option Description --non-deterministic Generate legacy non-deterministic wallet. The view key will not be derived from the spend key. You would also have to backup the .keys. To restore non-deterministic wallet (standard address) use --generate-from-keys . To restore fully you will need the .keys file. --generate-from-keys <arg> Restore legacy non-deterministic wallet by providing both spend and view keys and the standard address. --shared-ringdb-dir <arg> Set shared ring database path. No longer worthwhile . --create-address-file Has no effect. The *.address.txt file is created regardless of this option. --electrum-seed <arg> Provide mnemonic seed as a commandline option for --restore-deterministic-wallet instead of interactively. This is not recommended b/c the seed will be saved in your command history and also visible in the process list. --generate-from-json <arg> You would run monero-wallet-rpc to use this option. It seems exposed in monero-wallet-cli by accident. --tx-notify <arg> You would run monero-wallet-rpc to use this option. It seems exposed in monero-wallet-cli by accident.","title":"Legacy"},{"location":"interacting/monero-wallet-cli-reference/#defaults","text":"Wallet files are created and seek in current directory. This is rarely what you want. Use --wallet-file and similar options to control this. Log files are created in the same directory as monero-wallet-cli binary. Use --log-file to specify the location.","title":"Defaults"},{"location":"interacting/monero-wallet-cli-reference/#commands","text":"Commands are used interactively in the monero-wallet-cli prompt. You can also run a one-off command by providing it as a commandline parameter. This is rarely useful though. For automation prefer monero-wallet-rpc . The CLI wallet has built-in help for individual commands - we will not attempt to reproduce that. Instead we focus on grouping commands so you can quickly find what you are looking for. Use help command_name to learn more.","title":"Commands"},{"location":"interacting/monero-wallet-cli-reference/#help-and-version_1","text":"help - list all commands help command_name - show help for individual command version - show version of the monero-wallet-cli binary","title":"Help and version"},{"location":"interacting/monero-wallet-cli-reference/#network-status","text":"status - show if synced up to the blockchain height fee - show current fee-per-byte and full node's mempool (the backlog of transactions depending on the priority) wallet_info - show wallet file path, standard address, type and network","title":"Network status"},{"location":"interacting/monero-wallet-cli-reference/#balance","text":"account - total balance; list accounts with respective balances balance detail - within the current account, list addresses with respective balances refresh - force refresh the balance and transactions by pulling latest blocks from the full node; this is often useful because auto-refresh only kicks in once in 90 seconds","title":"Balance"},{"location":"interacting/monero-wallet-cli-reference/#manage-accounts","text":"account account new account switch account label","title":"Manage accounts"},{"location":"interacting/monero-wallet-cli-reference/#manage-addresses","text":"address all address new address label","title":"Manage addresses"},{"location":"interacting/monero-wallet-cli-reference/#view-transactions","text":"show_transfers - show all transactions on the current account; optionally provide a filter: in | out | pending | failed | pool | coinbase ; optionally provide subaddress index for output selection show_transfer <txid> - show details of specific transaction incoming_transfers [available|unavailable] [verbose] [index=<N1>[,<N2>[,...]]] - show the incoming transactions, all or filtered by availability and address index within current account; this will only show confirmed transactions; you will not see transactions awaiting in the mempool get_tx_note <txid> - get a string note for transaction id","title":"View transactions"},{"location":"interacting/monero-wallet-cli-reference/#keys-and-passwords","text":"","title":"Keys and Passwords"},{"location":"interacting/monero-wallet-cli-reference/#secret-mnemonic-seed","text":"seed - show raw mnemonic seed encrypted_seed - create mnemonic seed encrypted with the passphrase; you will need to remember or store the passphrase separately; restoring will not be possible without the passphrase","title":"Secret mnemonic seed"},{"location":"interacting/monero-wallet-cli-reference/#secret-keys","text":"spendkey - show secret spend key and public spend key viewkey - show secret view key and public view key","title":"Secret keys"},{"location":"interacting/monero-wallet-cli-reference/#wallet-password","text":"password - change wallet password; this password is used to encrypt the local wallet files; it does not change secret keys or backups","title":"Wallet password"},{"location":"interacting/monero-wallet-cli-reference/#proofs","text":"get_reserve_proof -> check_reserve_proof - prove the balance get_spend_proof -> check_spend_proof - prove you made the payment sign <file> -> verify <filename> <address> <signature> - prove ownership of the address; allows to verify the file was signed by the owner of specific Monero address get_tx_proof -> check_tx_proof","title":"Proofs"},{"location":"interacting/monero-wallet-cli-reference/#multisig","text":"","title":"Multisig"},{"location":"interacting/monero-wallet-cli-reference/#setup","text":"prepare_multisig make_multisig finalize_multisig","title":"Setup"},{"location":"interacting/monero-wallet-cli-reference/#update","text":"export_multisig_info import_multisig_info","title":"Update"},{"location":"interacting/monero-wallet-cli-reference/#other","text":"submit_multisig exchange_multisig_keys export_raw_multisig_tx sign_multisig <filename>","title":"Other"},{"location":"interacting/monero-wallet-cli-reference/#hardware-wallet","text":"hw_reconnect - attempts to reconnect HW wallet","title":"Hardware wallet"},{"location":"interacting/monero-wallet-cli-reference/#mining","text":"start_mining stop_mining","title":"Mining"},{"location":"interacting/monero-wallet-cli-reference/#advanced","text":"","title":"Advanced"},{"location":"interacting/monero-wallet-cli-reference/#outputs","text":"unspent_outputs - show a list of, and a histogram of unspent outputs (indivisible pieces of your total balance) export_outputs <file> -> import_outputs <file> - helps with cold spending; export outputs from a view-wallet to the cold-wallet to make it aware of what had been sent to it mark_output_spent <amount>/<offset> | <filename> [add] mark_output_unspent <amount>/<offset> is_output_spent <amount>/<offset>","title":"Outputs"},{"location":"interacting/monero-wallet-cli-reference/#key-images","text":"export_key_images <file> -> import_key_images <file> - used to inform the view-only wallet about outgoing transactions so it can calculate the real balance; normally view-only wallets only learn about incoming transactions, not outgoing","title":"Key images"},{"location":"interacting/monero-wallet-cli-reference/#tx-private-key","text":"These allow to learn and verify transaction's private key r . This was useful to create a proof of payment but got superseded by get_spend_proof . get_tx_key <txid> check_tx_key <txid> <txkey> <address> set_tx_key <txid> <tx_key>","title":"Tx private key"},{"location":"interacting/monero-wallet-cli-reference/#debugging","text":"rescan_spent - rescan the blockchain for spent outputs; sometimes, the wallet's idea of what outputs are spent and what outputs are not get out of sync with the blockchain. This can happen if you exit the wallet without saving after sending a tx, or if it crashes. This will look for the key images on the blockchain to make sure it's up to date.","title":"Debugging"},{"location":"interacting/monero-wallet-cli-reference/#cosmetics","text":"donate <amount> - donate <amount> to development team address_book [(add ((<address> [pid <id>])|<integrated address>) [<description possibly with whitespaces>])|(delete <index>)] set_description [free text note] -> get_description - manage convenience description of the wallet (the information is local)","title":"Cosmetics"},{"location":"interacting/monero-wallet-cli-reference/#legacy_1","text":"save - this now happens automatically save_bc - this now happens automatically bc_height - show blockchain height (superseded with status ) sweep_unmixable - only relevant for very old wallets (<= 2016); send all unmixable outputs to yourself with ring_size 10 locked_sweep_all - see rescan_bc - rescan the blockchain from scratch, losing any information which can not be recovered from the blockchain itself TODO: document remaining commands","title":"Legacy"},{"location":"interacting/monero-wallet-gui-reference/","text":"monero-wallet-gui - Reference \u00b6 Overview \u00b6 Desktop GUI wallet \u00b6 The \"official\" desktop wallet for Monero. Available for Linux, macOS and Windows. Wallet uses your private keys to understand your total balance, transactions history, and to facilitate creating transactions. However, wallet does not store the blockchain and does not directly participate in the p2p network. Depends on the full node \u00b6 Wallet connects to a full node to scan the blockchain for your transaction outputs and to send your transactions out to the network. The full node can be either local (same computer) or remote. Normally, you run the full node on the same computer as wallet (or within your home network). Connection happens over HTTP and uses this API . Any transaction leaving the wallet is already blinded by all Monero privacy features. This means plain text HTTP communication isn't an issue on its own even if you connect to a remote node. However, connecting to a remote node has other nuanced trade-offs, which is a topic for a separate article. User guide PDF \u00b6 A nice PDF guide is available in the catalog you unpacked Monero. Make sure to check it out! The online living version is also available: https://github.com/monero-ecosystem/monero-GUI-guide/blob/master/monero-GUI-guide.md Syntax \u00b6 ./monero-wallet-gui [options] Example: ./monero-wallet-gui --log-file=/dev/null Running \u00b6 Go to directory where you unpacked Monero. Run the full node and wait until it syncs up with the network (may take up to a few days): ./monerod In a separate terminal window, run the wallet: ./monero-wallet-gui Options \u00b6 There are very few options because everything is set up via a GUI. Option Description --help Enlists available options. --log-file Full path to the log file. Example (mind file permissions): ./monerod --log-file=/var/log/monero/mainnet/monerod.log Defaults \u00b6 The wallet is created in $HOME/Monero/wallets/ . You may want to change it to $HOME/.bitmonero/wallets/ to have all Monero related files in one place. This is possible on wallet creation wizard in the GUI. The log file is created directly in the home directory $HOME/monero-wallet-gui.log . You may want to change with --log-file=$HOME/.bitmonero/monero-wallet-gui.log option.","title":"monero-wallet-gui"},{"location":"interacting/monero-wallet-gui-reference/#monero-wallet-gui-reference","text":"","title":"monero-wallet-gui - Reference"},{"location":"interacting/monero-wallet-gui-reference/#overview","text":"","title":"Overview"},{"location":"interacting/monero-wallet-gui-reference/#desktop-gui-wallet","text":"The \"official\" desktop wallet for Monero. Available for Linux, macOS and Windows. Wallet uses your private keys to understand your total balance, transactions history, and to facilitate creating transactions. However, wallet does not store the blockchain and does not directly participate in the p2p network.","title":"Desktop GUI wallet"},{"location":"interacting/monero-wallet-gui-reference/#depends-on-the-full-node","text":"Wallet connects to a full node to scan the blockchain for your transaction outputs and to send your transactions out to the network. The full node can be either local (same computer) or remote. Normally, you run the full node on the same computer as wallet (or within your home network). Connection happens over HTTP and uses this API . Any transaction leaving the wallet is already blinded by all Monero privacy features. This means plain text HTTP communication isn't an issue on its own even if you connect to a remote node. However, connecting to a remote node has other nuanced trade-offs, which is a topic for a separate article.","title":"Depends on the full node"},{"location":"interacting/monero-wallet-gui-reference/#user-guide-pdf","text":"A nice PDF guide is available in the catalog you unpacked Monero. Make sure to check it out! The online living version is also available: https://github.com/monero-ecosystem/monero-GUI-guide/blob/master/monero-GUI-guide.md","title":"User guide PDF"},{"location":"interacting/monero-wallet-gui-reference/#syntax","text":"./monero-wallet-gui [options] Example: ./monero-wallet-gui --log-file=/dev/null","title":"Syntax"},{"location":"interacting/monero-wallet-gui-reference/#running","text":"Go to directory where you unpacked Monero. Run the full node and wait until it syncs up with the network (may take up to a few days): ./monerod In a separate terminal window, run the wallet: ./monero-wallet-gui","title":"Running"},{"location":"interacting/monero-wallet-gui-reference/#options","text":"There are very few options because everything is set up via a GUI. Option Description --help Enlists available options. --log-file Full path to the log file. Example (mind file permissions): ./monerod --log-file=/var/log/monero/mainnet/monerod.log","title":"Options"},{"location":"interacting/monero-wallet-gui-reference/#defaults","text":"The wallet is created in $HOME/Monero/wallets/ . You may want to change it to $HOME/.bitmonero/wallets/ to have all Monero related files in one place. This is possible on wallet creation wizard in the GUI. The log file is created directly in the home directory $HOME/monero-wallet-gui.log . You may want to change with --log-file=$HOME/.bitmonero/monero-wallet-gui.log option.","title":"Defaults"},{"location":"interacting/monero-wallet-rpc-reference/","text":"monero-wallet-rpc - Reference \u00b6 Introduction \u00b6 This is a list of the monero-wallet-rpc calls, their inputs and outputs, and examples of each. The program monero-wallet-rpc replaced the rpc interface that was in simplewallet and then monero-wallet-cli. All monero-wallet-rpc methods use the same JSON RPC interface. For example: IP = 127 .0.0.1 PORT = 18082 METHOD = \"make_integrated_address\" PARAMS = \"{\\\"payment_id\\\":\\\"1234567890123456789012345678900012345678901234567890123456789000\\\"}\" curl \\ -X POST http:// $IP : $PORT /json_rpc \\ -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"' $METHOD '\",\"params\":' \" $PARAMS \" '}' \\ -H 'Content-Type: application/json' If the monero-wallet-rpc was executed with the --rpc-login argument as username:password , then follow this example: IP = 127 .0.0.1 PORT = 18082 METHOD = \"make_integrated_address\" PARAMS = \"{\\\"payment_id\\\":\\\"1234567890123456789012345678900012345678901234567890123456789000\\\"}\" curl \\ -u username:password --digest \\ -X POST http:// $IP : $PORT /json_rpc \\ -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"' $METHOD '\",\"params\":' \" $PARAMS \" '}' \\ -H 'Content-Type: application/json' Note: \"atomic units\" refer to the smallest fraction of 1 XMR according to the monerod implementation. 1 XMR = 1e12 atomic units. Index of JSON RPC Methods: \u00b6 add_address_book change_wallet_password check_reserve_proof check_spend_proof check_tx_key check_tx_proof close_wallet create_account create_address create_wallet delete_address_book export_key_images export_multisig_info export_outputs finalize_multisig get_accounts get_account_tags get_address_book get_address get_address_index get_attribute get_balance get_bulk_payments get_height get_languages get_payments get_reserve_proof get_spend_proof get_transfer_by_txid get_transfers get_tx_key get_tx_notes get_tx_proof get_version import_key_images import_multisig_info import_outputs incoming_transfers is_multisig label_account label_address make_integrated_address make_multisig make_uri open_wallet parse_uri prepare_multisig query_key refresh relay_tx rescan_blockchain rescan_spent set_account_tag_description set_attribute set_tx_notes sign_multisig sign sign_transfer split_integrated_address start_mining stop_mining stop_wallet store submit_multisig submit_transfer sweep_all sweep_dust sweep_single tag_accounts transfer_split transfer untag_accounts verify JSON RPC Methods: \u00b6 add_address_book \u00b6 Add an entry to the address book. Alias: None . Inputs: address - string; payment_id - (optional) string, defaults to \"0000000000000000000000000000000000000000000000000000000000000000\"; description - (optional) string, defaults to \"\"; Outputs: index - unsigned int; The index of the address book entry. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"add_address_book\",\"params\":{\"address\":\"78P16M3XmFRGcWFCcsgt1WcTntA1jzcq31seQX1Eg92j8VQ99NPivmdKam4J5CKNAD7KuNWcq5xUPgoWczChzdba5WLwQ4j\",\"description\":\"Third account\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"index\" : 1 } } change_wallet_password \u00b6 Change a wallet password. Alias: None . Inputs: old_password - string; (Optional) Current wallet password, if defined. new_password - string; (Optional) New wallet password, if not blank. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"change_wallet_password\",\"params\":{\"old_password\":\"theCurrentSecretPassPhrase\",\"new_password\":\"theNewSecretPassPhrase\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { } } check_reserve_proof \u00b6 Proves a wallet has a disposable reserve using a signature. Alias: None . Inputs: address - string; Public address of the wallet. message - string; (Optional) Should be the same message used in get_reserve_proof . signature - string; reserve signature to confirm. Outputs: good - boolean; States if the inputs proves the reserve. In the example below, the reserve has been proven: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_reserve_proof\",\"params\":{\"address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\",\"signature\":\"ReserveProofV11BZ23sBt9sZJeGccf84mzyAmNCP3KzYbE1111112VKmH111118NfCYJQjZ6c46gT2kXgcHCaSSZeL8sRdzqjqx7i1e7FQfQGu2o113UYFVdwzHQi3iENDPa76Kn1BvywbKz3bMkXdZkBEEhBSF4kjjGaiMJ1ucKb6wvMVC4A8sA4nZEdL2Mk3wBucJCYTZwKqA8i1M113kqakDkG25FrjiDqdQTCYz2wDBmfKxF3eQiV5FWzZ6HmAyxnqTWUiMWukP9A3Edy3ZXqjP1b23dhz7Mbj39bBxe3ZeDNu9HnTSqYvHNRyqCkeUMJpHyQweqjGUJ1DSfFYr33J1E7MkhMnEi1o7trqWjVix32XLetYfePG73yvHbS24837L7Q64i5n1LSpd9yMiQZ3Dyaysi5y6jPx7TpAvnSqBFtuCciKoNzaXoA3dqt9cuVFZTXzdXKqdt3cXcVJMNxY8RvKPVQHhUur94Lpo1nSpxf7BN5a5rHrbZFqoZszsZmiWikYPkLX72XUdw6NWjLrTBxSy7KuPYH86c6udPEXLo2xgN6XHMBMBJzt8FqqK7EcpNUBkuHm2AtpGkf9CABY3oSjDQoRF5n4vNLd3qUaxNsG4XJ12L9gJ7GrK273BxkfEA8fDdxPrb1gpespbgEnCTuZHqj1A\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"good\" : true, \"spent\" : 0 , \"total\" : 100000000000 } } In the example below, all wallet reserve has been proven: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_reserve_proof\",\"params\":{\"address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\",\"message\":\"I have 10 at least\",\"signature\":\"...signature...\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"good\" : true, \"spent\" : 0 , \"total\" : 164113855714662789 } } In the example below, the wrong message is used, avoiding the reserve to be proved: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_spend_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"message\":\"wrong message\",\"signature\":\"SpendProofV1aSh8Todhk54736iXgV6vJAFP7egxByuMWZeyNDaN2JY737S95X5zz5mNMQSuCNSLjjhi5HJCsndpNWSNVsuThxwv285qy1KkUrLFRkxMSCjfL6bbycYN33ScZ5UB4Fzseceo1ndpL393T1q638VmcU3a56dhNHF1RPZFiGPS61FA78nXFSqE9uoKCCoHkEz83M1dQVhxZV5CEPF2P6VioGTKgprLCH9vvj9k1ivd4SX19L2VSMc3zD1u3mkR24ioETvxBoLeBSpxMoikyZ6inhuPm8yYo9YWyFtQK4XYfAV9mJ9knz5fUPXR8vvh7KJCAg4dqeJXTVb4mbMzYtsSZXHd6ouWoyCd6qMALdW8pKhgMCHcVYMWp9X9WHZuCo9rsRjRpg15sJUw7oJg1JoGiVgj8P4JeGDjnZHnmLVa5bpJhVCbMhyM7JLXNQJzFWTGC27TQBbthxCfQaKdusYnvZnKPDJWSeceYEFzepUnsWhQtyhbb73FzqgWC4eKEFKAZJqT2LuuSoxmihJ9acnFK7Ze23KTVYgDyMKY61VXADxmSrBvwUtxCaW4nQtnbMxiPMNnDMzeixqsFMBtN72j5UqhiLRY99k6SE7Qf5f29haNSBNSXCFFHChPKNTwJrehkofBdKUhh2VGPqZDNoefWUwfudeu83t85bmjv8Q3LrQSkFgFjRT5tLo8TMawNXoZCrQpyZrEvnodMDDUUNf3NL7rxyv3gM1KrTWjYaWXFU2RAsFee2Q2MTwUW7hR25cJvSFuB1BX2bfkoCbiMk923tHZGU2g7rSKF1GDDkXAc1EvFFD4iGbh1Q5t6hPRhBV8PEncdcCWGq5uAL5D4Bjr6VXG8uNeCy5oYWNgbZ5JRSfm7QEhPv8Fy9AKMgmCxDGMF9dVEaU6tw2BAnJavQdfrxChbDBeQXzCbCfep6oei6n2LZdE5Q84wp7eoQFE5Cwuo23tHkbJCaw2njFi3WGBbA7uGZaGHJPyB2rofTWBiSUXZnP2hiE9bjJghAcDm1M4LVLfWvhZmFEnyeru3VWMETnetz1BYLUC5MJGFXuhnHwWh7F6r74FDyhdswYop4eWPbyrXMXmUQEccTGd2NaT8g2VHADZ76gMC6BjWESvcnz2D4n8XwdmM7ZQ1jFwhuXrBfrb1dwRasyXxxHMGAC2onatNiExyeQ9G1W5LwqNLAh9hvcaNTGaYKYXoceVzLkgm6e5WMkLsCwuZXvB\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"good\" : false } } check_spend_proof \u00b6 Prove a spend using a signature. Unlike proving a transaction, it does not requires the destination public address. Alias: None . Inputs: txid - string; transaction id. message - string; (Optional) Should be the same message used in get_spend_proof . signature - string; spend signature to confirm. Outputs: good - boolean; States if the inputs proves the spend. In the example below, the spend has been proven: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_spend_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"message\":\"this is my transaction\",\"signature\":\"SpendProofV1aSh8Todhk54736iXgV6vJAFP7egxByuMWZeyNDaN2JY737S95X5zz5mNMQSuCNSLjjhi5HJCsndpNWSNVsuThxwv285qy1KkUrLFRkxMSCjfL6bbycYN33ScZ5UB4Fzseceo1ndpL393T1q638VmcU3a56dhNHF1RPZFiGPS61FA78nXFSqE9uoKCCoHkEz83M1dQVhxZV5CEPF2P6VioGTKgprLCH9vvj9k1ivd4SX19L2VSMc3zD1u3mkR24ioETvxBoLeBSpxMoikyZ6inhuPm8yYo9YWyFtQK4XYfAV9mJ9knz5fUPXR8vvh7KJCAg4dqeJXTVb4mbMzYtsSZXHd6ouWoyCd6qMALdW8pKhgMCHcVYMWp9X9WHZuCo9rsRjRpg15sJUw7oJg1JoGiVgj8P4JeGDjnZHnmLVa5bpJhVCbMhyM7JLXNQJzFWTGC27TQBbthxCfQaKdusYnvZnKPDJWSeceYEFzepUnsWhQtyhbb73FzqgWC4eKEFKAZJqT2LuuSoxmihJ9acnFK7Ze23KTVYgDyMKY61VXADxmSrBvwUtxCaW4nQtnbMxiPMNnDMzeixqsFMBtN72j5UqhiLRY99k6SE7Qf5f29haNSBNSXCFFHChPKNTwJrehkofBdKUhh2VGPqZDNoefWUwfudeu83t85bmjv8Q3LrQSkFgFjRT5tLo8TMawNXoZCrQpyZrEvnodMDDUUNf3NL7rxyv3gM1KrTWjYaWXFU2RAsFee2Q2MTwUW7hR25cJvSFuB1BX2bfkoCbiMk923tHZGU2g7rSKF1GDDkXAc1EvFFD4iGbh1Q5t6hPRhBV8PEncdcCWGq5uAL5D4Bjr6VXG8uNeCy5oYWNgbZ5JRSfm7QEhPv8Fy9AKMgmCxDGMF9dVEaU6tw2BAnJavQdfrxChbDBeQXzCbCfep6oei6n2LZdE5Q84wp7eoQFE5Cwuo23tHkbJCaw2njFi3WGBbA7uGZaGHJPyB2rofTWBiSUXZnP2hiE9bjJghAcDm1M4LVLfWvhZmFEnyeru3VWMETnetz1BYLUC5MJGFXuhnHwWh7F6r74FDyhdswYop4eWPbyrXMXmUQEccTGd2NaT8g2VHADZ76gMC6BjWESvcnz2D4n8XwdmM7ZQ1jFwhuXrBfrb1dwRasyXxxHMGAC2onatNiExyeQ9G1W5LwqNLAh9hvcaNTGaYKYXoceVzLkgm6e5WMkLsCwuZXvB\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"good\" : true } } In the example below, the wrong message is used, avoiding the spend to be proved: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_spend_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"message\":\"wrong message\",\"signature\":\"SpendProofV1aSh8Todhk54736iXgV6vJAFP7egxByuMWZeyNDaN2JY737S95X5zz5mNMQSuCNSLjjhi5HJCsndpNWSNVsuThxwv285qy1KkUrLFRkxMSCjfL6bbycYN33ScZ5UB4Fzseceo1ndpL393T1q638VmcU3a56dhNHF1RPZFiGPS61FA78nXFSqE9uoKCCoHkEz83M1dQVhxZV5CEPF2P6VioGTKgprLCH9vvj9k1ivd4SX19L2VSMc3zD1u3mkR24ioETvxBoLeBSpxMoikyZ6inhuPm8yYo9YWyFtQK4XYfAV9mJ9knz5fUPXR8vvh7KJCAg4dqeJXTVb4mbMzYtsSZXHd6ouWoyCd6qMALdW8pKhgMCHcVYMWp9X9WHZuCo9rsRjRpg15sJUw7oJg1JoGiVgj8P4JeGDjnZHnmLVa5bpJhVCbMhyM7JLXNQJzFWTGC27TQBbthxCfQaKdusYnvZnKPDJWSeceYEFzepUnsWhQtyhbb73FzqgWC4eKEFKAZJqT2LuuSoxmihJ9acnFK7Ze23KTVYgDyMKY61VXADxmSrBvwUtxCaW4nQtnbMxiPMNnDMzeixqsFMBtN72j5UqhiLRY99k6SE7Qf5f29haNSBNSXCFFHChPKNTwJrehkofBdKUhh2VGPqZDNoefWUwfudeu83t85bmjv8Q3LrQSkFgFjRT5tLo8TMawNXoZCrQpyZrEvnodMDDUUNf3NL7rxyv3gM1KrTWjYaWXFU2RAsFee2Q2MTwUW7hR25cJvSFuB1BX2bfkoCbiMk923tHZGU2g7rSKF1GDDkXAc1EvFFD4iGbh1Q5t6hPRhBV8PEncdcCWGq5uAL5D4Bjr6VXG8uNeCy5oYWNgbZ5JRSfm7QEhPv8Fy9AKMgmCxDGMF9dVEaU6tw2BAnJavQdfrxChbDBeQXzCbCfep6oei6n2LZdE5Q84wp7eoQFE5Cwuo23tHkbJCaw2njFi3WGBbA7uGZaGHJPyB2rofTWBiSUXZnP2hiE9bjJghAcDm1M4LVLfWvhZmFEnyeru3VWMETnetz1BYLUC5MJGFXuhnHwWh7F6r74FDyhdswYop4eWPbyrXMXmUQEccTGd2NaT8g2VHADZ76gMC6BjWESvcnz2D4n8XwdmM7ZQ1jFwhuXrBfrb1dwRasyXxxHMGAC2onatNiExyeQ9G1W5LwqNLAh9hvcaNTGaYKYXoceVzLkgm6e5WMkLsCwuZXvB\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"good\" : false } } check_tx_key \u00b6 Check a transaction in the blockchain with its secret key. Alias: None . Inputs: txid - string; transaction id. tx_key - string; transaction secret key. address - string; destination public address of the transaction. Outputs: confirmations - unsigned int; Number of block mined after the one with the transaction. in_pool - boolean; States if the transaction is still in pool or has been added to a block. received - unsigned int; Amount of the transaction. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_tx_key\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"tx_key\":\"feba662cf8fb6d0d0da18fc9b70ab28e01cc76311278fdd7fe7ab16360762b06\",\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"confirmations\" : 0 , \"in_pool\" : false, \"received\" : 1000000000000 } } check_tx_proof \u00b6 Prove a transaction by checking its signature. Alias: None . Inputs: txid - string; transaction id. address - string; destination public address of the transaction. message - string; (Optional) Should be the same message used in get_tx_proof . signature - string; transaction signature to confirm. Outputs: confirmations - unsigned int; Number of block mined after the one with the transaction. good - boolean; States if the inputs proves the transaction. in_pool - boolean; States if the transaction is still in pool or has been added to a block. received - unsigned int; Amount of the transaction. In the example below, the transaction has been proven: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_tx_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\",\"message\":\"this is my transaction\",\"signature\":\"InProofV13vqBCT6dpSAXkypZmSEMPGVnNRFDX2vscUYeVS4WnSVnV5BwLs31T9q6Etfj9Wts6tAxSAS4gkMeSYzzLS7Gt4vvCSQRh9niGJMUDJsB5hTzb2XJiCkUzWkkcjLFBBRVD5QZ\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"confirmations\" : 482 , \"good\" : true, \"in_pool\" : false, \"received\" : 1000000000000 } } In the example below, the wrong message is used, avoiding the transaction to be proved: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_tx_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\",\"message\":\"wrong message\",\"signature\":\"InProofV13vqBCT6dpSAXkypZmSEMPGVnNRFDX2vscUYeVS4WnSVnV5BwLs31T9q6Etfj9Wts6tAxSAS4gkMeSYzzLS7Gt4vvCSQRh9niGJMUDJsB5hTzb2XJiCkUzWkkcjLFBBRVD5QZ\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"confirmations\" : 0 , \"good\" : false, \"in_pool\" : false, \"received\" : 0 } } close_wallet \u00b6 Close the currently opened wallet, after trying to save it. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"close_wallet\"}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { } } create_account \u00b6 Create a new account with an optional label. Alias: None . Inputs: label - string; (Optional) Label for the account. Outputs: account_index - unsigned int; Index of the new account. address - string; Address for this account. Base58 representation of the public keys. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"create_account\",\"params\":{\"label\":\"Secondary account\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"account_index\" : 1 , \"address\" : \"77Vx9cs1VPicFndSVgYUvTdLCJEZw9h81hXLMYsjBCXSJfUehLa9TDW3Ffh45SQa7xb6dUs18mpNxfUhQGqfwXPSMrvKhVp\" } } create_address \u00b6 Create a new address for an account. Optionally, label the new address. Alias: None . Inputs: account_index - unsigned int; Create a new address for this account. label - string; (Optional) Label for the new address. Outputs: address - string; Newly created address. Base58 representation of the public keys. address_index - unsigned int; Index of the new address under the input account. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"create_address\",\"params\":{\"account_index\":0,\"label\":\"new-sub\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"address\" : \"7BG5jr9QS5sGMdpbBrZEwVLZjSKJGJBsXdZLt8wiXyhhLjy7x2LZxsrAnHTgD8oG46ZtLjUGic2pWc96GFkGNPQQDA3Dt7Q\" , \"address_index\" : 5 } } create_wallet \u00b6 Create a new wallet. You need to have set the argument \"\u2013wallet-dir\" when launching monero-wallet-rpc to make this work. Alias: None . Inputs: filename - string; Wallet file name. password - string; (Optional) password to protect the wallet. language - string; Language for your wallets' seed. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"create_wallet\",\"params\":{\"filename\":\"mytestwallet\",\"password\":\"mytestpassword\",\"language\":\"English\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { } } delete_address_book \u00b6 Delete an entry from the address book. Alias: None . Inputs: index - unsigned int; The index of the address book entry. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"delete_address_book\",\"params\":{\"index\":1}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { } } export_key_images \u00b6 Export a signed set of key images. Alias: None . Inputs: None . Outputs: signed_key_images - array of signed key images: key_image - string; signature - string; Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"export_key_images\"}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"signed_key_images\" : [{ \"key_image\" : \"cd35239b72a35e26a57ed17400c0b66944a55de9d5bda0f21190fed17f8ea876\" , \"signature\" : \"c9d736869355da2538ab4af188279f84138c958edbae3c5caf388a63cd8e780b8c5a1aed850bd79657df659422c463608ea4e0c730ba9b662c906ae933816d00\" } , { \"key_image\" : \"65158a8ee5a3b32009b85a307d85b375175870e560e08de313531c7dbbe6fc19\" , \"signature\" : \"c96e40d09dfc45cfc5ed0b76bfd7ca793469588bb0cf2b4d7b45ef23d40fd4036057b397828062e31700dc0c2da364f50cd142295a8405b9fe97418b4b745d0c\" } ,... ] } } export_multisig_info \u00b6 Export multisig info for other participants. Alias: None . Inputs: None . Outputs: info - string; Multisig info in hex format for other participants. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"export_multisig_info\"}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"info\" : \"4d6f6e65726f206d756c7469736967206578706f72740105cf6442b09b75f5eca9d846771fe1a879c9a97ab0553ffbcec64b1148eb7832b51e7898d7944c41cee000415c5a98f4f80dc0efdae379a98805bb6eacae743446f6f421cd03e129eb5b27d6e3b73eb6929201507c1ae706c1a9ecd26ac8601932415b0b6f49cbbfd712e47d01262c59980a8f9a8be776f2bf585f1477a6df63d6364614d941ecfdcb6e958a390eb9aa7c87f056673d73bc7c5f0ab1f74a682e902e48a3322c0413bb7f6fd67404f13fb8e313f70a0ce568c853206751a334ef490068d3c8ca0e\" } } export_outputs \u00b6 Export all outputs in hex format. Alias: None . Inputs: None . Outputs: outputs_data_hex - string; wallet outputs in hex format. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"export_outputs\"}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"outputs_data_hex\" : \"...outputs...\" } } finalize_multisig \u00b6 Turn this wallet into a multisig wallet, extra step for N-1/N wallets. Alias: None . Inputs: multisig_info - array of string; List of multisig string from peers. password - string; Wallet password Outputs: address - string; multisig wallet address. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"finalize_multisig\",\"params\":{\"multisig_info\":[\"MultisigxV1JNC6Ja2oBt5Sqea9LN2YEF7WYZCpHqr2EKvPG89Trf3X4E8RWkLaGRf29fJ3stU471MELKxwufNYeigP7LoE4tn2McPr4SbL9q15xNvZT5uwC9YRr7UwjXqSZHmTWN9PBuZEKVAQ4HPPyQciSCdNjgwsuFRBzrskMdMUwNMgKst1debYfm37i6PSzDoS2tk4kYTYj83kkAdR7kdshet1axQPd6HQ\",\"MultisigxV1Unma7Ko4zdd8Ps3Af4oZwtj2JdWKzwNfP6s2G9ZvXhMoSscwn5g7PyCfcBc1V4ffRHY3Kxqq6VocSCUTncpVeUskMcPr4SbL9q15xNvZT5uwC9YRr7UwjXqSZHmTWN9PBuZE1LTpWxLoC3vPMSrqVVcjnmL9LYfdCZz3fECjNZbCEDq3PHDiUuY5jurQTcNoGhDTio5WM9xaAdim9YByiS5KyqF4\"]}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"address\" : \"5B9gZUTDuHTcGGuY3nL3t8K2tDnEHeRVHSBQgLZUTQxtFYVLnho5JJjWJyFp5YZgZRQ44RiviJi1sPHgLVMbckRsDqDx1gV\" } } get_account_tags \u00b6 Get a list of user-defined account tags. Alias: None . Inputs: None . Outputs: account_tags - array of account tag information: tag - string; Filter tag. label - string; Label for the tag. accounts - array of int; List of tagged account indices. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_account_tags\",\"params\":\"\"}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"account_tags\" : [{ \"accounts\" : [ 0 ] , \"label\" : \"Test tag\" , \"tag\" : \"myTag\" }] } } get_accounts \u00b6 Get all accounts for a wallet. Optionally filter accounts by tag. Alias: None . Inputs: tag - string; (Optional) Tag for filtering accounts. Outputs: subaddress_accounts - array of subaddress account information: account_index - unsigned int; Index of the account. balance - unsigned int; Balance of the account (locked or unlocked). base_address - string; Base64 representation of the first subaddress in the account. label - string; (Optional) Label of the account. tag - string; (Optional) Tag for filtering accounts. unlocked_balance - unsigned int; Unlocked balance for the account. total_balance - unsigned int; Total balance of the selected accounts (locked or unlocked). total_unlocked_balance - unsigned int; Total unlocked balance of the selected accounts. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_accounts\",\"params\":{\"tag\":\"myTag\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"subaddress_accounts\" : [{ \"account_index\" : 0 , \"balance\" : 157663195572433688 , \"base_address\" : \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\" , \"label\" : \"Primary account\" , \"tag\" : \"myTag\" , \"unlocked_balance\" : 157443303037455077 } , { \"account_index\" : 1 , \"balance\" : 0 , \"base_address\" : \"77Vx9cs1VPicFndSVgYUvTdLCJEZw9h81hXLMYsjBCXSJfUehLa9TDW3Ffh45SQa7xb6dUs18mpNxfUhQGqfwXPSMrvKhVp\" , \"label\" : \"Secondary account\" , \"tag\" : \"myTag\" , \"unlocked_balance\" : 0 }] , \"total_balance\" : 157663195572433688 , \"total_unlocked_balance\" : 157443303037455077 } } get_address \u00b6 Return the wallet's addresses for an account. Optionally filter for specific set of subaddresses. Alias: getaddress . Inputs: account_index - unsigned int; Return subaddresses for this account. address_index - array of unsigned int; (Optional) List of subaddresses to return from an account. Outputs: address - string; The 95-character hex address string of the monero-wallet-rpc in session. addresses array of addresses informations address string; The 95-character hex (sub)address string. label string; Label of the (sub)address address_index unsigned int; index of the subaddress used boolean; states if the (sub)address has already received funds Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_address\",\"params\":{\"account_index\":0,\"address_index\":[0,1,4]}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"address\" : \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\" , \"addresses\" : [{ \"address\" : \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\" , \"address_index\" : 0 , \"label\" : \"Primary account\" , \"used\" : true } , { \"address\" : \"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\" , \"address_index\" : 1 , \"label\" : \"\" , \"used\" : true } , { \"address\" : \"77xa6Dha7kzCQuvmd8iB5VYoMkdenwCNRU9khGhExXQ8KLL3z1N1ZATBD1sFPenyHWT9cm4fVFnCAUApY53peuoZFtwZiw5\" , \"address_index\" : 4 , \"label\" : \"test2\" , \"used\" : true }] } } get_address_book \u00b6 Retrieves entries from the address book. Alias: None . Inputs: entries - array of unsigned int; indices of the requested address book entries Outputs: entries - array of entries: address - string; Public address of the entry description - string; Description of this address entry index - unsigned int; payment_id - string; Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_address_book\",\"params\":{\"entries\":[0,1]}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"entries\" : [{ \"address\" : \"77Vx9cs1VPicFndSVgYUvTdLCJEZw9h81hXLMYsjBCXSJfUehLa9TDW3Ffh45SQa7xb6dUs18mpNxfUhQGqfwXPSMrvKhVp\" , \"description\" : \"Second account\" , \"index\" : 0 , \"payment_id\" : \"0000000000000000000000000000000000000000000000000000000000000000\" } , { \"address\" : \"78P16M3XmFRGcWFCcsgt1WcTntA1jzcq31seQX1Eg92j8VQ99NPivmdKam4J5CKNAD7KuNWcq5xUPgoWczChzdba5WLwQ4j\" , \"description\" : \"Third account\" , \"index\" : 1 , \"payment_id\" : \"0000000000000000000000000000000000000000000000000000000000000000\" }] } } get_address_index \u00b6 Get account and address indexes from a specific (sub)address Alias: None . Inputs: address - String; (sub)address to look for. Outputs: index - subaddress informations major unsigned int; Account index. minor unsigned int; Address index. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_address_index\",\"params\":{\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"index\": { \"major\": 0, \"minor\": 1 } } } get_attribute \u00b6 Get attribute value by name. Alias: None . Inputs: key - string; attribute name Outputs: value - string; attribute value Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_attribute\",\"params\":{\"key\":\"my_attribute\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"value\": \"my_value\" } } get_bulk_payments \u00b6 Get a list of incoming payments using a given payment id, or a list of payments ids, from a given height. This method is the preferred method over get_payments because it has the same functionality but is more extendable. Either is fine for looking up transactions by a single payment ID. Alias: None . Inputs: payment_ids - array of: string; Payment IDs used to find the payments (16 characters hex). min_block_height - unsigned int; The block height at which to start looking for payments. Outputs: payments - list of: payment_id - string; Payment ID matching one of the input IDs. tx_hash - string; Transaction hash used as the transaction ID. amount - unsigned int; Amount for this payment. block_height - unsigned int; Height of the block that first confirmed this payment. unlock_time - unsigned int; Time (in block height) until this payment is safe to spend. subaddr_index - subaddress index: major - unsigned int; Account index for the subaddress. minor - unsigned int; Index of the subaddress in the account. address - string; Address receiving the payment; Base58 representation of the public keys. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_bulk_payments\",\"params\":{\"payment_ids\":[\"60900e5603bf96e3\"],\"min_block_height\":\"120000\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"payments\": [{ \"address\": \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\", \"amount\": 1000000000000, \"block_height\": 127606, \"payment_id\": \"60900e5603bf96e3\", \"subaddr_index\": { \"major\": 0, \"minor\": 0 }, \"tx_hash\": \"3292e83ad28fc1cc7bc26dbd38862308f4588680fbf93eae3e803cddd1bd614f\", \"unlock_time\": 0 }] } } get_height \u00b6 Returns the wallet's current block height. Alias: getheight . Inputs: None . Outputs: height - unsigned int; The current monero-wallet-rpc's blockchain height. If the wallet has been offline for a long time, it may need to catch up with the daemon. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_height\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"height\": 145545 } } get_languages \u00b6 Get a list of available languages for your wallet's seed. Alias: None . Inputs: None . Outputs: languages - array of string; List of available languages Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_languages\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"languages\": [\"Deutsch\",\"English\",\"Espa\u00f1ol\",\"Fran\u00e7ais\",\"Italiano\",\"Nederlands\",\"Portugu\u00eas\",\"\u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a\",\"\u65e5\u672c\u8a9e\",\"\u7b80\u4f53\u4e2d\u6587 (\u4e2d\u56fd)\",\"Esperanto\",\"Lojban\"] } } get_payments \u00b6 Get a list of incoming payments using a given payment id. Alias: None . Inputs: payment_id - string; Payment ID used to find the payments (16 characters hex). Outputs: payments - list of: payment_id - string; Payment ID matching the input parameter. tx_hash - string; Transaction hash used as the transaction ID. amount - unsigned int; Amount for this payment. block_height - unsigned int; Height of the block that first confirmed this payment. unlock_time - unsigned int; Time (in block height) until this payment is safe to spend. subaddr_index - subaddress index: major - unsigned int; Account index for the subaddress. minor - unsigned int; Index of the subaddress in the account. address - string; Address receiving the payment; Base58 representation of the public keys. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_payments\",\"params\":{\"payment_id\":\"60900e5603bf96e3\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"payments\": [{ \"address\": \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\", \"amount\": 1000000000000, \"block_height\": 127606, \"payment_id\": \"60900e5603bf96e3\", \"subaddr_index\": { \"major\": 0, \"minor\": 0 }, \"tx_hash\": \"3292e83ad28fc1cc7bc26dbd38862308f4588680fbf93eae3e803cddd1bd614f\", \"unlock_time\": 0 }] } } get_reserve_proof \u00b6 Generate a signature to prove of an available amount in a wallet. Alias: None . Inputs: all - boolean; Proves all wallet balance to be disposable. account_index - unsigned int; Specify the account from witch to prove reserve. (ignored if all is set to true) amount - unsigned int; Amount (in atomic units) to prove the account has for reserve. (ignored if all is set to true) message - string; (Optional) add a message to the signature to further authenticate the prooving process. Outputs: signature - string; reserve signature. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_reserve_proof\",\"params\":{\"all\":false,\"account_index\":0,\"amount\":100000000000}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"signature\": \"ReserveProofV11BZ23sBt9sZJeGccf84mzyAmNCP3KzYbE1111112VKmH111118NfCYJQjZ6c46gT2kXgcHCaSSZeL8sRdzqjqx7i1e7FQfQGu2o113UYFVdwzHQi3iENDPa76Kn1BvywbKz3bMkXdZkBEEhBSF4kjjGaiMJ1ucKb6wvMVC4A8sA4nZEdL2Mk3wBucJCYTZwKqA8i1M113kqakDkG25FrjiDqdQTCYz2wDBmfKxF3eQiV5FWzZ6HmAyxnqTWUiMWukP9A3Edy3ZXqjP1b23dhz7Mbj39bBxe3ZeDNu9HnTSqYvHNRyqCkeUMJpHyQweqjGUJ1DSfFYr33J1E7MkhMnEi1o7trqWjVix32XLetYfePG73yvHbS24837L7Q64i5n1LSpd9yMiQZ3Dyaysi5y6jPx7TpAvnSqBFtuCciKoNzaXoA3dqt9cuVFZTXzdXKqdt3cXcVJMNxY8RvKPVQHhUur94Lpo1nSpxf7BN5a5rHrbZFqoZszsZmiWikYPkLX72XUdw6NWjLrTBxSy7KuPYH86c6udPEXLo2xgN6XHMBMBJzt8FqqK7EcpNUBkuHm2AtpGkf9CABY3oSjDQoRF5n4vNLd3qUaxNsG4XJ12L9gJ7GrK273BxkfEA8fDdxPrb1gpespbgEnCTuZHqj1A\" } } get_spend_proof \u00b6 Generate a signature to prove a spend. Unlike proving a transaction, it does not requires the destination public address. Alias: None . Inputs: txid - string; transaction id. message - string; (Optional) add a message to the signature to further authenticate the prooving process. Outputs: signature - string; spend signature. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_spend_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"message\":\"this is my transaction\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"signature\": \"SpendProofV1aSh8Todhk54736iXgV6vJAFP7egxByuMWZeyNDaN2JY737S95X5zz5mNMQSuCNSLjjhi5HJCsndpNWSNVsuThxwv285qy1KkUrLFRkxMSCjfL6bbycYN33ScZ5UB4Fzseceo1ndpL393T1q638VmcU3a56dhNHF1RPZFiGPS61FA78nXFSqE9uoKCCoHkEz83M1dQVhxZV5CEPF2P6VioGTKgprLCH9vvj9k1ivd4SX19L2VSMc3zD1u3mkR24ioETvxBoLeBSpxMoikyZ6inhuPm8yYo9YWyFtQK4XYfAV9mJ9knz5fUPXR8vvh7KJCAg4dqeJXTVb4mbMzYtsSZXHd6ouWoyCd6qMALdW8pKhgMCHcVYMWp9X9WHZuCo9rsRjRpg15sJUw7oJg1JoGiVgj8P4JeGDjnZHnmLVa5bpJhVCbMhyM7JLXNQJzFWTGC27TQBbthxCfQaKdusYnvZnKPDJWSeceYEFzepUnsWhQtyhbb73FzqgWC4eKEFKAZJqT2LuuSoxmihJ9acnFK7Ze23KTVYgDyMKY61VXADxmSrBvwUtxCaW4nQtnbMxiPMNnDMzeixqsFMBtN72j5UqhiLRY99k6SE7Qf5f29haNSBNSXCFFHChPKNTwJrehkofBdKUhh2VGPqZDNoefWUwfudeu83t85bmjv8Q3LrQSkFgFjRT5tLo8TMawNXoZCrQpyZrEvnodMDDUUNf3NL7rxyv3gM1KrTWjYaWXFU2RAsFee2Q2MTwUW7hR25cJvSFuB1BX2bfkoCbiMk923tHZGU2g7rSKF1GDDkXAc1EvFFD4iGbh1Q5t6hPRhBV8PEncdcCWGq5uAL5D4Bjr6VXG8uNeCy5oYWNgbZ5JRSfm7QEhPv8Fy9AKMgmCxDGMF9dVEaU6tw2BAnJavQdfrxChbDBeQXzCbCfep6oei6n2LZdE5Q84wp7eoQFE5Cwuo23tHkbJCaw2njFi3WGBbA7uGZaGHJPyB2rofTWBiSUXZnP2hiE9bjJghAcDm1M4LVLfWvhZmFEnyeru3VWMETnetz1BYLUC5MJGFXuhnHwWh7F6r74FDyhdswYop4eWPbyrXMXmUQEccTGd2NaT8g2VHADZ76gMC6BjWESvcnz2D4n8XwdmM7ZQ1jFwhuXrBfrb1dwRasyXxxHMGAC2onatNiExyeQ9G1W5LwqNLAh9hvcaNTGaYKYXoceVzLkgm6e5WMkLsCwuZXvB\" } } get_transfer_by_txid \u00b6 Show information about a transfer to/from this address. Alias: None . Inputs: txid - string; Transaction ID used to find the transfer. account_index - unsigned int; (Optional) Index of the account to query for the transfer. Outputs: transfer - JSON object containing payment information: address - string; Address that transferred the funds. Base58 representation of the public keys. amount - unsigned int; Amount of this transfer. confirmations - unsigned int; Number of block mined since the block containing this transaction (or block height at which the transaction should be added to a block if not yet confirmed). destinations - array of JSON objects containing transfer destinations: amount - unsigned int; Amount transferred to this destination. address - string; Address for this destination. Base58 representation of the public keys. double_spend_seen - boolean; True if the key image(s) for the transfer have been seen before. fee - unsigned int; Transaction fee for this transfer. height - unsigned int; Height of the first block that confirmed this transfer. note - string; Note about this transfer. payment_id - string; Payment ID for this transfer. subaddr_index - JSON object containing the major & minor subaddress index: major - unsigned int; Account index for the subaddress. minor - unsigned int; Index of the subaddress under the account. suggested_confirmations_threshold - unsigned int; Estimation of the confirmations needed for the transaction to be included in a block. timestamp - unsigned int; POSIX timestamp for the block that confirmed this transfer (or timestamp submission if not mined yet). txid - string; Transaction ID of this transfer (same as input TXID). type - string; Type of transfer, one of the following: \"in\", \"out\", \"pending\", \"failed\", \"pool\" unlock_time - unsigned int; Number of blocks until transfer is safely spendable. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_transfer_by_txid\",\"params\":{\"txid\":\"c36258a276018c3a4bc1f195a7fb530f50cd63a4fa765fb7c6f7f49fc051762a\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"transfer\": { \"address\": \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\", \"amount\": 300000000000, \"confirmations\": 1, \"destinations\": [{ \"address\": \"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\", \"amount\": 100000000000 },{ \"address\": \"77Vx9cs1VPicFndSVgYUvTdLCJEZw9h81hXLMYsjBCXSJfUehLa9TDW3Ffh45SQa7xb6dUs18mpNxfUhQGqfwXPSMrvKhVp\", \"amount\": 200000000000 }], \"double_spend_seen\": false, \"fee\": 21650200000, \"height\": 153624, \"note\": \"\", \"payment_id\": \"0000000000000000\", \"subaddr_index\": { \"major\": 0, \"minor\": 0 }, \"suggested_confirmations_threshold\": 1, \"timestamp\": 1535918400, \"txid\": \"c36258a276018c3a4bc1f195a7fb530f50cd63a4fa765fb7c6f7f49fc051762a\", \"type\": \"out\", \"unlock_time\": 0 } } } get_transfers \u00b6 Returns a list of transfers. Alias: None . Inputs: in - boolean; (Optional) Include incoming transfers. out - boolean; (Optional) Include outgoing transfers. pending - boolean; (Optional) Include pending transfers. failed - boolean; (Optional) Include failed transfers. pool - boolean; (Optional) Include transfers from the daemon's transaction pool. filter_by_height - boolean; (Optional) Filter transfers by block height. min_height - unsigned int; (Optional) Minimum block height to scan for transfers, if filtering by height is enabled. max_height - unsigned int; (Opional) Maximum block height to scan for transfers, if filtering by height is enabled (defaults to max block height). account_index - unsigned int; (Optional) Index of the account to query for transfers. (defaults to 0) subaddr_indices - array of unsigned int; (Optional) List of subaddress indices to query for transfers. (defaults to 0) Outputs: in array of transfers: address - string; Public address of the transfer. amount - unsigned int; Amount transferred. confirmations - unsigned int; Number of block mined since the block containing this transaction (or block height at which the transaction should be added to a block if not yet confirmed). double_spend_seen - boolean; True if the key image(s) for the transfer have been seen before. fee - unsigned int; Transaction fee for this transfer. height - unsigned int; Height of the first block that confirmed this transfer (0 if not mined yet). note - string; Note about this transfer. payment_id - string; Payment ID for this transfer. subaddr_index - JSON object containing the major & minor subaddress index: major - unsigned int; Account index for the subaddress. minor - unsigned int; Index of the subaddress under the account. suggested_confirmations_threshold - unsigned int; Estimation of the confirmations needed for the transaction to be included in a block. timestamp - unsigned int; POSIX timestamp for when this transfer was first confirmed in a block (or timestamp submission if not mined yet). txid - string; Transaction ID for this transfer. type - string; Transfer type: \"in\" unlock_time - unsigned int; Number of blocks until transfer is safely spendable. out array of transfers (see above). pending array of transfers (see above). failed array of transfers (see above). pool array of transfers (see above). Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_transfers\",\"params\":{\"in\":true,\"account_index\":1}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"in\": [{ \"address\": \"77Vx9cs1VPicFndSVgYUvTdLCJEZw9h81hXLMYsjBCXSJfUehLa9TDW3Ffh45SQa7xb6dUs18mpNxfUhQGqfwXPSMrvKhVp\", \"amount\": 200000000000, \"confirmations\": 1, \"double_spend_seen\": false, \"fee\": 21650200000, \"height\": 153624, \"note\": \"\", \"payment_id\": \"0000000000000000\", \"subaddr_index\": { \"major\": 1, \"minor\": 0 }, \"suggested_confirmations_threshold\": 1, \"timestamp\": 1535918400, \"txid\": \"c36258a276018c3a4bc1f195a7fb530f50cd63a4fa765fb7c6f7f49fc051762a\", \"type\": \"in\", \"unlock_time\": 0 }] } } get_tx_key \u00b6 Get transaction secret key from transaction id. Alias: None . Inputs: txid - string; transaction id. Outputs: tx_key - string; transaction secret key. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_tx_key\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"tx_key\": \"feba662cf8fb6d0d0da18fc9b70ab28e01cc76311278fdd7fe7ab16360762b06\" } } get_tx_notes \u00b6 Get string notes for transactions. Alias: None . Inputs: txids - array of string; transaction ids Outputs: notes - array of string; notes for the transactions Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_tx_notes\",\"params\":{\"txids\":[\"3292e83ad28fc1cc7bc26dbd38862308f4588680fbf93eae3e803cddd1bd614f\"]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"notes\": [\"This is an example\"] } } get_tx_proof \u00b6 Get transaction signature to prove it. Alias: None . Inputs: txid - string; transaction id. address - string; destination public address of the transaction. message - string; (Optional) add a message to the signature to further authenticate the prooving process. Outputs: signature - string; transaction signature. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_tx_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\",\"message\":\"this is my transaction\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"signature\": \"InProofV13vqBCT6dpSAXkypZmSEMPGVnNRFDX2vscUYeVS4WnSVnV5BwLs31T9q6Etfj9Wts6tAxSAS4gkMeSYzzLS7Gt4vvCSQRh9niGJMUDJsB5hTzb2XJiCkUzWkkcjLFBBRVD5QZ\" } } get_version \u00b6 Get RPC version Major & Minor integer-format, where Major is the first 16 bits and Minor the last 16 bits. Alias: None . Inputs: None . Outputs: version - unsigned int; RPC version, formatted with Major * 2^16 + Minor (Major encoded over the first 16 bits, and Minor over the last 16 bits). Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_version\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"version\": 65539 } } import_key_images \u00b6 Import signed key images list and verify their spent status. Alias: None . Inputs: signed_key_images - array of signed key images: key_image - string; signature - string; Outputs: height - unsigned int; spent - unsigned int; Amount (in atomic units) spent from those key images. unspent - unsigned int; Amount (in atomic units) still available from those key images. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"import_key_images\", \"params\":{\"signed_key_images\":[{\"key_image\":\"cd35239b72a35e26a57ed17400c0b66944a55de9d5bda0f21190fed17f8ea876\",\"signature\":\"c9d736869355da2538ab4af188279f84138c958edbae3c5caf388a63cd8e780b8c5a1aed850bd79657df659422c463608ea4e0c730ba9b662c906ae933816d00\"},{\"key_image\":\"65158a8ee5a3b32009b85a307d85b375175870e560e08de313531c7dbbe6fc19\",\"signature\":\"c96e40d09dfc45cfc5ed0b76bfd7ca793469588bb0cf2b4d7b45ef23d40fd4036057b397828062e31700dc0c2da364f50cd142295a8405b9fe97418b4b745d0c\"}]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"height\": 76428, \"spent\": 62708953408711, \"unspent\": 0 } } import_multisig_info \u00b6 Import multisig info from other participants. Alias: None . Inputs: info - array of string; List of multisig info in hex format from other participants. Outputs: n_outputs - unsigned int; Number of outputs signed with those multisig info. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"import_multisig_info\",\"params\":{\"info\":[\"...multisig_info...\"]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"n_outputs\": 35 } } import_outputs \u00b6 Import outputs in hex format. Alias: None . Inputs: outputs_data_hex - string; wallet outputs in hex format. Outputs: num_imported - unsigned int; number of outputs imported. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"import_outputs\",\"params\":{\"outputs_data_hex\":\"...outputs...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"num_imported\": 6400 } } incoming_transfers \u00b6 Return a list of incoming transfers to the wallet. Inputs: transfer_type - string; \"all\": all the transfers, \"available\": only transfers which are not yet spent, OR \"unavailable\": only transfers which are already spent. account_index - unsigned int; (Optional) Return transfers for this account. (defaults to 0) subaddr_indices - array of unsigned int; (Optional) Return transfers sent to these subaddresses. verbose - boolean; (Optional) Enable verbose output, return key image if true. Outputs: transfers - list of: amount - unsigned int; Amount of this transfer. global_index - unsigned int; Mostly internal use, can be ignored by most users. key_image - string; Key image for the incoming transfer's unspent output (empty unless verbose is true). spent - boolean; Indicates if this transfer has been spent. subaddr_index - unsigned int; Subaddress index for incoming transfer. tx_hash - string; Several incoming transfers may share the same hash if they were in the same transaction. tx_size - unsigned int; Size of transaction in bytes. Example, get all transfers: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"incoming_transfers\",\"params\":{\"transfer_type\":\"all\",\"account_index\":0,\"subaddr_indices\":[3],\"verbose\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"transfers\": [{ \"amount\": 60000000000000, \"global_index\": 122405, \"key_image\": \"768f5144777eb23477ab7acf83562581d690abaf98ca897c03a9d2b900eb479b\", \"spent\": true, \"subaddr_index\": 3, \"tx_hash\": \"f53401f21c6a43e44d5dd7a90eba5cf580012ad0e15d050059136f8a0da34f6b\", \"tx_size\": 159 },{ \"amount\": 27126892247503, \"global_index\": 594994, \"key_image\": \"7e561394806afd1be61980cc3431f6ef3569fa9151cd8d234f8ec13aa145695e\", \"spent\": false, \"subaddr_index\": 3, \"tx_hash\": \"106d4391a031e5b735ded555862fec63233e34e5fa4fc7edcfdbe461c275ae5b\", \"tx_size\": 157 },{ \"amount\": 27169374733655, \"global_index\": 594997, \"key_image\": \"e76c0a3bfeaae35e4173712f782eb34011198e26b990225b71aa787c8ba8a157\", \"spent\": false, \"subaddr_index\": 3, \"tx_hash\": \"0bd959b59117ee1254bd8e5aa8e77ec04ef744144a1ffb2d5c1eb9380a719621\", \"tx_size\": 158 }] } } Example, get available transfers: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"incoming_transfers\",\"params\":{\"transfer_type\":\"available\",\"account_index\":0,\"subaddr_indices\":[3],\"verbose\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"transfers\": [{ \"amount\": 27126892247503, \"global_index\": 594994, \"key_image\": \"7e561394806afd1be61980cc3431f6ef3569fa9151cd8d234f8ec13aa145695e\", \"spent\": false, \"subaddr_index\": 3, \"tx_hash\": \"106d4391a031e5b735ded555862fec63233e34e5fa4fc7edcfdbe461c275ae5b\", \"tx_size\": 157 },{ \"amount\": 27169374733655, \"global_index\": 594997, \"key_image\": \"e76c0a3bfeaae35e4173712f782eb34011198e26b990225b71aa787c8ba8a157\", \"spent\": false, \"subaddr_index\": 3, \"tx_hash\": \"0bd959b59117ee1254bd8e5aa8e77ec04ef744144a1ffb2d5c1eb9380a719621\", \"tx_size\": 158 }] } } Example, get unavailable transfers: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"incoming_transfers\",\"params\":{\"transfer_type\":\"unavailable\",\"account_index\":0,\"subaddr_indices\":[3],\"verbose\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"transfers\": [{ \"amount\": 60000000000000, \"global_index\": 122405, \"key_image\": \"768f5144777eb23477ab7acf83562581d690abaf98ca897c03a9d2b900eb479b\", \"spent\": true, \"subaddr_index\": 3, \"tx_hash\": \"f53401f21c6a43e44d5dd7a90eba5cf580012ad0e15d050059136f8a0da34f6b\", \"tx_size\": 159 }] } } is_multisig \u00b6 Check if a wallet is a multisig one. Alias: None . Inputs: None . Outputs: multisig - boolean; States if the wallet is multisig ready - boolean; threshold - unsigned int; Amount of signature needed to sign a transfer. total - unsigned int; Total amount of signature in the multisig wallet. Example for a non-multisig wallet: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"is_multisig\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"multisig\": false, \"ready\": false, \"threshold\": 0, \"total\": 0 } } Example for a multisig wallet: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"is_multisig\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"multisig\": true, \"ready\": true, \"threshold\": 2, \"total\": 2 } } label_account \u00b6 Label an account. Alias: None . Inputs: account_index - unsigned int; Apply label to account at this index. label - string; Label for the account. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"label_account\",\"params\":{\"account_index\":0,\"label\":\"Primary account\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"account_tags\": [{ \"accounts\": [0,1], \"label\": \"\", \"tag\": \"myTag\" }] } } label_address \u00b6 Label an address. Alias: None . Inputs: index - subaddress index; JSON Object containing the major & minor address index: major - unsigned int; Account index for the subaddress. minor - unsigned int; Index of the subaddress in the account. label - string; Label for the address. Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"label_address\",\"params\":{\"index\":{\"major\":0,\"minor\":5},\"label\":\"myLabel\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } make_integrated_address \u00b6 Make an integrated address from the wallet address and a payment id. Alias: None . Inputs: standard_address - string; (Optional, defaults to primary address) Destination public address. payment_id - string; (Optional, defaults to a random ID) 16 characters hex encoded. Outputs: integrated_address - string payment_id - string; hex encoded; Example (Payment ID is empty, use a random ID): $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"make_integrated_address\",\"params\":{\"standard_address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"integrated_address\": \"5F38Rw9HKeaLQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZXCkbHUXdPHyiUeRyokn\", \"payment_id\": \"420fa29b2d9a49f5\" } } make_multisig \u00b6 Make a wallet multisig by importing peers multisig string. Alias: None . Inputs: multisig_info - array of string; List of multisig string from peers. threshold - unsigned int; Amount of signatures needed to sign a transfer. Must be less or equal than the amount of signature in multisig_info . password - string; Wallet password Outputs: address - string; multisig wallet address. multisig_info - string; Multisig string to share with peers to create the multisig wallet (extra step for N-1/N wallets). Example for 2/2 Multisig Wallet: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"make_multisig\",\"params\":{\"multisig_info\":[\"MultisigV1K4tGGe8QirZdHgTYoBZMumSug97fdDyM3Z63M3ZY5VXvAdoZvx16HJzPCP4Rp2ABMKUqLD2a74ugMdBfrVpKt4BwD8qCL5aZLrsYWoHiA7JJwDESuhsC3eF8QC9UMvxLXEMsMVh16o98GnKRYz1HCKXrAEWfcrCHyz3bLW1Pdggyowop\"],\"threshold\":2}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"address\": \"55SoZTKH7D39drxfgT62k8T4adVFjmDLUXnbzEKYf1MoYwnmTNKKaqGfxm4sqeKCHXQ5up7PVxrkoeRzXu83d8xYURouMod\", \"multisig_info\": \"\" } } Example for 2/3 Multisig Wallet: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"make_multisig\",\"params\":{\"multisig_info\":[\"MultisigV1MTVm4DZAdJw1PyVutpSy8Q4WisZBCFRAaZY7hhQnMwr5AZ4swzThyaSiVVQM5FHj1JQi3zPKhQ4k81BZkPSEaFjwRJtbfqfJcVvCqRnmBVcWVxhnihX5s8fZWBCjKrzT3CS95spG4dzNzJSUcjheAkLzCpVmSzGtgwMhAS3Vuz9Pas24\",\"MultisigV1TEx58ycKCd6ADCfxF8hALpcdSRAkhZTi1bu4Rs6FdRC98EdB1LY7TAkMxasM55khFgcxrSXivaSr5FCMyJGHmojm1eE4HpGWPeZKv6cgCTThRzC4u6bkkSoFQdbzWN92yn1XEjuP2XQrGHk81mG2LMeyB51MWKJAVF99Pg9mX2BpmYFj\"],\"threshold\":2}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"address\": \"51sLpF8fWaK1111111111111111111111111111111111ABVbHNf1JFWJyFp5YZgZRQ44RiviJi1sPHgLVMbckRsDkTRgKS\", \"multisig_info\": \"MultisigxV18jCaYAQQvzCMUJaAWMCaAbAoHpAD6WPmYDmLtBtazD654E8RWkLaGRf29fJ3stU471MELKxwufNYeigP7LoE4tn2Sscwn5g7PyCfcBc1V4ffRHY3Kxqq6VocSCUTncpVeUskaDKuTAWtdB9VTBGW7iG1cd7Zm1dYgur3CiemkGjRUAj9bL3xTEuyaKGYSDhtpFZFp99HQX57EawhiRHk3qq4hjWX\" } } make_uri \u00b6 Create a payment URI using the official URI spec. Alias: None . Inputs: address - string; Wallet address amount - unsigned int; (optional) the integer amount to receive, in atomic units payment_id - string; (optional) 16 or 64 character hexadecimal payment id recipient_name - string; (optional) name of the payment recipient tx_description - string; (optional) Description of the reason for the tx Outputs: uri - string; This contains all the payment input information as a properly formatted payment URI Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"make_uri\",\"params\":{\"address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\",\"amount\":10,\"payment_id\":\"420fa29b2d9a49f5\",\"tx_description\":\"Testing out the make_uri function.\",\"recipient_name\":\"el00ruobuob Stagenet wallet\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"uri\": \"monero:55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt?tx_payment_id=420fa29b2d9a49f5&tx_amount=0.000000000010&recipient_name=el00ruobuob%20Stagenet%20wallet&tx_description=Testing%20out%20the%20make_uri%20function.\" } } open_wallet \u00b6 Open a wallet. You need to have set the argument \"\u2013wallet-dir\" when launching monero-wallet-rpc to make this work. Alias: None . Inputs: filename - string; wallet name stored in \u2013wallet-dir. password - string; (Optional) only needed if the wallet has a password defined. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"open_wallet\",\"params\":{\"filename\":\"mytestwallet\",\"password\":\"mytestpassword\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } parse_uri \u00b6 Parse a payment URI to get payment information. Alias: None . Inputs: uri - string; This contains all the payment input information as a properly formatted payment URI Outputs: uri - JSON object containing payment information: address - string; Wallet address amount - unsigned int; Decimal amount to receive, in coin units (0 if not provided) payment_id - string; 16 or 64 character hexadecimal payment id (empty if not provided) recipient_name - string; Name of the payment recipient (empty if not provided) tx_description - string; Description of the reason for the tx (empty if not provided) Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"parse_uri\",\"params\":{\"uri\":\"monero:55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt?tx_payment_id=420fa29b2d9a49f5&tx_amount=0.000000000010&recipient_name=el00ruobuob%20Stagenet%20wallet&tx_description=Testing%20out%20the%20make_uri%20function.\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"uri\": { \"address\": \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\", \"amount\": 10, \"payment_id\": \"420fa29b2d9a49f5\", \"recipient_name\": \"el00ruobuob Stagenet wallet\", \"tx_description\": \"Testing out the make_uri function.\" } } } prepare_multisig \u00b6 Prepare a wallet for multisig by generating a multisig string to share with peers. Alias: None . Inputs: None . Outputs: multisig_info - string; Multisig string to share with peers to create the multisig wallet. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"prepare_multisig\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"multisig_info\": \"MultisigV1BFdxQ653cQHB8wsj9WJQd2VdnjxK89g5M94dKPBNw22reJnyJYKrz6rJeXdjFwJ3Mz6n4qNQLd6eqUZKLiNzJFi3UPNVcTjtkG2aeSys9sYkvYYKMZ7chCxvoEXVgm74KKUcUu4V8xveCBFadFuZs8shnxBWHbcwFr5AziLr2mE7KHJT\" } } query_key \u00b6 Return the spend or view private key. Alias: None . Inputs: key_type - string; Which key to retrieve: \"mnemonic\" - the mnemonic seed (older wallets do not have one) OR \"view_key\" - the view key Outputs: key - string; The view key will be hex encoded, while the mnemonic will be a string of words. Example (Query view key): $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"query_key\",\"params\":{\"key_type\":\"view_key\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"key\": \"0a1a38f6d246e894600a3e27238a064bf5e8d91801df47a17107596b1378e501\" } } Example (Query mnemonic key): $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"query_key\",\"params\":{\"key_type\":\"mnemonic\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"key\": \"vocal either anvil films dolphin zeal bacon cuisine quote syndrome rejoices envy okay pancakes tulips lair greater petals organs enmity dedicated oust thwart tomorrow tomorrow\" } } refresh \u00b6 Refresh a wallet after openning. Alias: None . Inputs: start_height - unsigned int; (Optional) The block height from which to start refreshing. Outputs: blocks_fetched - unsigned int; Number of new blocks scanned. received_money - boolean; States if transactions to the wallet have been found in the blocks. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"refresh\",\"params\":{\"start_height\":100000}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"blocks_fetched\": 24, \"received_money\": true } } relay_tx \u00b6 Relay a transaction previously created with \"do_not_relay\":true . Alias: None . Inputs: hex - string; transaction metadata returned from a transfer method with get_tx_metadata set to true . Outputs: tx_hash - String for the publically searchable transaction hash. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"relay_tx\",\"params\":{\"hex\":\"...tx_metadata...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"tx_hash\": \"1c42dcc5672bb09bccf33fb1e9ab4a498af59a6dbd33b3d0cfb289b9e0e25fa5\" } } rescan_blockchain \u00b6 Rescan the blockchain from scratch, losing any information which can not be recovered from the blockchain itself. This includes destination addresses, tx secret keys, tx notes, etc. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"rescan_blockchain\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } rescan_spent \u00b6 Rescan the blockchain for spent outputs. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"rescan_spent\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } set_account_tag_description \u00b6 Set description for an account tag. Alias: None . Inputs: tag - string; Set a description for this tag. description - string; Description for the tag. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"set_account_tag_description\",\"params\":{\"tag\":\"myTag\",\"description\":\"Test tag\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } set_attribute \u00b6 Set arbitrary attribute. Alias: None . Inputs: key - string; attribute name value - string; attribute value Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"set_attribute\",\"params\":{\"key\":\"my_attribute\",\"value\":\"my_value\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } set_tx_notes \u00b6 Set arbitrary string notes for transactions. Alias: None . Inputs: txids - array of string; transaction ids notes - array of string; notes for the transactions Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"set_tx_notes\",\"params\":{\"txids\":[\"3292e83ad28fc1cc7bc26dbd38862308f4588680fbf93eae3e803cddd1bd614f\"],\"notes\":[\"This is an example\"]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } sign \u00b6 Sign a string. Alias: None . Inputs: data - string; Anything you need to sign. Outputs: signature - string; Signature generated against the \"data\" and the account public address. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sign\",\"params\":{\"data\":\"This is sample data to be signed\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"signature\": \"SigV14K6G151gycjiGxjQ74tKX6A2LwwghvuHjcDeuRFQio5LS6Gb27BNxjYQY1dPuUvXkEbGQUkiHSVLPj4nJAHRrrw3\" } } sign_multisig \u00b6 Sign a transaction in multisig. Alias: None . Inputs: tx_data_hex - string; Multisig transaction in hex format, as returned by transfer under multisig_txset . Outputs: tx_data_hex - string; Multisig transaction in hex format. tx_hash_list - array of string; List of transaction Hash. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sign_multisig\",\"params\":{\"tx_data_hex\":\"...multisig_txset...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"tx_data_hex\": \"...multisig_txset...\", \"tx_hash_list\": [\"4996091b61c1be112c1097fd5e97d8ff8b28f0e5e62e1137a8c831bacf034f2d\"] } } sign_transfer \u00b6 Sign a transaction created on a read-only wallet (in cold-signing process) Alias: None . Inputs: unsigned_txset - string. Set of unsigned tx returned by \"transfer\" or \"transfer_split\" methods. export_raw - boolean; (Optional) If true, return the raw transaction data. (Defaults to false) Outputs: signed_txset - string. Set of signed tx to be used for submitting transfer. tx_hash_list - array of: string. The tx hashes of every transaction. tx_raw_list - array of: string. The tx raw data of every transaction. In the example below, we first generate an unsigned_txset on a read only wallet before signing it: Generate unsigned_txset using the above \"transfer\" method on read-only wallet: curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"transfer\",\"params\":{\"destinations\":[{\"amount\":1000000000000,\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\"}],\"account_index\":0,\"subaddr_indices\":[0],\"priority\":0,\"ring_size\":7,\"do_not_relay\":true,\"get_tx_hex\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"amount\": 1000000000000, \"fee\": 15202740000, \"multisig_txset\": \"\", \"tx_blob\": \"...long_hex...\", \"tx_hash\": \"c648ba0a049e5ce4ec21361dbf6e4b21eac0f828eea9090215de86c76b31d0a4\", \"tx_key\": \"\", \"tx_metadata\": \"\", \"unsigned_txset\": \"...long_hex...\" } } Sign tx using the previously generated unsigned_txset $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sign_transfer\",\"params\":{\"unsigned_txset\":...long_hex...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"signed_txset\": \"...long_hex...\", \"tx_hash_list\": [\"ff2e2d49fbfb1c9a55754f786576e171c8bf21b463a74438df604b7fa6cebc6d\"] } } split_integrated_address \u00b6 Retrieve the standard address and payment id corresponding to an integrated address. Alias: None . Inputs: integrated_address - string Outputs: is_subaddress - boolean; States if the address is a subaddress payment - string; hex encoded standard_address - string Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"split_integrated_address\",\"params\":{\"integrated_address\": \"5F38Rw9HKeaLQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZXCkbHUXdPHyiUeRyokn\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"is_subaddress\": false, \"payment_id\": \"420fa29b2d9a49f5\", \"standard_address\": \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\" } } start_mining \u00b6 Start mining in the Monero daemon. Alias: None . Inputs: threads_count - unsigned int; Number of threads created for mining. do_background_mining - boolean; Allow to start the miner in smart mining mode. ignore_battery - boolean; Ignore battery status (for smart mining only) Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"start_mining\",\"params\":{\"threads_count\":1,\"do_background_mining\":true,\"ignore_battery\":false}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } stop_mining \u00b6 Stop mining in the Monero daemon. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"stop_mining\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } stop_wallet \u00b6 Stops the wallet, storing the current state. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"stop_wallet\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } store \u00b6 Save the wallet file. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"store\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } submit_multisig \u00b6 Submit a signed multisig transaction. Alias: None . Inputs: tx_data_hex - string; Multisig transaction in hex format, as returned by sign_multisig under tx_data_hex . Outputs: tx_hash_list - array of string; List of transaction Hash. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"submit_multisig\",\"params\":{\"tx_data_hex\":\"...tx_data_hex...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"tx_hash_list\": [\"4996091b61c1be112c1097fd5e97d8ff8b28f0e5e62e1137a8c831bacf034f2d\"] } } submit_transfer \u00b6 Submit a previously signed transaction on a read-only wallet (in cold-signing process). Alias: None . Inputs: tx_data_hex - string; Set of signed tx returned by \"sign_transfer\" Outputs: tx_hash_list - array of: string. The tx hashes of every transaction. In the example below, we submit the transfer using the signed_txset generated above: curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"submit_transfer\",\"params\":{\"tx_data_hex\":...long_hex...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"tx_hash_list\": [\"40fad7c828bb383ac02648732f7afce9adc520ba5629e1f5d9c03f584ac53d74\"] } } sweep_all \u00b6 Send all unlocked balance to an address. Alias: None . Inputs: address - string; Destination public address. account_index - unsigned int; Sweep transactions from this account. subaddr_indices - array of unsigned int; (Optional) Sweep from this set of subaddresses in the account. priority - unsigned int; (Optional) Priority for sending the sweep transfer, partially determines fee. mixin - unsigned int; Number of outputs from the blockchain to mix with (0 means no mixing). ring_size - unsigned int; Sets ringsize to n (mixin + 1). unlock_time - unsigned int; Number of blocks before the monero can be spent (0 to not add a lock). payment_id - string; (Optional) Random 32-byte/64-character hex string to identify a transaction. get_tx_keys - boolean; (Optional) Return the transaction keys after sending. below_amount - unsigned int; (Optional) Include outputs below this amount. do_not_relay - boolean; (Optional) If true, do not relay this sweep transfer. (Defaults to false) get_tx_hex - boolean; (Optional) return the transactions as hex encoded string. (Defaults to false) get_tx_metadata - boolean; (Optional) return the transaction metadata as a string. (Defaults to false) Outputs: tx_hash_list - array of: string. The tx hashes of every transaction. tx_key_list - array of: string. The transaction keys for every transaction. amount_list - array of: integer. The amount transferred for every transaction. fee_list - array of: integer. The amount of fees paid for every transaction. tx_blob_list - array of: string. The tx as hex string for every transaction. tx_metadata_list - array of: string. List of transaction metadata needed to relay the transactions later. multisig_txset - string. The set of signing keys used in a multisig transaction (empty for non-multisig). unsigned_txset - string. Set of unsigned tx for cold-signing purposes. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sweep_all\",\"params\":{\"address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\",\"subaddr_indices\":[4],\"ring_size\":7,\"unlock_time\":0,\"get_tx_keys\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"amount_list\": [9985885770000], \"fee_list\": [14114230000], \"multisig_txset\": \"\", \"tx_hash_list\": [\"ab4b6b65cc8cd8c9dd317d0b90d97582d68d0aa1637b0065b05b61f9a66ea5c5\"], \"tx_key_list\": [\"b9b4b39d3bb3062ddb85ec0266d4df39058f4c86077d99309f218ce4d76af607\"], \"unsigned_txset\": \"\" } } sweep_dust \u00b6 Send all dust outputs back to the wallet's, to make them easier to spend (and mix). Alias: sweep_unmixable . Inputs: get_tx_keys - boolean; (Optional) Return the transaction keys after sending. do_not_relay - boolean; (Optional) If true, the newly created transaction will not be relayed to the monero network. (Defaults to false) get_tx_hex - boolean; (Optional) Return the transactions as hex string after sending. (Defaults to false) get_tx_metadata - boolean; (Optional) Return list of transaction metadata needed to relay the transfer later. (Defaults to false) Outputs: tx_hash_list - array of: string. The tx hashes of every transaction. tx_key_list - array of: string. The transaction keys for every transaction. amount_list - array of: integer. The amount transferred for every transaction. fee_list - array of: integer. The amount of fees paid for every transaction. tx_blob_list - array of: string. The tx as hex string for every transaction. tx_metadata_list - array of: string. List of transaction metadata needed to relay the transactions later. multisig_txset - string. The set of signing keys used in a multisig transaction (empty for non-multisig). unsigned_txset - string. Set of unsigned tx for cold-signing purposes. Example (In this example, sweep_dust returns nothing because there are no funds to sweep): $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sweep_dust\",\"params\":{\"get_tx_keys\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"multisig_txset\": \"\", \"unsigned_txset\": \"\" } } sweep_single \u00b6 Send all of a specific unlocked output to an address. Alias: None . Inputs: address - string; Destination public address. account_index - unsigned int; Sweep transactions from this account. subaddr_indices - array of unsigned int; (Optional) Sweep from this set of subaddresses in the account. priority - unsigned int; (Optional) Priority for sending the sweep transfer, partially determines fee. mixin - unsigned int; Number of outputs from the blockchain to mix with (0 means no mixing). ring_size - unsigned int; Sets ringsize to n (mixin + 1). unlock_time - unsigned int; Number of blocks before the monero can be spent (0 to not add a lock). payment_id - string; (Optional) Random 32-byte/64-character hex string to identify a transaction. get_tx_keys - boolean; (Optional) Return the transaction keys after sending. key_image - string; Key image of specific output to sweep. below_amount - unsigned int; (Optional) Include outputs below this amount. do_not_relay - boolean; (Optional) If true, do not relay this sweep transfer. (Defaults to false) get_tx_hex - boolean; (Optional) return the transactions as hex encoded string. (Defaults to false) get_tx_metadata - boolean; (Optional) return the transaction metadata as a string. (Defaults to false) Outputs: tx_hash_list - array of: string. The tx hashes of every transaction. tx_key_list - array of: string. The transaction keys for every transaction. amount_list - array of: integer. The amount transferred for every transaction. fee_list - array of: integer. The amount of fees paid for every transaction. tx_blob_list - array of: string. The tx as hex string for every transaction. tx_metadata_list - array of: string. List of transaction metadata needed to relay the transactions later. multisig_txset - string. The set of signing keys used in a multisig transaction (empty for non-multisig). unsigned_txset - string. Set of unsigned tx for cold-signing purposes. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sweep_single\",\"params\":{\"address\":\"74Jsocx8xbpTBEjm3ncKE5LBQbiJouyCDaGhgSiebpvNDXZnTAbW2CmUR5SsBeae2pNk9WMVuz6jegkC4krUyqRjA6VjoLD\",\"ring_size\":7,\"unlock_time\":0,\"key_image\":\"a7834459ef795d2efb6f665d2fd758c8d9288989d8d4c712a68f8023f7804a5e\",\"get_tx_keys\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"amount\": 27126892247503, \"fee\": 14111630000, \"multisig_txset\": \"\", \"tx_blob\": \"\", \"tx_hash\": \"106d4391a031e5b735ded555862fec63233e34e5fa4fc7edcfdbe461c275ae5b\", \"tx_key\": \"\", \"tx_metadata\": \"\", \"unsigned_txset\": \"\" } } tag_accounts \u00b6 Apply a filtering tag to a list of accounts. Alias: None . Inputs: tag - string; Tag for the accounts. accounts - array of unsigned int; Tag this list of accounts. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"tag_accounts\",\"params\":{\"tag\":\"myTag\",\"accounts\":[0,1]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } transfer \u00b6 Send monero to a number of recipients. Alias: None . Inputs: destinations - array of destinations to receive XMR: amount - unsigned int; Amount to send to each destination, in atomic units. address - string; Destination public address. account_index - unsigned int; (Optional) Transfer from this account index. (Defaults to 0) subaddr_indices - array of unsigned int; (Optional) Transfer from this set of subaddresses. (Defaults to 0) priority - unsigned int; Set a priority for the transaction. Accepted Values are: 0-3 for: default, unimportant, normal, elevated, priority. mixin - unsigned int; Number of outputs from the blockchain to mix with (0 means no mixing). ring_size - unsigned int; Number of outputs to mix in the transaction (this output + N decoys from the blockchain). unlock_time - unsigned int; Number of blocks before the monero can be spent (0 to not add a lock). payment_id - string; (Optional) Random 32-byte/64-character hex string to identify a transaction. get_tx_key - boolean; (Optional) Return the transaction key after sending. do_not_relay - boolean; (Optional) If true, the newly created transaction will not be relayed to the monero network. (Defaults to false) get_tx_hex - boolean; Return the transaction as hex string after sending (Defaults to false) get_tx_metadata - boolean; Return the metadata needed to relay the transaction. (Defaults to false) Outputs: amount - Amount transferred for the transaction. fee - Integer value of the fee charged for the txn. multisig_txset - Set of multisig transactions in the process of being signed (empty for non-multisig). tx_blob - Raw transaction represented as hex string, if get_tx_hex is true. tx_hash - String for the publically searchable transaction hash. tx_key - String for the transaction key if get_tx_key is true, otherwise, blank string. tx_metadata - Set of transaction metadata needed to relay this transfer later, if get_tx_metadata is true. unsigned_txset - String. Set of unsigned tx for cold-signing purposes. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"transfer\",\"params\":{\"destinations\":[{\"amount\":100000000000,\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\"},{\"amount\":200000000000,\"address\":\"75sNpRwUtekcJGejMuLSGA71QFuK1qcCVLZnYRTfQLgFU5nJ7xiAHtR5ihioS53KMe8pBhH61moraZHyLoG4G7fMER8xkNv\"}],\"account_index\":0,\"subaddr_indices\":[0],\"priority\":0,\"ring_size\":7,\"get_tx_key\": true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"amount\": 300000000000, \"fee\": 86897600000, \"multisig_txset\": \"\", \"tx_blob\": \"\", \"tx_hash\": \"7663438de4f72b25a0e395b770ea9ecf7108cd2f0c4b75be0b14a103d3362be9\", \"tx_key\": \"25c9d8ec20045c80c93d665c9d3684aab7335f8b2cd02e1ba2638485afd1c70e236c4bdd7a2f1cb511dbf466f13421bdf8df988b7b969c448ca6239d7251490e4bf1bbf9f6ffacffdcdc93b9d1648ec499eada4d6b4e02ce92d4a1c0452e5d009fbbbf15b549df8856205a4c7bda6338d82c823f911acd00cb75850b198c5803\", \"tx_metadata\": \"\", \"unsigned_txset\": \"\" } } transfer_split \u00b6 Same as transfer, but can split into more than one tx if necessary. Alias: None . Inputs: destinations - array of destinations to receive XMR: amount - unsigned int; Amount to send to each destination, in atomic units. address - string; Destination public address. account_index - unsigned int; (Optional) Transfer from this account index. (Defaults to 0) subaddr_indices - array of unsigned int; (Optional) Transfer from this set of subaddresses. (Defaults to 0) mixin - unsigned int; Number of outputs from the blockchain to mix with (0 means no mixing). ring_size - unsigned int; Sets ringsize to n (mixin + 1). unlock_time - unsigned int; Number of blocks before the monero can be spent (0 to not add a lock). payment_id - string; (Optional) Random 32-byte/64-character hex string to identify a transaction. get_tx_keys - boolean; (Optional) Return the transaction keys after sending. priority - unsigned int; Set a priority for the transactions. Accepted Values are: 0-3 for: default, unimportant, normal, elevated, priority. do_not_relay - boolean; (Optional) If true, the newly created transaction will not be relayed to the monero network. (Defaults to false) get_tx_hex - boolean; Return the transactions as hex string after sending new_algorithm - boolean; True to use the new transaction construction algorithm, defaults to false. get_tx_metadata - boolean; Return list of transaction metadata needed to relay the transfer later. Outputs: tx_hash_list - array of: string. The tx hashes of every transaction. tx_key_list - array of: string. The transaction keys for every transaction. amount_list - array of: integer. The amount transferred for every transaction. fee_list - array of: integer. The amount of fees paid for every transaction. tx_blob_list - array of: string. The tx as hex string for every transaction. tx_metadata_list - array of: string. List of transaction metadata needed to relay the transactions later. multisig_txset - string. The set of signing keys used in a multisig transaction (empty for non-multisig). unsigned_txset - string. Set of unsigned tx for cold-signing purposes. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"transfer_split\",\"params\":{\"destinations\":[{\"amount\":1000000000000,\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\"},{\"amount\":2000000000000,\"address\":\"75sNpRwUtekcJGejMuLSGA71QFuK1qcCVLZnYRTfQLgFU5nJ7xiAHtR5ihioS53KMe8pBhH61moraZHyLoG4G7fMER8xkNv\"}],\"account_index\":0,\"subaddr_indices\":[0],\"priority\":0,\"ring_size\":7,\"get_tx_key\": true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"amount_list\": [3000000000000], \"fee_list\": [85106400000], \"multisig_txset\": \"\", \"tx_hash_list\": [\"c8d815f48f27d53fdaf198a74b292a91bfaf87529a9a9a9ee66079a890b3b58b\"], \"unsigned_txset\": \"\" } } untag_accounts \u00b6 Remove filtering tag from a list of accounts. Alias: None . Inputs: accounts - array of unsigned int; Remove tag from this list of accounts. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"untag_accounts\",\"params\":{\"accounts\":[1]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } } verify \u00b6 Verify a signature on a string. Alias: None . Inputs: data - string; What should have been signed. address - string; Public address of the wallet used to sign the data. signature - string; signature generated by sign method. Outputs: good - boolean; Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"verify\",\"params\":{\"data\":\"This is sample data to be signed\",\"address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\",\"signature\":\"SigV14K6G151gycjiGxjQ74tKX6A2LwwghvuHjcDeuRFQio5LS6Gb27BNxjYQY1dPuUvXkEbGQUkiHSVLPj4nJAHRrrw3\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"good\": true } } Sources: \u00b6 Reworked from GetMonero.org","title":"monero-wallet-rpc"},{"location":"interacting/monero-wallet-rpc-reference/#monero-wallet-rpc-reference","text":"","title":"monero-wallet-rpc - Reference"},{"location":"interacting/monero-wallet-rpc-reference/#introduction","text":"This is a list of the monero-wallet-rpc calls, their inputs and outputs, and examples of each. The program monero-wallet-rpc replaced the rpc interface that was in simplewallet and then monero-wallet-cli. All monero-wallet-rpc methods use the same JSON RPC interface. For example: IP = 127 .0.0.1 PORT = 18082 METHOD = \"make_integrated_address\" PARAMS = \"{\\\"payment_id\\\":\\\"1234567890123456789012345678900012345678901234567890123456789000\\\"}\" curl \\ -X POST http:// $IP : $PORT /json_rpc \\ -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"' $METHOD '\",\"params\":' \" $PARAMS \" '}' \\ -H 'Content-Type: application/json' If the monero-wallet-rpc was executed with the --rpc-login argument as username:password , then follow this example: IP = 127 .0.0.1 PORT = 18082 METHOD = \"make_integrated_address\" PARAMS = \"{\\\"payment_id\\\":\\\"1234567890123456789012345678900012345678901234567890123456789000\\\"}\" curl \\ -u username:password --digest \\ -X POST http:// $IP : $PORT /json_rpc \\ -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"' $METHOD '\",\"params\":' \" $PARAMS \" '}' \\ -H 'Content-Type: application/json' Note: \"atomic units\" refer to the smallest fraction of 1 XMR according to the monerod implementation. 1 XMR = 1e12 atomic units.","title":"Introduction"},{"location":"interacting/monero-wallet-rpc-reference/#index-of-json-rpc-methods","text":"add_address_book change_wallet_password check_reserve_proof check_spend_proof check_tx_key check_tx_proof close_wallet create_account create_address create_wallet delete_address_book export_key_images export_multisig_info export_outputs finalize_multisig get_accounts get_account_tags get_address_book get_address get_address_index get_attribute get_balance get_bulk_payments get_height get_languages get_payments get_reserve_proof get_spend_proof get_transfer_by_txid get_transfers get_tx_key get_tx_notes get_tx_proof get_version import_key_images import_multisig_info import_outputs incoming_transfers is_multisig label_account label_address make_integrated_address make_multisig make_uri open_wallet parse_uri prepare_multisig query_key refresh relay_tx rescan_blockchain rescan_spent set_account_tag_description set_attribute set_tx_notes sign_multisig sign sign_transfer split_integrated_address start_mining stop_mining stop_wallet store submit_multisig submit_transfer sweep_all sweep_dust sweep_single tag_accounts transfer_split transfer untag_accounts verify","title":"Index of JSON RPC Methods:"},{"location":"interacting/monero-wallet-rpc-reference/#json-rpc-methods","text":"","title":"JSON RPC Methods:"},{"location":"interacting/monero-wallet-rpc-reference/#add_address_book","text":"Add an entry to the address book. Alias: None . Inputs: address - string; payment_id - (optional) string, defaults to \"0000000000000000000000000000000000000000000000000000000000000000\"; description - (optional) string, defaults to \"\"; Outputs: index - unsigned int; The index of the address book entry. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"add_address_book\",\"params\":{\"address\":\"78P16M3XmFRGcWFCcsgt1WcTntA1jzcq31seQX1Eg92j8VQ99NPivmdKam4J5CKNAD7KuNWcq5xUPgoWczChzdba5WLwQ4j\",\"description\":\"Third account\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"index\" : 1 } }","title":"add_address_book"},{"location":"interacting/monero-wallet-rpc-reference/#change_wallet_password","text":"Change a wallet password. Alias: None . Inputs: old_password - string; (Optional) Current wallet password, if defined. new_password - string; (Optional) New wallet password, if not blank. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"change_wallet_password\",\"params\":{\"old_password\":\"theCurrentSecretPassPhrase\",\"new_password\":\"theNewSecretPassPhrase\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { } }","title":"change_wallet_password"},{"location":"interacting/monero-wallet-rpc-reference/#check_reserve_proof","text":"Proves a wallet has a disposable reserve using a signature. Alias: None . Inputs: address - string; Public address of the wallet. message - string; (Optional) Should be the same message used in get_reserve_proof . signature - string; reserve signature to confirm. Outputs: good - boolean; States if the inputs proves the reserve. In the example below, the reserve has been proven: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_reserve_proof\",\"params\":{\"address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\",\"signature\":\"ReserveProofV11BZ23sBt9sZJeGccf84mzyAmNCP3KzYbE1111112VKmH111118NfCYJQjZ6c46gT2kXgcHCaSSZeL8sRdzqjqx7i1e7FQfQGu2o113UYFVdwzHQi3iENDPa76Kn1BvywbKz3bMkXdZkBEEhBSF4kjjGaiMJ1ucKb6wvMVC4A8sA4nZEdL2Mk3wBucJCYTZwKqA8i1M113kqakDkG25FrjiDqdQTCYz2wDBmfKxF3eQiV5FWzZ6HmAyxnqTWUiMWukP9A3Edy3ZXqjP1b23dhz7Mbj39bBxe3ZeDNu9HnTSqYvHNRyqCkeUMJpHyQweqjGUJ1DSfFYr33J1E7MkhMnEi1o7trqWjVix32XLetYfePG73yvHbS24837L7Q64i5n1LSpd9yMiQZ3Dyaysi5y6jPx7TpAvnSqBFtuCciKoNzaXoA3dqt9cuVFZTXzdXKqdt3cXcVJMNxY8RvKPVQHhUur94Lpo1nSpxf7BN5a5rHrbZFqoZszsZmiWikYPkLX72XUdw6NWjLrTBxSy7KuPYH86c6udPEXLo2xgN6XHMBMBJzt8FqqK7EcpNUBkuHm2AtpGkf9CABY3oSjDQoRF5n4vNLd3qUaxNsG4XJ12L9gJ7GrK273BxkfEA8fDdxPrb1gpespbgEnCTuZHqj1A\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"good\" : true, \"spent\" : 0 , \"total\" : 100000000000 } } In the example below, all wallet reserve has been proven: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_reserve_proof\",\"params\":{\"address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\",\"message\":\"I have 10 at least\",\"signature\":\"...signature...\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"good\" : true, \"spent\" : 0 , \"total\" : 164113855714662789 } } In the example below, the wrong message is used, avoiding the reserve to be proved: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_spend_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"message\":\"wrong message\",\"signature\":\"SpendProofV1aSh8Todhk54736iXgV6vJAFP7egxByuMWZeyNDaN2JY737S95X5zz5mNMQSuCNSLjjhi5HJCsndpNWSNVsuThxwv285qy1KkUrLFRkxMSCjfL6bbycYN33ScZ5UB4Fzseceo1ndpL393T1q638VmcU3a56dhNHF1RPZFiGPS61FA78nXFSqE9uoKCCoHkEz83M1dQVhxZV5CEPF2P6VioGTKgprLCH9vvj9k1ivd4SX19L2VSMc3zD1u3mkR24ioETvxBoLeBSpxMoikyZ6inhuPm8yYo9YWyFtQK4XYfAV9mJ9knz5fUPXR8vvh7KJCAg4dqeJXTVb4mbMzYtsSZXHd6ouWoyCd6qMALdW8pKhgMCHcVYMWp9X9WHZuCo9rsRjRpg15sJUw7oJg1JoGiVgj8P4JeGDjnZHnmLVa5bpJhVCbMhyM7JLXNQJzFWTGC27TQBbthxCfQaKdusYnvZnKPDJWSeceYEFzepUnsWhQtyhbb73FzqgWC4eKEFKAZJqT2LuuSoxmihJ9acnFK7Ze23KTVYgDyMKY61VXADxmSrBvwUtxCaW4nQtnbMxiPMNnDMzeixqsFMBtN72j5UqhiLRY99k6SE7Qf5f29haNSBNSXCFFHChPKNTwJrehkofBdKUhh2VGPqZDNoefWUwfudeu83t85bmjv8Q3LrQSkFgFjRT5tLo8TMawNXoZCrQpyZrEvnodMDDUUNf3NL7rxyv3gM1KrTWjYaWXFU2RAsFee2Q2MTwUW7hR25cJvSFuB1BX2bfkoCbiMk923tHZGU2g7rSKF1GDDkXAc1EvFFD4iGbh1Q5t6hPRhBV8PEncdcCWGq5uAL5D4Bjr6VXG8uNeCy5oYWNgbZ5JRSfm7QEhPv8Fy9AKMgmCxDGMF9dVEaU6tw2BAnJavQdfrxChbDBeQXzCbCfep6oei6n2LZdE5Q84wp7eoQFE5Cwuo23tHkbJCaw2njFi3WGBbA7uGZaGHJPyB2rofTWBiSUXZnP2hiE9bjJghAcDm1M4LVLfWvhZmFEnyeru3VWMETnetz1BYLUC5MJGFXuhnHwWh7F6r74FDyhdswYop4eWPbyrXMXmUQEccTGd2NaT8g2VHADZ76gMC6BjWESvcnz2D4n8XwdmM7ZQ1jFwhuXrBfrb1dwRasyXxxHMGAC2onatNiExyeQ9G1W5LwqNLAh9hvcaNTGaYKYXoceVzLkgm6e5WMkLsCwuZXvB\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"good\" : false } }","title":"check_reserve_proof"},{"location":"interacting/monero-wallet-rpc-reference/#check_spend_proof","text":"Prove a spend using a signature. Unlike proving a transaction, it does not requires the destination public address. Alias: None . Inputs: txid - string; transaction id. message - string; (Optional) Should be the same message used in get_spend_proof . signature - string; spend signature to confirm. Outputs: good - boolean; States if the inputs proves the spend. In the example below, the spend has been proven: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_spend_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"message\":\"this is my transaction\",\"signature\":\"SpendProofV1aSh8Todhk54736iXgV6vJAFP7egxByuMWZeyNDaN2JY737S95X5zz5mNMQSuCNSLjjhi5HJCsndpNWSNVsuThxwv285qy1KkUrLFRkxMSCjfL6bbycYN33ScZ5UB4Fzseceo1ndpL393T1q638VmcU3a56dhNHF1RPZFiGPS61FA78nXFSqE9uoKCCoHkEz83M1dQVhxZV5CEPF2P6VioGTKgprLCH9vvj9k1ivd4SX19L2VSMc3zD1u3mkR24ioETvxBoLeBSpxMoikyZ6inhuPm8yYo9YWyFtQK4XYfAV9mJ9knz5fUPXR8vvh7KJCAg4dqeJXTVb4mbMzYtsSZXHd6ouWoyCd6qMALdW8pKhgMCHcVYMWp9X9WHZuCo9rsRjRpg15sJUw7oJg1JoGiVgj8P4JeGDjnZHnmLVa5bpJhVCbMhyM7JLXNQJzFWTGC27TQBbthxCfQaKdusYnvZnKPDJWSeceYEFzepUnsWhQtyhbb73FzqgWC4eKEFKAZJqT2LuuSoxmihJ9acnFK7Ze23KTVYgDyMKY61VXADxmSrBvwUtxCaW4nQtnbMxiPMNnDMzeixqsFMBtN72j5UqhiLRY99k6SE7Qf5f29haNSBNSXCFFHChPKNTwJrehkofBdKUhh2VGPqZDNoefWUwfudeu83t85bmjv8Q3LrQSkFgFjRT5tLo8TMawNXoZCrQpyZrEvnodMDDUUNf3NL7rxyv3gM1KrTWjYaWXFU2RAsFee2Q2MTwUW7hR25cJvSFuB1BX2bfkoCbiMk923tHZGU2g7rSKF1GDDkXAc1EvFFD4iGbh1Q5t6hPRhBV8PEncdcCWGq5uAL5D4Bjr6VXG8uNeCy5oYWNgbZ5JRSfm7QEhPv8Fy9AKMgmCxDGMF9dVEaU6tw2BAnJavQdfrxChbDBeQXzCbCfep6oei6n2LZdE5Q84wp7eoQFE5Cwuo23tHkbJCaw2njFi3WGBbA7uGZaGHJPyB2rofTWBiSUXZnP2hiE9bjJghAcDm1M4LVLfWvhZmFEnyeru3VWMETnetz1BYLUC5MJGFXuhnHwWh7F6r74FDyhdswYop4eWPbyrXMXmUQEccTGd2NaT8g2VHADZ76gMC6BjWESvcnz2D4n8XwdmM7ZQ1jFwhuXrBfrb1dwRasyXxxHMGAC2onatNiExyeQ9G1W5LwqNLAh9hvcaNTGaYKYXoceVzLkgm6e5WMkLsCwuZXvB\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"good\" : true } } In the example below, the wrong message is used, avoiding the spend to be proved: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_spend_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"message\":\"wrong message\",\"signature\":\"SpendProofV1aSh8Todhk54736iXgV6vJAFP7egxByuMWZeyNDaN2JY737S95X5zz5mNMQSuCNSLjjhi5HJCsndpNWSNVsuThxwv285qy1KkUrLFRkxMSCjfL6bbycYN33ScZ5UB4Fzseceo1ndpL393T1q638VmcU3a56dhNHF1RPZFiGPS61FA78nXFSqE9uoKCCoHkEz83M1dQVhxZV5CEPF2P6VioGTKgprLCH9vvj9k1ivd4SX19L2VSMc3zD1u3mkR24ioETvxBoLeBSpxMoikyZ6inhuPm8yYo9YWyFtQK4XYfAV9mJ9knz5fUPXR8vvh7KJCAg4dqeJXTVb4mbMzYtsSZXHd6ouWoyCd6qMALdW8pKhgMCHcVYMWp9X9WHZuCo9rsRjRpg15sJUw7oJg1JoGiVgj8P4JeGDjnZHnmLVa5bpJhVCbMhyM7JLXNQJzFWTGC27TQBbthxCfQaKdusYnvZnKPDJWSeceYEFzepUnsWhQtyhbb73FzqgWC4eKEFKAZJqT2LuuSoxmihJ9acnFK7Ze23KTVYgDyMKY61VXADxmSrBvwUtxCaW4nQtnbMxiPMNnDMzeixqsFMBtN72j5UqhiLRY99k6SE7Qf5f29haNSBNSXCFFHChPKNTwJrehkofBdKUhh2VGPqZDNoefWUwfudeu83t85bmjv8Q3LrQSkFgFjRT5tLo8TMawNXoZCrQpyZrEvnodMDDUUNf3NL7rxyv3gM1KrTWjYaWXFU2RAsFee2Q2MTwUW7hR25cJvSFuB1BX2bfkoCbiMk923tHZGU2g7rSKF1GDDkXAc1EvFFD4iGbh1Q5t6hPRhBV8PEncdcCWGq5uAL5D4Bjr6VXG8uNeCy5oYWNgbZ5JRSfm7QEhPv8Fy9AKMgmCxDGMF9dVEaU6tw2BAnJavQdfrxChbDBeQXzCbCfep6oei6n2LZdE5Q84wp7eoQFE5Cwuo23tHkbJCaw2njFi3WGBbA7uGZaGHJPyB2rofTWBiSUXZnP2hiE9bjJghAcDm1M4LVLfWvhZmFEnyeru3VWMETnetz1BYLUC5MJGFXuhnHwWh7F6r74FDyhdswYop4eWPbyrXMXmUQEccTGd2NaT8g2VHADZ76gMC6BjWESvcnz2D4n8XwdmM7ZQ1jFwhuXrBfrb1dwRasyXxxHMGAC2onatNiExyeQ9G1W5LwqNLAh9hvcaNTGaYKYXoceVzLkgm6e5WMkLsCwuZXvB\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"good\" : false } }","title":"check_spend_proof"},{"location":"interacting/monero-wallet-rpc-reference/#check_tx_key","text":"Check a transaction in the blockchain with its secret key. Alias: None . Inputs: txid - string; transaction id. tx_key - string; transaction secret key. address - string; destination public address of the transaction. Outputs: confirmations - unsigned int; Number of block mined after the one with the transaction. in_pool - boolean; States if the transaction is still in pool or has been added to a block. received - unsigned int; Amount of the transaction. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_tx_key\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"tx_key\":\"feba662cf8fb6d0d0da18fc9b70ab28e01cc76311278fdd7fe7ab16360762b06\",\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"confirmations\" : 0 , \"in_pool\" : false, \"received\" : 1000000000000 } }","title":"check_tx_key"},{"location":"interacting/monero-wallet-rpc-reference/#check_tx_proof","text":"Prove a transaction by checking its signature. Alias: None . Inputs: txid - string; transaction id. address - string; destination public address of the transaction. message - string; (Optional) Should be the same message used in get_tx_proof . signature - string; transaction signature to confirm. Outputs: confirmations - unsigned int; Number of block mined after the one with the transaction. good - boolean; States if the inputs proves the transaction. in_pool - boolean; States if the transaction is still in pool or has been added to a block. received - unsigned int; Amount of the transaction. In the example below, the transaction has been proven: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_tx_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\",\"message\":\"this is my transaction\",\"signature\":\"InProofV13vqBCT6dpSAXkypZmSEMPGVnNRFDX2vscUYeVS4WnSVnV5BwLs31T9q6Etfj9Wts6tAxSAS4gkMeSYzzLS7Gt4vvCSQRh9niGJMUDJsB5hTzb2XJiCkUzWkkcjLFBBRVD5QZ\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"confirmations\" : 482 , \"good\" : true, \"in_pool\" : false, \"received\" : 1000000000000 } } In the example below, the wrong message is used, avoiding the transaction to be proved: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"check_tx_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\",\"message\":\"wrong message\",\"signature\":\"InProofV13vqBCT6dpSAXkypZmSEMPGVnNRFDX2vscUYeVS4WnSVnV5BwLs31T9q6Etfj9Wts6tAxSAS4gkMeSYzzLS7Gt4vvCSQRh9niGJMUDJsB5hTzb2XJiCkUzWkkcjLFBBRVD5QZ\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"confirmations\" : 0 , \"good\" : false, \"in_pool\" : false, \"received\" : 0 } }","title":"check_tx_proof"},{"location":"interacting/monero-wallet-rpc-reference/#close_wallet","text":"Close the currently opened wallet, after trying to save it. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"close_wallet\"}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { } }","title":"close_wallet"},{"location":"interacting/monero-wallet-rpc-reference/#create_account","text":"Create a new account with an optional label. Alias: None . Inputs: label - string; (Optional) Label for the account. Outputs: account_index - unsigned int; Index of the new account. address - string; Address for this account. Base58 representation of the public keys. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"create_account\",\"params\":{\"label\":\"Secondary account\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"account_index\" : 1 , \"address\" : \"77Vx9cs1VPicFndSVgYUvTdLCJEZw9h81hXLMYsjBCXSJfUehLa9TDW3Ffh45SQa7xb6dUs18mpNxfUhQGqfwXPSMrvKhVp\" } }","title":"create_account"},{"location":"interacting/monero-wallet-rpc-reference/#create_address","text":"Create a new address for an account. Optionally, label the new address. Alias: None . Inputs: account_index - unsigned int; Create a new address for this account. label - string; (Optional) Label for the new address. Outputs: address - string; Newly created address. Base58 representation of the public keys. address_index - unsigned int; Index of the new address under the input account. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"create_address\",\"params\":{\"account_index\":0,\"label\":\"new-sub\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"address\" : \"7BG5jr9QS5sGMdpbBrZEwVLZjSKJGJBsXdZLt8wiXyhhLjy7x2LZxsrAnHTgD8oG46ZtLjUGic2pWc96GFkGNPQQDA3Dt7Q\" , \"address_index\" : 5 } }","title":"create_address"},{"location":"interacting/monero-wallet-rpc-reference/#create_wallet","text":"Create a new wallet. You need to have set the argument \"\u2013wallet-dir\" when launching monero-wallet-rpc to make this work. Alias: None . Inputs: filename - string; Wallet file name. password - string; (Optional) password to protect the wallet. language - string; Language for your wallets' seed. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"create_wallet\",\"params\":{\"filename\":\"mytestwallet\",\"password\":\"mytestpassword\",\"language\":\"English\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { } }","title":"create_wallet"},{"location":"interacting/monero-wallet-rpc-reference/#delete_address_book","text":"Delete an entry from the address book. Alias: None . Inputs: index - unsigned int; The index of the address book entry. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"delete_address_book\",\"params\":{\"index\":1}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { } }","title":"delete_address_book"},{"location":"interacting/monero-wallet-rpc-reference/#export_key_images","text":"Export a signed set of key images. Alias: None . Inputs: None . Outputs: signed_key_images - array of signed key images: key_image - string; signature - string; Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"export_key_images\"}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"signed_key_images\" : [{ \"key_image\" : \"cd35239b72a35e26a57ed17400c0b66944a55de9d5bda0f21190fed17f8ea876\" , \"signature\" : \"c9d736869355da2538ab4af188279f84138c958edbae3c5caf388a63cd8e780b8c5a1aed850bd79657df659422c463608ea4e0c730ba9b662c906ae933816d00\" } , { \"key_image\" : \"65158a8ee5a3b32009b85a307d85b375175870e560e08de313531c7dbbe6fc19\" , \"signature\" : \"c96e40d09dfc45cfc5ed0b76bfd7ca793469588bb0cf2b4d7b45ef23d40fd4036057b397828062e31700dc0c2da364f50cd142295a8405b9fe97418b4b745d0c\" } ,... ] } }","title":"export_key_images"},{"location":"interacting/monero-wallet-rpc-reference/#export_multisig_info","text":"Export multisig info for other participants. Alias: None . Inputs: None . Outputs: info - string; Multisig info in hex format for other participants. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"export_multisig_info\"}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"info\" : \"4d6f6e65726f206d756c7469736967206578706f72740105cf6442b09b75f5eca9d846771fe1a879c9a97ab0553ffbcec64b1148eb7832b51e7898d7944c41cee000415c5a98f4f80dc0efdae379a98805bb6eacae743446f6f421cd03e129eb5b27d6e3b73eb6929201507c1ae706c1a9ecd26ac8601932415b0b6f49cbbfd712e47d01262c59980a8f9a8be776f2bf585f1477a6df63d6364614d941ecfdcb6e958a390eb9aa7c87f056673d73bc7c5f0ab1f74a682e902e48a3322c0413bb7f6fd67404f13fb8e313f70a0ce568c853206751a334ef490068d3c8ca0e\" } }","title":"export_multisig_info"},{"location":"interacting/monero-wallet-rpc-reference/#export_outputs","text":"Export all outputs in hex format. Alias: None . Inputs: None . Outputs: outputs_data_hex - string; wallet outputs in hex format. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"export_outputs\"}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"outputs_data_hex\" : \"...outputs...\" } }","title":"export_outputs"},{"location":"interacting/monero-wallet-rpc-reference/#finalize_multisig","text":"Turn this wallet into a multisig wallet, extra step for N-1/N wallets. Alias: None . Inputs: multisig_info - array of string; List of multisig string from peers. password - string; Wallet password Outputs: address - string; multisig wallet address. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"finalize_multisig\",\"params\":{\"multisig_info\":[\"MultisigxV1JNC6Ja2oBt5Sqea9LN2YEF7WYZCpHqr2EKvPG89Trf3X4E8RWkLaGRf29fJ3stU471MELKxwufNYeigP7LoE4tn2McPr4SbL9q15xNvZT5uwC9YRr7UwjXqSZHmTWN9PBuZEKVAQ4HPPyQciSCdNjgwsuFRBzrskMdMUwNMgKst1debYfm37i6PSzDoS2tk4kYTYj83kkAdR7kdshet1axQPd6HQ\",\"MultisigxV1Unma7Ko4zdd8Ps3Af4oZwtj2JdWKzwNfP6s2G9ZvXhMoSscwn5g7PyCfcBc1V4ffRHY3Kxqq6VocSCUTncpVeUskMcPr4SbL9q15xNvZT5uwC9YRr7UwjXqSZHmTWN9PBuZE1LTpWxLoC3vPMSrqVVcjnmL9LYfdCZz3fECjNZbCEDq3PHDiUuY5jurQTcNoGhDTio5WM9xaAdim9YByiS5KyqF4\"]}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"address\" : \"5B9gZUTDuHTcGGuY3nL3t8K2tDnEHeRVHSBQgLZUTQxtFYVLnho5JJjWJyFp5YZgZRQ44RiviJi1sPHgLVMbckRsDqDx1gV\" } }","title":"finalize_multisig"},{"location":"interacting/monero-wallet-rpc-reference/#get_account_tags","text":"Get a list of user-defined account tags. Alias: None . Inputs: None . Outputs: account_tags - array of account tag information: tag - string; Filter tag. label - string; Label for the tag. accounts - array of int; List of tagged account indices. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_account_tags\",\"params\":\"\"}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"account_tags\" : [{ \"accounts\" : [ 0 ] , \"label\" : \"Test tag\" , \"tag\" : \"myTag\" }] } }","title":"get_account_tags"},{"location":"interacting/monero-wallet-rpc-reference/#get_accounts","text":"Get all accounts for a wallet. Optionally filter accounts by tag. Alias: None . Inputs: tag - string; (Optional) Tag for filtering accounts. Outputs: subaddress_accounts - array of subaddress account information: account_index - unsigned int; Index of the account. balance - unsigned int; Balance of the account (locked or unlocked). base_address - string; Base64 representation of the first subaddress in the account. label - string; (Optional) Label of the account. tag - string; (Optional) Tag for filtering accounts. unlocked_balance - unsigned int; Unlocked balance for the account. total_balance - unsigned int; Total balance of the selected accounts (locked or unlocked). total_unlocked_balance - unsigned int; Total unlocked balance of the selected accounts. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_accounts\",\"params\":{\"tag\":\"myTag\"}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"subaddress_accounts\" : [{ \"account_index\" : 0 , \"balance\" : 157663195572433688 , \"base_address\" : \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\" , \"label\" : \"Primary account\" , \"tag\" : \"myTag\" , \"unlocked_balance\" : 157443303037455077 } , { \"account_index\" : 1 , \"balance\" : 0 , \"base_address\" : \"77Vx9cs1VPicFndSVgYUvTdLCJEZw9h81hXLMYsjBCXSJfUehLa9TDW3Ffh45SQa7xb6dUs18mpNxfUhQGqfwXPSMrvKhVp\" , \"label\" : \"Secondary account\" , \"tag\" : \"myTag\" , \"unlocked_balance\" : 0 }] , \"total_balance\" : 157663195572433688 , \"total_unlocked_balance\" : 157443303037455077 } }","title":"get_accounts"},{"location":"interacting/monero-wallet-rpc-reference/#get_address","text":"Return the wallet's addresses for an account. Optionally filter for specific set of subaddresses. Alias: getaddress . Inputs: account_index - unsigned int; Return subaddresses for this account. address_index - array of unsigned int; (Optional) List of subaddresses to return from an account. Outputs: address - string; The 95-character hex address string of the monero-wallet-rpc in session. addresses array of addresses informations address string; The 95-character hex (sub)address string. label string; Label of the (sub)address address_index unsigned int; index of the subaddress used boolean; states if the (sub)address has already received funds Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_address\",\"params\":{\"account_index\":0,\"address_index\":[0,1,4]}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"address\" : \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\" , \"addresses\" : [{ \"address\" : \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\" , \"address_index\" : 0 , \"label\" : \"Primary account\" , \"used\" : true } , { \"address\" : \"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\" , \"address_index\" : 1 , \"label\" : \"\" , \"used\" : true } , { \"address\" : \"77xa6Dha7kzCQuvmd8iB5VYoMkdenwCNRU9khGhExXQ8KLL3z1N1ZATBD1sFPenyHWT9cm4fVFnCAUApY53peuoZFtwZiw5\" , \"address_index\" : 4 , \"label\" : \"test2\" , \"used\" : true }] } }","title":"get_address"},{"location":"interacting/monero-wallet-rpc-reference/#get_address_book","text":"Retrieves entries from the address book. Alias: None . Inputs: entries - array of unsigned int; indices of the requested address book entries Outputs: entries - array of entries: address - string; Public address of the entry description - string; Description of this address entry index - unsigned int; payment_id - string; Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_address_book\",\"params\":{\"entries\":[0,1]}}' -H 'Content-Type: application/json' { \"id\" : \"0\" , \"jsonrpc\" : \"2.0\" , \"result\" : { \"entries\" : [{ \"address\" : \"77Vx9cs1VPicFndSVgYUvTdLCJEZw9h81hXLMYsjBCXSJfUehLa9TDW3Ffh45SQa7xb6dUs18mpNxfUhQGqfwXPSMrvKhVp\" , \"description\" : \"Second account\" , \"index\" : 0 , \"payment_id\" : \"0000000000000000000000000000000000000000000000000000000000000000\" } , { \"address\" : \"78P16M3XmFRGcWFCcsgt1WcTntA1jzcq31seQX1Eg92j8VQ99NPivmdKam4J5CKNAD7KuNWcq5xUPgoWczChzdba5WLwQ4j\" , \"description\" : \"Third account\" , \"index\" : 1 , \"payment_id\" : \"0000000000000000000000000000000000000000000000000000000000000000\" }] } }","title":"get_address_book"},{"location":"interacting/monero-wallet-rpc-reference/#get_address_index","text":"Get account and address indexes from a specific (sub)address Alias: None . Inputs: address - String; (sub)address to look for. Outputs: index - subaddress informations major unsigned int; Account index. minor unsigned int; Address index. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_address_index\",\"params\":{\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"index\": { \"major\": 0, \"minor\": 1 } } }","title":"get_address_index"},{"location":"interacting/monero-wallet-rpc-reference/#get_attribute","text":"Get attribute value by name. Alias: None . Inputs: key - string; attribute name Outputs: value - string; attribute value Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_attribute\",\"params\":{\"key\":\"my_attribute\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"value\": \"my_value\" } }","title":"get_attribute"},{"location":"interacting/monero-wallet-rpc-reference/#get_bulk_payments","text":"Get a list of incoming payments using a given payment id, or a list of payments ids, from a given height. This method is the preferred method over get_payments because it has the same functionality but is more extendable. Either is fine for looking up transactions by a single payment ID. Alias: None . Inputs: payment_ids - array of: string; Payment IDs used to find the payments (16 characters hex). min_block_height - unsigned int; The block height at which to start looking for payments. Outputs: payments - list of: payment_id - string; Payment ID matching one of the input IDs. tx_hash - string; Transaction hash used as the transaction ID. amount - unsigned int; Amount for this payment. block_height - unsigned int; Height of the block that first confirmed this payment. unlock_time - unsigned int; Time (in block height) until this payment is safe to spend. subaddr_index - subaddress index: major - unsigned int; Account index for the subaddress. minor - unsigned int; Index of the subaddress in the account. address - string; Address receiving the payment; Base58 representation of the public keys. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_bulk_payments\",\"params\":{\"payment_ids\":[\"60900e5603bf96e3\"],\"min_block_height\":\"120000\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"payments\": [{ \"address\": \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\", \"amount\": 1000000000000, \"block_height\": 127606, \"payment_id\": \"60900e5603bf96e3\", \"subaddr_index\": { \"major\": 0, \"minor\": 0 }, \"tx_hash\": \"3292e83ad28fc1cc7bc26dbd38862308f4588680fbf93eae3e803cddd1bd614f\", \"unlock_time\": 0 }] } }","title":"get_bulk_payments"},{"location":"interacting/monero-wallet-rpc-reference/#get_height","text":"Returns the wallet's current block height. Alias: getheight . Inputs: None . Outputs: height - unsigned int; The current monero-wallet-rpc's blockchain height. If the wallet has been offline for a long time, it may need to catch up with the daemon. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_height\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"height\": 145545 } }","title":"get_height"},{"location":"interacting/monero-wallet-rpc-reference/#get_languages","text":"Get a list of available languages for your wallet's seed. Alias: None . Inputs: None . Outputs: languages - array of string; List of available languages Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_languages\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"languages\": [\"Deutsch\",\"English\",\"Espa\u00f1ol\",\"Fran\u00e7ais\",\"Italiano\",\"Nederlands\",\"Portugu\u00eas\",\"\u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a\",\"\u65e5\u672c\u8a9e\",\"\u7b80\u4f53\u4e2d\u6587 (\u4e2d\u56fd)\",\"Esperanto\",\"Lojban\"] } }","title":"get_languages"},{"location":"interacting/monero-wallet-rpc-reference/#get_payments","text":"Get a list of incoming payments using a given payment id. Alias: None . Inputs: payment_id - string; Payment ID used to find the payments (16 characters hex). Outputs: payments - list of: payment_id - string; Payment ID matching the input parameter. tx_hash - string; Transaction hash used as the transaction ID. amount - unsigned int; Amount for this payment. block_height - unsigned int; Height of the block that first confirmed this payment. unlock_time - unsigned int; Time (in block height) until this payment is safe to spend. subaddr_index - subaddress index: major - unsigned int; Account index for the subaddress. minor - unsigned int; Index of the subaddress in the account. address - string; Address receiving the payment; Base58 representation of the public keys. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_payments\",\"params\":{\"payment_id\":\"60900e5603bf96e3\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"payments\": [{ \"address\": \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\", \"amount\": 1000000000000, \"block_height\": 127606, \"payment_id\": \"60900e5603bf96e3\", \"subaddr_index\": { \"major\": 0, \"minor\": 0 }, \"tx_hash\": \"3292e83ad28fc1cc7bc26dbd38862308f4588680fbf93eae3e803cddd1bd614f\", \"unlock_time\": 0 }] } }","title":"get_payments"},{"location":"interacting/monero-wallet-rpc-reference/#get_reserve_proof","text":"Generate a signature to prove of an available amount in a wallet. Alias: None . Inputs: all - boolean; Proves all wallet balance to be disposable. account_index - unsigned int; Specify the account from witch to prove reserve. (ignored if all is set to true) amount - unsigned int; Amount (in atomic units) to prove the account has for reserve. (ignored if all is set to true) message - string; (Optional) add a message to the signature to further authenticate the prooving process. Outputs: signature - string; reserve signature. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_reserve_proof\",\"params\":{\"all\":false,\"account_index\":0,\"amount\":100000000000}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"signature\": \"ReserveProofV11BZ23sBt9sZJeGccf84mzyAmNCP3KzYbE1111112VKmH111118NfCYJQjZ6c46gT2kXgcHCaSSZeL8sRdzqjqx7i1e7FQfQGu2o113UYFVdwzHQi3iENDPa76Kn1BvywbKz3bMkXdZkBEEhBSF4kjjGaiMJ1ucKb6wvMVC4A8sA4nZEdL2Mk3wBucJCYTZwKqA8i1M113kqakDkG25FrjiDqdQTCYz2wDBmfKxF3eQiV5FWzZ6HmAyxnqTWUiMWukP9A3Edy3ZXqjP1b23dhz7Mbj39bBxe3ZeDNu9HnTSqYvHNRyqCkeUMJpHyQweqjGUJ1DSfFYr33J1E7MkhMnEi1o7trqWjVix32XLetYfePG73yvHbS24837L7Q64i5n1LSpd9yMiQZ3Dyaysi5y6jPx7TpAvnSqBFtuCciKoNzaXoA3dqt9cuVFZTXzdXKqdt3cXcVJMNxY8RvKPVQHhUur94Lpo1nSpxf7BN5a5rHrbZFqoZszsZmiWikYPkLX72XUdw6NWjLrTBxSy7KuPYH86c6udPEXLo2xgN6XHMBMBJzt8FqqK7EcpNUBkuHm2AtpGkf9CABY3oSjDQoRF5n4vNLd3qUaxNsG4XJ12L9gJ7GrK273BxkfEA8fDdxPrb1gpespbgEnCTuZHqj1A\" } }","title":"get_reserve_proof"},{"location":"interacting/monero-wallet-rpc-reference/#get_spend_proof","text":"Generate a signature to prove a spend. Unlike proving a transaction, it does not requires the destination public address. Alias: None . Inputs: txid - string; transaction id. message - string; (Optional) add a message to the signature to further authenticate the prooving process. Outputs: signature - string; spend signature. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_spend_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"message\":\"this is my transaction\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"signature\": \"SpendProofV1aSh8Todhk54736iXgV6vJAFP7egxByuMWZeyNDaN2JY737S95X5zz5mNMQSuCNSLjjhi5HJCsndpNWSNVsuThxwv285qy1KkUrLFRkxMSCjfL6bbycYN33ScZ5UB4Fzseceo1ndpL393T1q638VmcU3a56dhNHF1RPZFiGPS61FA78nXFSqE9uoKCCoHkEz83M1dQVhxZV5CEPF2P6VioGTKgprLCH9vvj9k1ivd4SX19L2VSMc3zD1u3mkR24ioETvxBoLeBSpxMoikyZ6inhuPm8yYo9YWyFtQK4XYfAV9mJ9knz5fUPXR8vvh7KJCAg4dqeJXTVb4mbMzYtsSZXHd6ouWoyCd6qMALdW8pKhgMCHcVYMWp9X9WHZuCo9rsRjRpg15sJUw7oJg1JoGiVgj8P4JeGDjnZHnmLVa5bpJhVCbMhyM7JLXNQJzFWTGC27TQBbthxCfQaKdusYnvZnKPDJWSeceYEFzepUnsWhQtyhbb73FzqgWC4eKEFKAZJqT2LuuSoxmihJ9acnFK7Ze23KTVYgDyMKY61VXADxmSrBvwUtxCaW4nQtnbMxiPMNnDMzeixqsFMBtN72j5UqhiLRY99k6SE7Qf5f29haNSBNSXCFFHChPKNTwJrehkofBdKUhh2VGPqZDNoefWUwfudeu83t85bmjv8Q3LrQSkFgFjRT5tLo8TMawNXoZCrQpyZrEvnodMDDUUNf3NL7rxyv3gM1KrTWjYaWXFU2RAsFee2Q2MTwUW7hR25cJvSFuB1BX2bfkoCbiMk923tHZGU2g7rSKF1GDDkXAc1EvFFD4iGbh1Q5t6hPRhBV8PEncdcCWGq5uAL5D4Bjr6VXG8uNeCy5oYWNgbZ5JRSfm7QEhPv8Fy9AKMgmCxDGMF9dVEaU6tw2BAnJavQdfrxChbDBeQXzCbCfep6oei6n2LZdE5Q84wp7eoQFE5Cwuo23tHkbJCaw2njFi3WGBbA7uGZaGHJPyB2rofTWBiSUXZnP2hiE9bjJghAcDm1M4LVLfWvhZmFEnyeru3VWMETnetz1BYLUC5MJGFXuhnHwWh7F6r74FDyhdswYop4eWPbyrXMXmUQEccTGd2NaT8g2VHADZ76gMC6BjWESvcnz2D4n8XwdmM7ZQ1jFwhuXrBfrb1dwRasyXxxHMGAC2onatNiExyeQ9G1W5LwqNLAh9hvcaNTGaYKYXoceVzLkgm6e5WMkLsCwuZXvB\" } }","title":"get_spend_proof"},{"location":"interacting/monero-wallet-rpc-reference/#get_transfer_by_txid","text":"Show information about a transfer to/from this address. Alias: None . Inputs: txid - string; Transaction ID used to find the transfer. account_index - unsigned int; (Optional) Index of the account to query for the transfer. Outputs: transfer - JSON object containing payment information: address - string; Address that transferred the funds. Base58 representation of the public keys. amount - unsigned int; Amount of this transfer. confirmations - unsigned int; Number of block mined since the block containing this transaction (or block height at which the transaction should be added to a block if not yet confirmed). destinations - array of JSON objects containing transfer destinations: amount - unsigned int; Amount transferred to this destination. address - string; Address for this destination. Base58 representation of the public keys. double_spend_seen - boolean; True if the key image(s) for the transfer have been seen before. fee - unsigned int; Transaction fee for this transfer. height - unsigned int; Height of the first block that confirmed this transfer. note - string; Note about this transfer. payment_id - string; Payment ID for this transfer. subaddr_index - JSON object containing the major & minor subaddress index: major - unsigned int; Account index for the subaddress. minor - unsigned int; Index of the subaddress under the account. suggested_confirmations_threshold - unsigned int; Estimation of the confirmations needed for the transaction to be included in a block. timestamp - unsigned int; POSIX timestamp for the block that confirmed this transfer (or timestamp submission if not mined yet). txid - string; Transaction ID of this transfer (same as input TXID). type - string; Type of transfer, one of the following: \"in\", \"out\", \"pending\", \"failed\", \"pool\" unlock_time - unsigned int; Number of blocks until transfer is safely spendable. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_transfer_by_txid\",\"params\":{\"txid\":\"c36258a276018c3a4bc1f195a7fb530f50cd63a4fa765fb7c6f7f49fc051762a\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"transfer\": { \"address\": \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\", \"amount\": 300000000000, \"confirmations\": 1, \"destinations\": [{ \"address\": \"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\", \"amount\": 100000000000 },{ \"address\": \"77Vx9cs1VPicFndSVgYUvTdLCJEZw9h81hXLMYsjBCXSJfUehLa9TDW3Ffh45SQa7xb6dUs18mpNxfUhQGqfwXPSMrvKhVp\", \"amount\": 200000000000 }], \"double_spend_seen\": false, \"fee\": 21650200000, \"height\": 153624, \"note\": \"\", \"payment_id\": \"0000000000000000\", \"subaddr_index\": { \"major\": 0, \"minor\": 0 }, \"suggested_confirmations_threshold\": 1, \"timestamp\": 1535918400, \"txid\": \"c36258a276018c3a4bc1f195a7fb530f50cd63a4fa765fb7c6f7f49fc051762a\", \"type\": \"out\", \"unlock_time\": 0 } } }","title":"get_transfer_by_txid"},{"location":"interacting/monero-wallet-rpc-reference/#get_transfers","text":"Returns a list of transfers. Alias: None . Inputs: in - boolean; (Optional) Include incoming transfers. out - boolean; (Optional) Include outgoing transfers. pending - boolean; (Optional) Include pending transfers. failed - boolean; (Optional) Include failed transfers. pool - boolean; (Optional) Include transfers from the daemon's transaction pool. filter_by_height - boolean; (Optional) Filter transfers by block height. min_height - unsigned int; (Optional) Minimum block height to scan for transfers, if filtering by height is enabled. max_height - unsigned int; (Opional) Maximum block height to scan for transfers, if filtering by height is enabled (defaults to max block height). account_index - unsigned int; (Optional) Index of the account to query for transfers. (defaults to 0) subaddr_indices - array of unsigned int; (Optional) List of subaddress indices to query for transfers. (defaults to 0) Outputs: in array of transfers: address - string; Public address of the transfer. amount - unsigned int; Amount transferred. confirmations - unsigned int; Number of block mined since the block containing this transaction (or block height at which the transaction should be added to a block if not yet confirmed). double_spend_seen - boolean; True if the key image(s) for the transfer have been seen before. fee - unsigned int; Transaction fee for this transfer. height - unsigned int; Height of the first block that confirmed this transfer (0 if not mined yet). note - string; Note about this transfer. payment_id - string; Payment ID for this transfer. subaddr_index - JSON object containing the major & minor subaddress index: major - unsigned int; Account index for the subaddress. minor - unsigned int; Index of the subaddress under the account. suggested_confirmations_threshold - unsigned int; Estimation of the confirmations needed for the transaction to be included in a block. timestamp - unsigned int; POSIX timestamp for when this transfer was first confirmed in a block (or timestamp submission if not mined yet). txid - string; Transaction ID for this transfer. type - string; Transfer type: \"in\" unlock_time - unsigned int; Number of blocks until transfer is safely spendable. out array of transfers (see above). pending array of transfers (see above). failed array of transfers (see above). pool array of transfers (see above). Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_transfers\",\"params\":{\"in\":true,\"account_index\":1}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"in\": [{ \"address\": \"77Vx9cs1VPicFndSVgYUvTdLCJEZw9h81hXLMYsjBCXSJfUehLa9TDW3Ffh45SQa7xb6dUs18mpNxfUhQGqfwXPSMrvKhVp\", \"amount\": 200000000000, \"confirmations\": 1, \"double_spend_seen\": false, \"fee\": 21650200000, \"height\": 153624, \"note\": \"\", \"payment_id\": \"0000000000000000\", \"subaddr_index\": { \"major\": 1, \"minor\": 0 }, \"suggested_confirmations_threshold\": 1, \"timestamp\": 1535918400, \"txid\": \"c36258a276018c3a4bc1f195a7fb530f50cd63a4fa765fb7c6f7f49fc051762a\", \"type\": \"in\", \"unlock_time\": 0 }] } }","title":"get_transfers"},{"location":"interacting/monero-wallet-rpc-reference/#get_tx_key","text":"Get transaction secret key from transaction id. Alias: None . Inputs: txid - string; transaction id. Outputs: tx_key - string; transaction secret key. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_tx_key\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"tx_key\": \"feba662cf8fb6d0d0da18fc9b70ab28e01cc76311278fdd7fe7ab16360762b06\" } }","title":"get_tx_key"},{"location":"interacting/monero-wallet-rpc-reference/#get_tx_notes","text":"Get string notes for transactions. Alias: None . Inputs: txids - array of string; transaction ids Outputs: notes - array of string; notes for the transactions Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_tx_notes\",\"params\":{\"txids\":[\"3292e83ad28fc1cc7bc26dbd38862308f4588680fbf93eae3e803cddd1bd614f\"]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"notes\": [\"This is an example\"] } }","title":"get_tx_notes"},{"location":"interacting/monero-wallet-rpc-reference/#get_tx_proof","text":"Get transaction signature to prove it. Alias: None . Inputs: txid - string; transaction id. address - string; destination public address of the transaction. message - string; (Optional) add a message to the signature to further authenticate the prooving process. Outputs: signature - string; transaction signature. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_tx_proof\",\"params\":{\"txid\":\"19d5089f9469db3d90aca9024dfcb17ce94b948300101c8345a5e9f7257353be\",\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\",\"message\":\"this is my transaction\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"signature\": \"InProofV13vqBCT6dpSAXkypZmSEMPGVnNRFDX2vscUYeVS4WnSVnV5BwLs31T9q6Etfj9Wts6tAxSAS4gkMeSYzzLS7Gt4vvCSQRh9niGJMUDJsB5hTzb2XJiCkUzWkkcjLFBBRVD5QZ\" } }","title":"get_tx_proof"},{"location":"interacting/monero-wallet-rpc-reference/#get_version","text":"Get RPC version Major & Minor integer-format, where Major is the first 16 bits and Minor the last 16 bits. Alias: None . Inputs: None . Outputs: version - unsigned int; RPC version, formatted with Major * 2^16 + Minor (Major encoded over the first 16 bits, and Minor over the last 16 bits). Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_version\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"version\": 65539 } }","title":"get_version"},{"location":"interacting/monero-wallet-rpc-reference/#import_key_images","text":"Import signed key images list and verify their spent status. Alias: None . Inputs: signed_key_images - array of signed key images: key_image - string; signature - string; Outputs: height - unsigned int; spent - unsigned int; Amount (in atomic units) spent from those key images. unspent - unsigned int; Amount (in atomic units) still available from those key images. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"import_key_images\", \"params\":{\"signed_key_images\":[{\"key_image\":\"cd35239b72a35e26a57ed17400c0b66944a55de9d5bda0f21190fed17f8ea876\",\"signature\":\"c9d736869355da2538ab4af188279f84138c958edbae3c5caf388a63cd8e780b8c5a1aed850bd79657df659422c463608ea4e0c730ba9b662c906ae933816d00\"},{\"key_image\":\"65158a8ee5a3b32009b85a307d85b375175870e560e08de313531c7dbbe6fc19\",\"signature\":\"c96e40d09dfc45cfc5ed0b76bfd7ca793469588bb0cf2b4d7b45ef23d40fd4036057b397828062e31700dc0c2da364f50cd142295a8405b9fe97418b4b745d0c\"}]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"height\": 76428, \"spent\": 62708953408711, \"unspent\": 0 } }","title":"import_key_images"},{"location":"interacting/monero-wallet-rpc-reference/#import_multisig_info","text":"Import multisig info from other participants. Alias: None . Inputs: info - array of string; List of multisig info in hex format from other participants. Outputs: n_outputs - unsigned int; Number of outputs signed with those multisig info. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"import_multisig_info\",\"params\":{\"info\":[\"...multisig_info...\"]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"n_outputs\": 35 } }","title":"import_multisig_info"},{"location":"interacting/monero-wallet-rpc-reference/#import_outputs","text":"Import outputs in hex format. Alias: None . Inputs: outputs_data_hex - string; wallet outputs in hex format. Outputs: num_imported - unsigned int; number of outputs imported. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"import_outputs\",\"params\":{\"outputs_data_hex\":\"...outputs...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"num_imported\": 6400 } }","title":"import_outputs"},{"location":"interacting/monero-wallet-rpc-reference/#incoming_transfers","text":"Return a list of incoming transfers to the wallet. Inputs: transfer_type - string; \"all\": all the transfers, \"available\": only transfers which are not yet spent, OR \"unavailable\": only transfers which are already spent. account_index - unsigned int; (Optional) Return transfers for this account. (defaults to 0) subaddr_indices - array of unsigned int; (Optional) Return transfers sent to these subaddresses. verbose - boolean; (Optional) Enable verbose output, return key image if true. Outputs: transfers - list of: amount - unsigned int; Amount of this transfer. global_index - unsigned int; Mostly internal use, can be ignored by most users. key_image - string; Key image for the incoming transfer's unspent output (empty unless verbose is true). spent - boolean; Indicates if this transfer has been spent. subaddr_index - unsigned int; Subaddress index for incoming transfer. tx_hash - string; Several incoming transfers may share the same hash if they were in the same transaction. tx_size - unsigned int; Size of transaction in bytes. Example, get all transfers: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"incoming_transfers\",\"params\":{\"transfer_type\":\"all\",\"account_index\":0,\"subaddr_indices\":[3],\"verbose\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"transfers\": [{ \"amount\": 60000000000000, \"global_index\": 122405, \"key_image\": \"768f5144777eb23477ab7acf83562581d690abaf98ca897c03a9d2b900eb479b\", \"spent\": true, \"subaddr_index\": 3, \"tx_hash\": \"f53401f21c6a43e44d5dd7a90eba5cf580012ad0e15d050059136f8a0da34f6b\", \"tx_size\": 159 },{ \"amount\": 27126892247503, \"global_index\": 594994, \"key_image\": \"7e561394806afd1be61980cc3431f6ef3569fa9151cd8d234f8ec13aa145695e\", \"spent\": false, \"subaddr_index\": 3, \"tx_hash\": \"106d4391a031e5b735ded555862fec63233e34e5fa4fc7edcfdbe461c275ae5b\", \"tx_size\": 157 },{ \"amount\": 27169374733655, \"global_index\": 594997, \"key_image\": \"e76c0a3bfeaae35e4173712f782eb34011198e26b990225b71aa787c8ba8a157\", \"spent\": false, \"subaddr_index\": 3, \"tx_hash\": \"0bd959b59117ee1254bd8e5aa8e77ec04ef744144a1ffb2d5c1eb9380a719621\", \"tx_size\": 158 }] } } Example, get available transfers: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"incoming_transfers\",\"params\":{\"transfer_type\":\"available\",\"account_index\":0,\"subaddr_indices\":[3],\"verbose\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"transfers\": [{ \"amount\": 27126892247503, \"global_index\": 594994, \"key_image\": \"7e561394806afd1be61980cc3431f6ef3569fa9151cd8d234f8ec13aa145695e\", \"spent\": false, \"subaddr_index\": 3, \"tx_hash\": \"106d4391a031e5b735ded555862fec63233e34e5fa4fc7edcfdbe461c275ae5b\", \"tx_size\": 157 },{ \"amount\": 27169374733655, \"global_index\": 594997, \"key_image\": \"e76c0a3bfeaae35e4173712f782eb34011198e26b990225b71aa787c8ba8a157\", \"spent\": false, \"subaddr_index\": 3, \"tx_hash\": \"0bd959b59117ee1254bd8e5aa8e77ec04ef744144a1ffb2d5c1eb9380a719621\", \"tx_size\": 158 }] } } Example, get unavailable transfers: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"incoming_transfers\",\"params\":{\"transfer_type\":\"unavailable\",\"account_index\":0,\"subaddr_indices\":[3],\"verbose\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"transfers\": [{ \"amount\": 60000000000000, \"global_index\": 122405, \"key_image\": \"768f5144777eb23477ab7acf83562581d690abaf98ca897c03a9d2b900eb479b\", \"spent\": true, \"subaddr_index\": 3, \"tx_hash\": \"f53401f21c6a43e44d5dd7a90eba5cf580012ad0e15d050059136f8a0da34f6b\", \"tx_size\": 159 }] } }","title":"incoming_transfers"},{"location":"interacting/monero-wallet-rpc-reference/#is_multisig","text":"Check if a wallet is a multisig one. Alias: None . Inputs: None . Outputs: multisig - boolean; States if the wallet is multisig ready - boolean; threshold - unsigned int; Amount of signature needed to sign a transfer. total - unsigned int; Total amount of signature in the multisig wallet. Example for a non-multisig wallet: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"is_multisig\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"multisig\": false, \"ready\": false, \"threshold\": 0, \"total\": 0 } } Example for a multisig wallet: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"is_multisig\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"multisig\": true, \"ready\": true, \"threshold\": 2, \"total\": 2 } }","title":"is_multisig"},{"location":"interacting/monero-wallet-rpc-reference/#label_account","text":"Label an account. Alias: None . Inputs: account_index - unsigned int; Apply label to account at this index. label - string; Label for the account. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"label_account\",\"params\":{\"account_index\":0,\"label\":\"Primary account\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"account_tags\": [{ \"accounts\": [0,1], \"label\": \"\", \"tag\": \"myTag\" }] } }","title":"label_account"},{"location":"interacting/monero-wallet-rpc-reference/#label_address","text":"Label an address. Alias: None . Inputs: index - subaddress index; JSON Object containing the major & minor address index: major - unsigned int; Account index for the subaddress. minor - unsigned int; Index of the subaddress in the account. label - string; Label for the address. Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"label_address\",\"params\":{\"index\":{\"major\":0,\"minor\":5},\"label\":\"myLabel\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"label_address"},{"location":"interacting/monero-wallet-rpc-reference/#make_integrated_address","text":"Make an integrated address from the wallet address and a payment id. Alias: None . Inputs: standard_address - string; (Optional, defaults to primary address) Destination public address. payment_id - string; (Optional, defaults to a random ID) 16 characters hex encoded. Outputs: integrated_address - string payment_id - string; hex encoded; Example (Payment ID is empty, use a random ID): $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"make_integrated_address\",\"params\":{\"standard_address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"integrated_address\": \"5F38Rw9HKeaLQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZXCkbHUXdPHyiUeRyokn\", \"payment_id\": \"420fa29b2d9a49f5\" } }","title":"make_integrated_address"},{"location":"interacting/monero-wallet-rpc-reference/#make_multisig","text":"Make a wallet multisig by importing peers multisig string. Alias: None . Inputs: multisig_info - array of string; List of multisig string from peers. threshold - unsigned int; Amount of signatures needed to sign a transfer. Must be less or equal than the amount of signature in multisig_info . password - string; Wallet password Outputs: address - string; multisig wallet address. multisig_info - string; Multisig string to share with peers to create the multisig wallet (extra step for N-1/N wallets). Example for 2/2 Multisig Wallet: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"make_multisig\",\"params\":{\"multisig_info\":[\"MultisigV1K4tGGe8QirZdHgTYoBZMumSug97fdDyM3Z63M3ZY5VXvAdoZvx16HJzPCP4Rp2ABMKUqLD2a74ugMdBfrVpKt4BwD8qCL5aZLrsYWoHiA7JJwDESuhsC3eF8QC9UMvxLXEMsMVh16o98GnKRYz1HCKXrAEWfcrCHyz3bLW1Pdggyowop\"],\"threshold\":2}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"address\": \"55SoZTKH7D39drxfgT62k8T4adVFjmDLUXnbzEKYf1MoYwnmTNKKaqGfxm4sqeKCHXQ5up7PVxrkoeRzXu83d8xYURouMod\", \"multisig_info\": \"\" } } Example for 2/3 Multisig Wallet: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"make_multisig\",\"params\":{\"multisig_info\":[\"MultisigV1MTVm4DZAdJw1PyVutpSy8Q4WisZBCFRAaZY7hhQnMwr5AZ4swzThyaSiVVQM5FHj1JQi3zPKhQ4k81BZkPSEaFjwRJtbfqfJcVvCqRnmBVcWVxhnihX5s8fZWBCjKrzT3CS95spG4dzNzJSUcjheAkLzCpVmSzGtgwMhAS3Vuz9Pas24\",\"MultisigV1TEx58ycKCd6ADCfxF8hALpcdSRAkhZTi1bu4Rs6FdRC98EdB1LY7TAkMxasM55khFgcxrSXivaSr5FCMyJGHmojm1eE4HpGWPeZKv6cgCTThRzC4u6bkkSoFQdbzWN92yn1XEjuP2XQrGHk81mG2LMeyB51MWKJAVF99Pg9mX2BpmYFj\"],\"threshold\":2}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"address\": \"51sLpF8fWaK1111111111111111111111111111111111ABVbHNf1JFWJyFp5YZgZRQ44RiviJi1sPHgLVMbckRsDkTRgKS\", \"multisig_info\": \"MultisigxV18jCaYAQQvzCMUJaAWMCaAbAoHpAD6WPmYDmLtBtazD654E8RWkLaGRf29fJ3stU471MELKxwufNYeigP7LoE4tn2Sscwn5g7PyCfcBc1V4ffRHY3Kxqq6VocSCUTncpVeUskaDKuTAWtdB9VTBGW7iG1cd7Zm1dYgur3CiemkGjRUAj9bL3xTEuyaKGYSDhtpFZFp99HQX57EawhiRHk3qq4hjWX\" } }","title":"make_multisig"},{"location":"interacting/monero-wallet-rpc-reference/#make_uri","text":"Create a payment URI using the official URI spec. Alias: None . Inputs: address - string; Wallet address amount - unsigned int; (optional) the integer amount to receive, in atomic units payment_id - string; (optional) 16 or 64 character hexadecimal payment id recipient_name - string; (optional) name of the payment recipient tx_description - string; (optional) Description of the reason for the tx Outputs: uri - string; This contains all the payment input information as a properly formatted payment URI Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"make_uri\",\"params\":{\"address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\",\"amount\":10,\"payment_id\":\"420fa29b2d9a49f5\",\"tx_description\":\"Testing out the make_uri function.\",\"recipient_name\":\"el00ruobuob Stagenet wallet\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"uri\": \"monero:55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt?tx_payment_id=420fa29b2d9a49f5&tx_amount=0.000000000010&recipient_name=el00ruobuob%20Stagenet%20wallet&tx_description=Testing%20out%20the%20make_uri%20function.\" } }","title":"make_uri"},{"location":"interacting/monero-wallet-rpc-reference/#open_wallet","text":"Open a wallet. You need to have set the argument \"\u2013wallet-dir\" when launching monero-wallet-rpc to make this work. Alias: None . Inputs: filename - string; wallet name stored in \u2013wallet-dir. password - string; (Optional) only needed if the wallet has a password defined. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"open_wallet\",\"params\":{\"filename\":\"mytestwallet\",\"password\":\"mytestpassword\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"open_wallet"},{"location":"interacting/monero-wallet-rpc-reference/#parse_uri","text":"Parse a payment URI to get payment information. Alias: None . Inputs: uri - string; This contains all the payment input information as a properly formatted payment URI Outputs: uri - JSON object containing payment information: address - string; Wallet address amount - unsigned int; Decimal amount to receive, in coin units (0 if not provided) payment_id - string; 16 or 64 character hexadecimal payment id (empty if not provided) recipient_name - string; Name of the payment recipient (empty if not provided) tx_description - string; Description of the reason for the tx (empty if not provided) Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"parse_uri\",\"params\":{\"uri\":\"monero:55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt?tx_payment_id=420fa29b2d9a49f5&tx_amount=0.000000000010&recipient_name=el00ruobuob%20Stagenet%20wallet&tx_description=Testing%20out%20the%20make_uri%20function.\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"uri\": { \"address\": \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\", \"amount\": 10, \"payment_id\": \"420fa29b2d9a49f5\", \"recipient_name\": \"el00ruobuob Stagenet wallet\", \"tx_description\": \"Testing out the make_uri function.\" } } }","title":"parse_uri"},{"location":"interacting/monero-wallet-rpc-reference/#prepare_multisig","text":"Prepare a wallet for multisig by generating a multisig string to share with peers. Alias: None . Inputs: None . Outputs: multisig_info - string; Multisig string to share with peers to create the multisig wallet. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"prepare_multisig\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"multisig_info\": \"MultisigV1BFdxQ653cQHB8wsj9WJQd2VdnjxK89g5M94dKPBNw22reJnyJYKrz6rJeXdjFwJ3Mz6n4qNQLd6eqUZKLiNzJFi3UPNVcTjtkG2aeSys9sYkvYYKMZ7chCxvoEXVgm74KKUcUu4V8xveCBFadFuZs8shnxBWHbcwFr5AziLr2mE7KHJT\" } }","title":"prepare_multisig"},{"location":"interacting/monero-wallet-rpc-reference/#query_key","text":"Return the spend or view private key. Alias: None . Inputs: key_type - string; Which key to retrieve: \"mnemonic\" - the mnemonic seed (older wallets do not have one) OR \"view_key\" - the view key Outputs: key - string; The view key will be hex encoded, while the mnemonic will be a string of words. Example (Query view key): $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"query_key\",\"params\":{\"key_type\":\"view_key\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"key\": \"0a1a38f6d246e894600a3e27238a064bf5e8d91801df47a17107596b1378e501\" } } Example (Query mnemonic key): $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"query_key\",\"params\":{\"key_type\":\"mnemonic\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"key\": \"vocal either anvil films dolphin zeal bacon cuisine quote syndrome rejoices envy okay pancakes tulips lair greater petals organs enmity dedicated oust thwart tomorrow tomorrow\" } }","title":"query_key"},{"location":"interacting/monero-wallet-rpc-reference/#refresh","text":"Refresh a wallet after openning. Alias: None . Inputs: start_height - unsigned int; (Optional) The block height from which to start refreshing. Outputs: blocks_fetched - unsigned int; Number of new blocks scanned. received_money - boolean; States if transactions to the wallet have been found in the blocks. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"refresh\",\"params\":{\"start_height\":100000}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"blocks_fetched\": 24, \"received_money\": true } }","title":"refresh"},{"location":"interacting/monero-wallet-rpc-reference/#relay_tx","text":"Relay a transaction previously created with \"do_not_relay\":true . Alias: None . Inputs: hex - string; transaction metadata returned from a transfer method with get_tx_metadata set to true . Outputs: tx_hash - String for the publically searchable transaction hash. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"relay_tx\",\"params\":{\"hex\":\"...tx_metadata...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"tx_hash\": \"1c42dcc5672bb09bccf33fb1e9ab4a498af59a6dbd33b3d0cfb289b9e0e25fa5\" } }","title":"relay_tx"},{"location":"interacting/monero-wallet-rpc-reference/#rescan_blockchain","text":"Rescan the blockchain from scratch, losing any information which can not be recovered from the blockchain itself. This includes destination addresses, tx secret keys, tx notes, etc. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"rescan_blockchain\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"rescan_blockchain"},{"location":"interacting/monero-wallet-rpc-reference/#rescan_spent","text":"Rescan the blockchain for spent outputs. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"rescan_spent\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"rescan_spent"},{"location":"interacting/monero-wallet-rpc-reference/#set_account_tag_description","text":"Set description for an account tag. Alias: None . Inputs: tag - string; Set a description for this tag. description - string; Description for the tag. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"set_account_tag_description\",\"params\":{\"tag\":\"myTag\",\"description\":\"Test tag\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"set_account_tag_description"},{"location":"interacting/monero-wallet-rpc-reference/#set_attribute","text":"Set arbitrary attribute. Alias: None . Inputs: key - string; attribute name value - string; attribute value Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"set_attribute\",\"params\":{\"key\":\"my_attribute\",\"value\":\"my_value\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"set_attribute"},{"location":"interacting/monero-wallet-rpc-reference/#set_tx_notes","text":"Set arbitrary string notes for transactions. Alias: None . Inputs: txids - array of string; transaction ids notes - array of string; notes for the transactions Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"set_tx_notes\",\"params\":{\"txids\":[\"3292e83ad28fc1cc7bc26dbd38862308f4588680fbf93eae3e803cddd1bd614f\"],\"notes\":[\"This is an example\"]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"set_tx_notes"},{"location":"interacting/monero-wallet-rpc-reference/#sign","text":"Sign a string. Alias: None . Inputs: data - string; Anything you need to sign. Outputs: signature - string; Signature generated against the \"data\" and the account public address. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sign\",\"params\":{\"data\":\"This is sample data to be signed\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"signature\": \"SigV14K6G151gycjiGxjQ74tKX6A2LwwghvuHjcDeuRFQio5LS6Gb27BNxjYQY1dPuUvXkEbGQUkiHSVLPj4nJAHRrrw3\" } }","title":"sign"},{"location":"interacting/monero-wallet-rpc-reference/#sign_multisig","text":"Sign a transaction in multisig. Alias: None . Inputs: tx_data_hex - string; Multisig transaction in hex format, as returned by transfer under multisig_txset . Outputs: tx_data_hex - string; Multisig transaction in hex format. tx_hash_list - array of string; List of transaction Hash. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sign_multisig\",\"params\":{\"tx_data_hex\":\"...multisig_txset...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"tx_data_hex\": \"...multisig_txset...\", \"tx_hash_list\": [\"4996091b61c1be112c1097fd5e97d8ff8b28f0e5e62e1137a8c831bacf034f2d\"] } }","title":"sign_multisig"},{"location":"interacting/monero-wallet-rpc-reference/#sign_transfer","text":"Sign a transaction created on a read-only wallet (in cold-signing process) Alias: None . Inputs: unsigned_txset - string. Set of unsigned tx returned by \"transfer\" or \"transfer_split\" methods. export_raw - boolean; (Optional) If true, return the raw transaction data. (Defaults to false) Outputs: signed_txset - string. Set of signed tx to be used for submitting transfer. tx_hash_list - array of: string. The tx hashes of every transaction. tx_raw_list - array of: string. The tx raw data of every transaction. In the example below, we first generate an unsigned_txset on a read only wallet before signing it: Generate unsigned_txset using the above \"transfer\" method on read-only wallet: curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"transfer\",\"params\":{\"destinations\":[{\"amount\":1000000000000,\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\"}],\"account_index\":0,\"subaddr_indices\":[0],\"priority\":0,\"ring_size\":7,\"do_not_relay\":true,\"get_tx_hex\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"amount\": 1000000000000, \"fee\": 15202740000, \"multisig_txset\": \"\", \"tx_blob\": \"...long_hex...\", \"tx_hash\": \"c648ba0a049e5ce4ec21361dbf6e4b21eac0f828eea9090215de86c76b31d0a4\", \"tx_key\": \"\", \"tx_metadata\": \"\", \"unsigned_txset\": \"...long_hex...\" } } Sign tx using the previously generated unsigned_txset $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sign_transfer\",\"params\":{\"unsigned_txset\":...long_hex...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"signed_txset\": \"...long_hex...\", \"tx_hash_list\": [\"ff2e2d49fbfb1c9a55754f786576e171c8bf21b463a74438df604b7fa6cebc6d\"] } }","title":"sign_transfer"},{"location":"interacting/monero-wallet-rpc-reference/#split_integrated_address","text":"Retrieve the standard address and payment id corresponding to an integrated address. Alias: None . Inputs: integrated_address - string Outputs: is_subaddress - boolean; States if the address is a subaddress payment - string; hex encoded standard_address - string Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"split_integrated_address\",\"params\":{\"integrated_address\": \"5F38Rw9HKeaLQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZXCkbHUXdPHyiUeRyokn\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"is_subaddress\": false, \"payment_id\": \"420fa29b2d9a49f5\", \"standard_address\": \"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\" } }","title":"split_integrated_address"},{"location":"interacting/monero-wallet-rpc-reference/#start_mining","text":"Start mining in the Monero daemon. Alias: None . Inputs: threads_count - unsigned int; Number of threads created for mining. do_background_mining - boolean; Allow to start the miner in smart mining mode. ignore_battery - boolean; Ignore battery status (for smart mining only) Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"start_mining\",\"params\":{\"threads_count\":1,\"do_background_mining\":true,\"ignore_battery\":false}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"start_mining"},{"location":"interacting/monero-wallet-rpc-reference/#stop_mining","text":"Stop mining in the Monero daemon. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"stop_mining\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"stop_mining"},{"location":"interacting/monero-wallet-rpc-reference/#stop_wallet","text":"Stops the wallet, storing the current state. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"stop_wallet\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"stop_wallet"},{"location":"interacting/monero-wallet-rpc-reference/#store","text":"Save the wallet file. Alias: None . Inputs: None . Outputs: None . Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"store\"}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"store"},{"location":"interacting/monero-wallet-rpc-reference/#submit_multisig","text":"Submit a signed multisig transaction. Alias: None . Inputs: tx_data_hex - string; Multisig transaction in hex format, as returned by sign_multisig under tx_data_hex . Outputs: tx_hash_list - array of string; List of transaction Hash. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"submit_multisig\",\"params\":{\"tx_data_hex\":\"...tx_data_hex...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"tx_hash_list\": [\"4996091b61c1be112c1097fd5e97d8ff8b28f0e5e62e1137a8c831bacf034f2d\"] } }","title":"submit_multisig"},{"location":"interacting/monero-wallet-rpc-reference/#submit_transfer","text":"Submit a previously signed transaction on a read-only wallet (in cold-signing process). Alias: None . Inputs: tx_data_hex - string; Set of signed tx returned by \"sign_transfer\" Outputs: tx_hash_list - array of: string. The tx hashes of every transaction. In the example below, we submit the transfer using the signed_txset generated above: curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"submit_transfer\",\"params\":{\"tx_data_hex\":...long_hex...\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"tx_hash_list\": [\"40fad7c828bb383ac02648732f7afce9adc520ba5629e1f5d9c03f584ac53d74\"] } }","title":"submit_transfer"},{"location":"interacting/monero-wallet-rpc-reference/#sweep_all","text":"Send all unlocked balance to an address. Alias: None . Inputs: address - string; Destination public address. account_index - unsigned int; Sweep transactions from this account. subaddr_indices - array of unsigned int; (Optional) Sweep from this set of subaddresses in the account. priority - unsigned int; (Optional) Priority for sending the sweep transfer, partially determines fee. mixin - unsigned int; Number of outputs from the blockchain to mix with (0 means no mixing). ring_size - unsigned int; Sets ringsize to n (mixin + 1). unlock_time - unsigned int; Number of blocks before the monero can be spent (0 to not add a lock). payment_id - string; (Optional) Random 32-byte/64-character hex string to identify a transaction. get_tx_keys - boolean; (Optional) Return the transaction keys after sending. below_amount - unsigned int; (Optional) Include outputs below this amount. do_not_relay - boolean; (Optional) If true, do not relay this sweep transfer. (Defaults to false) get_tx_hex - boolean; (Optional) return the transactions as hex encoded string. (Defaults to false) get_tx_metadata - boolean; (Optional) return the transaction metadata as a string. (Defaults to false) Outputs: tx_hash_list - array of: string. The tx hashes of every transaction. tx_key_list - array of: string. The transaction keys for every transaction. amount_list - array of: integer. The amount transferred for every transaction. fee_list - array of: integer. The amount of fees paid for every transaction. tx_blob_list - array of: string. The tx as hex string for every transaction. tx_metadata_list - array of: string. List of transaction metadata needed to relay the transactions later. multisig_txset - string. The set of signing keys used in a multisig transaction (empty for non-multisig). unsigned_txset - string. Set of unsigned tx for cold-signing purposes. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sweep_all\",\"params\":{\"address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\",\"subaddr_indices\":[4],\"ring_size\":7,\"unlock_time\":0,\"get_tx_keys\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"amount_list\": [9985885770000], \"fee_list\": [14114230000], \"multisig_txset\": \"\", \"tx_hash_list\": [\"ab4b6b65cc8cd8c9dd317d0b90d97582d68d0aa1637b0065b05b61f9a66ea5c5\"], \"tx_key_list\": [\"b9b4b39d3bb3062ddb85ec0266d4df39058f4c86077d99309f218ce4d76af607\"], \"unsigned_txset\": \"\" } }","title":"sweep_all"},{"location":"interacting/monero-wallet-rpc-reference/#sweep_dust","text":"Send all dust outputs back to the wallet's, to make them easier to spend (and mix). Alias: sweep_unmixable . Inputs: get_tx_keys - boolean; (Optional) Return the transaction keys after sending. do_not_relay - boolean; (Optional) If true, the newly created transaction will not be relayed to the monero network. (Defaults to false) get_tx_hex - boolean; (Optional) Return the transactions as hex string after sending. (Defaults to false) get_tx_metadata - boolean; (Optional) Return list of transaction metadata needed to relay the transfer later. (Defaults to false) Outputs: tx_hash_list - array of: string. The tx hashes of every transaction. tx_key_list - array of: string. The transaction keys for every transaction. amount_list - array of: integer. The amount transferred for every transaction. fee_list - array of: integer. The amount of fees paid for every transaction. tx_blob_list - array of: string. The tx as hex string for every transaction. tx_metadata_list - array of: string. List of transaction metadata needed to relay the transactions later. multisig_txset - string. The set of signing keys used in a multisig transaction (empty for non-multisig). unsigned_txset - string. Set of unsigned tx for cold-signing purposes. Example (In this example, sweep_dust returns nothing because there are no funds to sweep): $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sweep_dust\",\"params\":{\"get_tx_keys\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"multisig_txset\": \"\", \"unsigned_txset\": \"\" } }","title":"sweep_dust"},{"location":"interacting/monero-wallet-rpc-reference/#sweep_single","text":"Send all of a specific unlocked output to an address. Alias: None . Inputs: address - string; Destination public address. account_index - unsigned int; Sweep transactions from this account. subaddr_indices - array of unsigned int; (Optional) Sweep from this set of subaddresses in the account. priority - unsigned int; (Optional) Priority for sending the sweep transfer, partially determines fee. mixin - unsigned int; Number of outputs from the blockchain to mix with (0 means no mixing). ring_size - unsigned int; Sets ringsize to n (mixin + 1). unlock_time - unsigned int; Number of blocks before the monero can be spent (0 to not add a lock). payment_id - string; (Optional) Random 32-byte/64-character hex string to identify a transaction. get_tx_keys - boolean; (Optional) Return the transaction keys after sending. key_image - string; Key image of specific output to sweep. below_amount - unsigned int; (Optional) Include outputs below this amount. do_not_relay - boolean; (Optional) If true, do not relay this sweep transfer. (Defaults to false) get_tx_hex - boolean; (Optional) return the transactions as hex encoded string. (Defaults to false) get_tx_metadata - boolean; (Optional) return the transaction metadata as a string. (Defaults to false) Outputs: tx_hash_list - array of: string. The tx hashes of every transaction. tx_key_list - array of: string. The transaction keys for every transaction. amount_list - array of: integer. The amount transferred for every transaction. fee_list - array of: integer. The amount of fees paid for every transaction. tx_blob_list - array of: string. The tx as hex string for every transaction. tx_metadata_list - array of: string. List of transaction metadata needed to relay the transactions later. multisig_txset - string. The set of signing keys used in a multisig transaction (empty for non-multisig). unsigned_txset - string. Set of unsigned tx for cold-signing purposes. Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"sweep_single\",\"params\":{\"address\":\"74Jsocx8xbpTBEjm3ncKE5LBQbiJouyCDaGhgSiebpvNDXZnTAbW2CmUR5SsBeae2pNk9WMVuz6jegkC4krUyqRjA6VjoLD\",\"ring_size\":7,\"unlock_time\":0,\"key_image\":\"a7834459ef795d2efb6f665d2fd758c8d9288989d8d4c712a68f8023f7804a5e\",\"get_tx_keys\":true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"amount\": 27126892247503, \"fee\": 14111630000, \"multisig_txset\": \"\", \"tx_blob\": \"\", \"tx_hash\": \"106d4391a031e5b735ded555862fec63233e34e5fa4fc7edcfdbe461c275ae5b\", \"tx_key\": \"\", \"tx_metadata\": \"\", \"unsigned_txset\": \"\" } }","title":"sweep_single"},{"location":"interacting/monero-wallet-rpc-reference/#tag_accounts","text":"Apply a filtering tag to a list of accounts. Alias: None . Inputs: tag - string; Tag for the accounts. accounts - array of unsigned int; Tag this list of accounts. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"tag_accounts\",\"params\":{\"tag\":\"myTag\",\"accounts\":[0,1]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"tag_accounts"},{"location":"interacting/monero-wallet-rpc-reference/#transfer","text":"Send monero to a number of recipients. Alias: None . Inputs: destinations - array of destinations to receive XMR: amount - unsigned int; Amount to send to each destination, in atomic units. address - string; Destination public address. account_index - unsigned int; (Optional) Transfer from this account index. (Defaults to 0) subaddr_indices - array of unsigned int; (Optional) Transfer from this set of subaddresses. (Defaults to 0) priority - unsigned int; Set a priority for the transaction. Accepted Values are: 0-3 for: default, unimportant, normal, elevated, priority. mixin - unsigned int; Number of outputs from the blockchain to mix with (0 means no mixing). ring_size - unsigned int; Number of outputs to mix in the transaction (this output + N decoys from the blockchain). unlock_time - unsigned int; Number of blocks before the monero can be spent (0 to not add a lock). payment_id - string; (Optional) Random 32-byte/64-character hex string to identify a transaction. get_tx_key - boolean; (Optional) Return the transaction key after sending. do_not_relay - boolean; (Optional) If true, the newly created transaction will not be relayed to the monero network. (Defaults to false) get_tx_hex - boolean; Return the transaction as hex string after sending (Defaults to false) get_tx_metadata - boolean; Return the metadata needed to relay the transaction. (Defaults to false) Outputs: amount - Amount transferred for the transaction. fee - Integer value of the fee charged for the txn. multisig_txset - Set of multisig transactions in the process of being signed (empty for non-multisig). tx_blob - Raw transaction represented as hex string, if get_tx_hex is true. tx_hash - String for the publically searchable transaction hash. tx_key - String for the transaction key if get_tx_key is true, otherwise, blank string. tx_metadata - Set of transaction metadata needed to relay this transfer later, if get_tx_metadata is true. unsigned_txset - String. Set of unsigned tx for cold-signing purposes. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"transfer\",\"params\":{\"destinations\":[{\"amount\":100000000000,\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\"},{\"amount\":200000000000,\"address\":\"75sNpRwUtekcJGejMuLSGA71QFuK1qcCVLZnYRTfQLgFU5nJ7xiAHtR5ihioS53KMe8pBhH61moraZHyLoG4G7fMER8xkNv\"}],\"account_index\":0,\"subaddr_indices\":[0],\"priority\":0,\"ring_size\":7,\"get_tx_key\": true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"amount\": 300000000000, \"fee\": 86897600000, \"multisig_txset\": \"\", \"tx_blob\": \"\", \"tx_hash\": \"7663438de4f72b25a0e395b770ea9ecf7108cd2f0c4b75be0b14a103d3362be9\", \"tx_key\": \"25c9d8ec20045c80c93d665c9d3684aab7335f8b2cd02e1ba2638485afd1c70e236c4bdd7a2f1cb511dbf466f13421bdf8df988b7b969c448ca6239d7251490e4bf1bbf9f6ffacffdcdc93b9d1648ec499eada4d6b4e02ce92d4a1c0452e5d009fbbbf15b549df8856205a4c7bda6338d82c823f911acd00cb75850b198c5803\", \"tx_metadata\": \"\", \"unsigned_txset\": \"\" } }","title":"transfer"},{"location":"interacting/monero-wallet-rpc-reference/#transfer_split","text":"Same as transfer, but can split into more than one tx if necessary. Alias: None . Inputs: destinations - array of destinations to receive XMR: amount - unsigned int; Amount to send to each destination, in atomic units. address - string; Destination public address. account_index - unsigned int; (Optional) Transfer from this account index. (Defaults to 0) subaddr_indices - array of unsigned int; (Optional) Transfer from this set of subaddresses. (Defaults to 0) mixin - unsigned int; Number of outputs from the blockchain to mix with (0 means no mixing). ring_size - unsigned int; Sets ringsize to n (mixin + 1). unlock_time - unsigned int; Number of blocks before the monero can be spent (0 to not add a lock). payment_id - string; (Optional) Random 32-byte/64-character hex string to identify a transaction. get_tx_keys - boolean; (Optional) Return the transaction keys after sending. priority - unsigned int; Set a priority for the transactions. Accepted Values are: 0-3 for: default, unimportant, normal, elevated, priority. do_not_relay - boolean; (Optional) If true, the newly created transaction will not be relayed to the monero network. (Defaults to false) get_tx_hex - boolean; Return the transactions as hex string after sending new_algorithm - boolean; True to use the new transaction construction algorithm, defaults to false. get_tx_metadata - boolean; Return list of transaction metadata needed to relay the transfer later. Outputs: tx_hash_list - array of: string. The tx hashes of every transaction. tx_key_list - array of: string. The transaction keys for every transaction. amount_list - array of: integer. The amount transferred for every transaction. fee_list - array of: integer. The amount of fees paid for every transaction. tx_blob_list - array of: string. The tx as hex string for every transaction. tx_metadata_list - array of: string. List of transaction metadata needed to relay the transactions later. multisig_txset - string. The set of signing keys used in a multisig transaction (empty for non-multisig). unsigned_txset - string. Set of unsigned tx for cold-signing purposes. Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"transfer_split\",\"params\":{\"destinations\":[{\"amount\":1000000000000,\"address\":\"7BnERTpvL5MbCLtj5n9No7J5oE5hHiB3tVCK5cjSvCsYWD2WRJLFuWeKTLiXo5QJqt2ZwUaLy2Vh1Ad51K7FNgqcHgjW85o\"},{\"amount\":2000000000000,\"address\":\"75sNpRwUtekcJGejMuLSGA71QFuK1qcCVLZnYRTfQLgFU5nJ7xiAHtR5ihioS53KMe8pBhH61moraZHyLoG4G7fMER8xkNv\"}],\"account_index\":0,\"subaddr_indices\":[0],\"priority\":0,\"ring_size\":7,\"get_tx_key\": true}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"amount_list\": [3000000000000], \"fee_list\": [85106400000], \"multisig_txset\": \"\", \"tx_hash_list\": [\"c8d815f48f27d53fdaf198a74b292a91bfaf87529a9a9a9ee66079a890b3b58b\"], \"unsigned_txset\": \"\" } }","title":"transfer_split"},{"location":"interacting/monero-wallet-rpc-reference/#untag_accounts","text":"Remove filtering tag from a list of accounts. Alias: None . Inputs: accounts - array of unsigned int; Remove tag from this list of accounts. Outputs: None . Example: $ curl -X POST http://localhost:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"untag_accounts\",\"params\":{\"accounts\":[1]}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { } }","title":"untag_accounts"},{"location":"interacting/monero-wallet-rpc-reference/#verify","text":"Verify a signature on a string. Alias: None . Inputs: data - string; What should have been signed. address - string; Public address of the wallet used to sign the data. signature - string; signature generated by sign method. Outputs: good - boolean; Example: $ curl -X POST http://127.0.0.1:18082/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"verify\",\"params\":{\"data\":\"This is sample data to be signed\",\"address\":\"55LTR8KniP4LQGJSPtbYDacR7dz8RBFnsfAKMaMuwUNYX6aQbBcovzDPyrQF9KXF9tVU6Xk3K8no1BywnJX6GvZX8yJsXvt\",\"signature\":\"SigV14K6G151gycjiGxjQ74tKX6A2LwwghvuHjcDeuRFQio5LS6Gb27BNxjYQY1dPuUvXkEbGQUkiHSVLPj4nJAHRrrw3\"}}' -H 'Content-Type: application/json' { \"id\": \"0\", \"jsonrpc\": \"2.0\", \"result\": { \"good\": true } }","title":"verify"},{"location":"interacting/monero-wallet-rpc-reference/#sources","text":"Reworked from GetMonero.org","title":"Sources:"},{"location":"interacting/monerod-reference/","text":"monerod - Reference \u00b6 Overview \u00b6 Connects you to Monero network \u00b6 The Monero daemon monerod keeps your computer synced up with the Monero network. It downloads and validates the blockchain from the p2p network. Not aware of your private keys \u00b6 monerod is entirely decoupled from your wallet. monerod does not access your private keys - it is not aware of your transactions and balance. This allows you to run monerod on a separate computer or in the cloud. In fact, you can connect to a remote monerod instance provided by a semi-trusted 3rd party. Such 3rd party will not be able to steal your funds. This is very handy for learning and experimentation. However, there are privacy and reliability implications to using a remote, untrusted node. For any real business you should be running your own full node . Syntax \u00b6 ./monerod [options] [command] Options define how the daemon should be working. Their names follow the --option-name pattern. Commands give access to specific services provided by the daemon. Commands are executed against the running daemon. Their names follow the command_name pattern. Running \u00b6 Go to directory where you unpacked Monero. The stagenet is what your should be using for learning and experimentation. ./monerod --stagenet --detach # run as a daemon in background tail -f ~/.bitmonero/stagenet/bitmonero.log # watch the logs ./monerod --stagenet exit # ask daemon to exit gracefully The mainnnet is when you want to deal with the real XMR. ./monerod --detach # run as a daemon in background tail -f ~/.bitmonero/bitmonero.log # watch the logs ./monerod exit # ask daemon to exit gracefully Options \u00b6 Options define how the daemon should be working. Their names follow the --option-name pattern. The following groups are only to make reference easier to follow. The daemon itself does not group options in any way. Help and version \u00b6 Option Description --help Enlist available options. --version Show monerod version to stdout. Example output: Monero 'Oxygen Orion' (v0.17.1.8-release) --os-version Show build timestamp and target operating system. Example output: OS: Linux #65-Ubuntu SMP Thu Dec 10 12:01:51 UTC 2020 5.4.0-59-generic . --check-updates One of: disabled | notify | download (= notify by default). Check for new versions of Monero and optionally download it. You should probably prefer your OS package manager to do the update, if possible. There is also unimplemented update option shown by the help system. Pick network \u00b6 Option Description (missing) By default monerod assumes mainnet . --stagenet Run on stagenet . Remember to run your wallet with --stagenet as well. --testnet Run on testnet . Remember to run your wallet with --testnet as well. Logging \u00b6 Option Description --log-file Full path to the log file. Example (mind file permissions): ./monerod --log-file=/var/log/monero/mainnet/monerod.log --log-level 0-4 with 0 being minimal logging and 4 being full tracing. Defaults to 0 . These are general presets and do not directly map to severity levels. For example, even with minimal 0 , you may see some most important INFO entries. Temporarily changing to 1 allows for much better understanding of how the full node operates. Example: ./monerod --log-level=1 --max-log-file-size Soft limit in bytes for the log file (=104850000 by default, which is just under 100MB). Once log file grows past that limit, monerod creates the next log file with a UTC timestamp postfix -YYYY-MM-DD-HH-MM-SS . In production deployments, you would probably prefer to use established solutions like logrotate instead. In that case, set --max-log-file-size=0 to prevent monerod from managing the log files. --max-log-files Limit on the number of log files (=50 by default). The oldest log files are removed. In production deployments, you would probably prefer to use established solutions like logrotate instead. Server \u00b6 monerod defaults are adjusted for running it occasionally on the same computer as your Monero wallet. The following options will be helpful if you intend to have an always running node \u2014 most likely on a remote server or your own separate PC. Option Description --config-file Full path to the configuration file . By default monerod looks for bitmonero.conf in Monero data directory . --data-dir Full path to data directory. This is where the blockchain, log files, and p2p network memory are stored. For defaults and details see data directory . --pidfile Full path to the PID file. Works only with --detach . Example: ./monerod --detach --pidfile=/run/monero/monerod.pid --detach Go to background (decouple from the terminal). This is useful for long-running / server scenarios. Typically, you will also want to manage monerod daemon with systemd or similar. By default monerod runs in a foreground. --non-interactive Do not require tty in a foreground mode. Helpful when running in a container. By default monerod runs in a foreground and opens stdin for reading. This breaks containerization because no tty gets assigned and monerod process crashes. You can make it run in a background with --detach but this is inconvenient in a containerized environment because the canonical usage is that the container waits on the main process to exist (forking makes things more complicated). --no-zmq Disable ZMQ RPC server. You should use this option to limit attack surface and number of unnecessarily open ports (the ZMQ server is unfinished thing and you are unlikely to ever use it). --no-igd Disable UPnP port mapping on the router (\"Internet Gateway Device\"). Add this option to improve security if you are not behind a NAT (you can bind directly to public IP or you run through Tor). --max-txpool-weight Set maximum transactions pool size in bytes. By default 648000000 (~618MB). These are transactions pending for confirmations (not included in any block). --enforce-dns-checkpointing The emergency checkpoints set by MoneroPulse operators will be enforced. It is probably a good idea to set enforcing for unattended nodes. If encountered block hash does not match corresponding checkpoint, the local blockchain will be rolled back a few blocks, effectively blocking following what MoneroPulse operators consider invalid fork. The log entry will be produced: ERROR Local blockchain failed to pass a checkpoint, rolling back! Eventually, the alternative (\"fixed\") fork will get heavier and the node will follow it, leaving the \"invalid\" fork behind. By default checkpointing only notifies about discrepancy by producing the following log entry: ERROR WARNING: local blockchain failed to pass a MoneroPulse checkpoint, and you could be on a fork. You should either sync up from scratch, OR download a fresh blockchain bootstrap, OR enable checkpoint enforcing with the --enforce-dns-checkpointing command-line option . Reference: source code . --disable-dns-checkpoints The MoneroPulse checkpoints set by core developers will be discarded. The checkpoints are apparently still fetched though. P2P network \u00b6 The following options define how your node participates in Monero peer-to-peer network. This is for node-to-node communication. The following options do not affect wallet-to-node interface. The node and peer words are used interchangeably. Option Description --p2p-bind-ip IPv4 network interface to bind to for p2p network protocol. Default value 0.0.0.0 binds to all network interfaces. This is typically what you want. You must change this if you want to constrain binding, for example to force working through Tor via torsocks: DNS_PUBLIC=tcp://1.1.1.1 TORSOCKS_ALLOW_INBOUND=1 torsocks ./monerod --p2p-bind-ip 127.0.0.1\u200a --no-igd\u200a --hide-my-port --p2p-bind-port TCP port to listen for p2p network connections. Defaults to 18080 for mainnet, 28080 for testnet, and 38080 for stagenet. You normally wouldn't change that. This is helpful to run several nodes on your machine to simulate private Monero p2p network (likely using private Testnet). Example: ./monerod --p2p-bind-port=48080 --p2p-external-port TCP port to listen for p2p network connections on your router. Relevant if you are behind a NAT and still want to accept incoming connections. You must then set this to relevant port on your router. This is to let monerod know what to advertise on the network. Default is 0 . --p2p-use-ipv6 Enable IPv6 for p2p (disabled by default). --p2p-bind-ipv6-address IPv6 network interface to bind to for p2p network protocol. Default value :: binds to all network interfaces. --p2p-ignore-ipv4 Ignore unsuccessful IPv4 bind for p2p. Useful if you only want to use IPv6. --igd Set UPnP port mapping on the router (\"Internet Gateway Device\"). One of: disabled | enabled | delayed (= delayed by default). Relevant if you are behind NAT and want to accept incoming P2P network connections. The delayed value means it will wait for incoming connections in hope UPnP may not be necessary. After a while w/o incoming connections found it will attempt to map ports with UPnP. If you know you need UPnP change it to enabled to fast track the process. --hide-my-port monerod will still open and listen on the p2p port. However, it will not announce itself as a peer list candidate. Technically, it will return port 0 in a response to p2p handshake ( node_data.my_port = 0 in get_local_node_data function). In effect nodes you connect to won't spread your IP to other nodes. To sum up, it is not really hiding, it is more like \"do not advertise\". --seed-node Connect to a node to retrieve other nodes' addresses, and disconnect. If not specified, monerod will use hardcoded seed nodes on the first run, and peers cached on disk on subsequent runs. --add-peer Manually add node to local peer list, host:port . Syntax supports IP addresses, domain names, onion and i2p hosts. --add-priority-node Specify list of nodes to connect to and then attempt to keep the connection open. To add multiple nodes use the option several times. Example: ./monerod --add-priority-node=178.128.192.138:18081 --add-priority-node=144.76.202.167:18081 --add-exclusive-node Specify list of nodes to connect to only. If this option is given the options --add-priority-node and --seed-node are ignored. To add multiple nodes use the option several times. Example: ./monerod --add-exclusive-node=178.128.192.138:18081 --add-exclusive-node=144.76.202.167:18081 --out-peers Set max number of outgoing connections to other nodes. By default 12. Value -1 represents the code default. --in-peers Set max number of incoming connections (nodes actively connecting to you). By default unlimited. Value -1 represents the code default. --limit-rate-up Set outgoing data transfer limit [kB/s]. By default 2048 kB/s. Value -1 represents the code default. --limit-rate-down Set incoming data transfer limit [kB/s]. By default 8192 kB/s. Value -1 represents the code default. --limit-rate Set the same limit value for incoming and outgoing data transfer. By default ( -1 ) the individual up/down default limits will be used. It is better to use --limit-rate-up and --limit-rate-down instead to avoid confusion. --offline Do not listen for peers, nor connect to any. Useful for working with a local, archival blockchain. --allow-local-ip Allow adding local IP to peer list. Useful mostly for debug purposes when you may want to have multiple nodes on a single machine. Tor/I2P \u00b6 This is experimental. It may be best to start with this guide . Option Description --tx-proxy Send out your local transactions through SOCKS5 proxy (Tor or I2P). Format: <network-type>,<socks-ip:port>[,max_connections][,disable_noise] Example: ./monerod --tx-proxy \"tx-proxy=tor,127.0.0.1:9050,16\" This was introduced to make publishing transactions over Tor easier (no need for torsocks) while allowing clearnet for blocks at the same time (while torsocks affected everything). Adding ,disable_noise disables Dandelion++ (will speed up tx broadcast but is otherwise not recommended). Note that forwarded transactions (those not originating from connected wallet) will still be relayed over clearnet. Requires multiple --add-peer to manually add onion-enabled p2p seed nodes - see Tor onion seed nodes for Monero P2P network . See this guide and commit . --anonymous-inbound Allow anonymous incoming connections to your onionized P2P interface. Format: <hidden-service-address>,<[bind-ip:]port>[,max_connections] Example: ./monerod --anonymous-inbound \"rveahdfho7wo4b2m.onion:18083,127.0.0.1:18083,100\" . Obviously, you first need to setup the hidden service in your Tor config. See the guide . --pad-transactions Pad relayed transactions to next 1024 bytes to help defend against traffic volume analysis. This only makes sense if you are behind Tor or I2P. See commit . Node RPC API \u00b6 monerod node offers powerful API. It serves 3 purposes: provides network data (stats, blocks, transactions, ...) provides local node information (peer list, hash rate if mining, ...) provides interface for wallets (send transactions, ...) This API is typically referred to as \"RPC\" because it is mostly based on JSON/RPC standard. The following options define how the API behaves. Option Description --public-node Advertise to other users they can use this node as a remote one for connecting their wallets. Requires --restricted-rpc , --rpc-bind-ip and --confirm-external-bind . Without --public-node the node can still be public (assuming other relevant options are set) but won't be advertised as such on the P2P network. This option will allow wallets to auto-discover public nodes (instead of requiring user to manually find one). --rpc-bind-ip IP to listen on. By default 127.0.0.1 because API gives full administrative capabilities over the node. Set it to 0.0.0.0 to listen on all interfaces - but only in connection with one of *-restricted-* options and --confirm-external-bind . --rpc-bind-port TCP port to listen on. By default 18081 (mainnet), 28081 (testnet), 38081 (stagenet). --rpc-bind-ipv6-address IPv6 to listen on. By default ::1 (localhost). All remarks for --rpc-bind-ip are applicable here as well. --rpc-use-ipv6 Enable IPv6 for RPC server (disabled by default). --rpc-ignore-ipv4 Ignore unsuccessful IPv4 bind for RPC. Useful if you only want to use IPv6. --rpc-restricted-bind-ip IP to listen on with the limited version of API. The limited API can be made public to create an Open Node. --rpc-restricted-bind-port TCP port to listen on with the limited version of API. To be used in combination with `--rpc-restricted-bind-port . --confirm-external-bind Confirm you consciously set --rpc-bind-ip to non-localhost IP and you understand the consequences. --restricted-rpc Restrict API to view only commands and do not return privacy sensitive data. Note this does not make sense with --rpc-restricted-bind-port because you would end up with two restricted APIs. --rpc-ssl Enable TLS on RPC connections. One of: enabled | disabled | autodetect ( =autodetect by default). You should enable this if you connect a remote wallet. --rpc-ssl-private-key Path to server's private key in PEM format. Generate it with monero-gen-ssl-cert tool. This is to facilitate server authentication to client. --rpc-ssl-certificate Path to server's certificate in PEM format. Generate it with monero-gen-ssl-cert tool. This is to facilitate server authentication to client. --rpc-ssl-allowed-fingerprints List of certificate fingerprints to accept. This is a way to authenticate clients. --rpc-ssl-allow-any-cert Allow any certificate of connecting client. --rpc-ssl-ca-certificates Path to file containing concatenated PEM format certificate(s) to replace system CA(s). --rpc-ssl-allow-chained Allow user chained certificates. This is only applicable if user has a \"real\" CA issued certificate. --rpc-login Specify username[:password] required to connect to API. --rpc-access-control-origins Specify a comma separated list of origins to allow cross origin resource sharing. This is useful if you want to use monerod API directly from a web browser via JavaScript (say in a pure-fronted web appp scenario). With this option monerod will put proper HTTP CORS headers to its responses. You will also need to set --rpc-login if you use this option. Normally though, the API is used by backend app and this option isn't necessary. Accepting Monero \u00b6 These are network notifications offered by monerod . There are also wallet notifications like --tx-notify offered by monero-wallet-rpc here . Option Description --block-notify <arg> Run a program for each new block. The <arg> must be a full path . If the <arg> contains %s it will be replaced by the block hash. Example: ./monerod --block-notify=\"/usr/bin/echo %s\" Block notifications are good for immediate reaction. However, you should always assume you will miss some block notifications and you should independently poll the API to cover this up. Mind blockchain reorganizations. Block notifications can revert to same and past heights. Small reorganizations are natural and happen every day. --block-rate-notify <arg> Run a program when the number of blocks received in the recent past deviates significantly from the expectation. The <arg> must be a full path . The <arg > can contain any of %t , %b , %e symbols to interpolate: %t : the number of minutes in the observation window %b : the number of blocks observed in that window %e : the ideal number of blocks expected in that window The option will let you know if the network hash rate drops by a lot. This may be indicative of a large section of the network miners moving off to mine a private chain, to be later released to the network. Note that if this event triggers, it is not incontrovertible proof that this is happening. It might just be chance. The longer the window (the %t parameter), and the larger the distance between actual and expected number of blocks, the more indicative it is of a possible chain reorg double-spend attack being prepared. Recommendation: unless you run economically significant Monero exchange or operation, do not act on this data. It is hard to calibrate and easy to misinterpret. If this is a real attack, it will target high-liquidity entities and not small merchants. --reorg-notify <arg> Run a program when reorganization happens (ie, at least one block is removed from the top of the blockchain). The <arg> must be a full path . The <arg > can contain any of %s , %h , %n symbols to interpolate: %s : the height at which the split occurs %h : the height of the new blockchain %d : the number of blocks discarded from the old chain %n : the number of blocks being added The option will let you know when a block is removed from the chain to be replaced by other blocks. This happens when a 51% attack occurs, but small reorgs also happen in the normal course of things. The %d parameter will be set to the number of blocks discarded from the old chain (so if this is higher than the number of confirmations you wait to act upon an incoming payment, that payment might have been cancelled). The %n parameter wil be set to the number of blocks in the new chain (so if this is higher than the number of confirmations you wait to act upon an incoming payment, any incoming payment in the first block will be automatically acted upon by your platform). Recommendation : unless you run economically significant Monero exchange or operation, you do not need to bother with this option. Simply account for reorganizations by requiring at least 10 confirmations before shipping valuable goods. Performance \u00b6 These are advanced options that allow you to optimize performance of your monerod node, sometimes at the expense of reliability. Option Description --prune-blockchain Pruning saves 2/3 of disk space w/o degrading functionality. For maximum effect this should be used already on the first sync . If you add this option later the past data will only be pruned logically w/o shrinking the file size and the gain will be delayed. If you already have unpruned blockchain, see the monero-blockchain-prune tool. The drawback is that you will contribute less to Monero P2P network in terms of helping new nodes to sync up (up to 1/8 of normal contribution). You will still be useful regarding relaying new transactions and blocks though. --sync-pruned-blocks Accept pruned blocks instead of pruning yourself. It should save network transfer when used with --prune-blockchain . See the commit and comments . --db-sync-mode Specify sync option, using format: [safe|fast|fastest]:[sync|async]:[<nblocks_per_sync>[blocks]|<nbytes_per_sync>[bytes]] The default is fast:async:250000000bytes . The fast:async:* can corrupt blockchain database in case of a system crash. It should not corrupt if just monerod crashes. If you are concerned with system crashes use safe:sync . --max-concurrency Max number of threads to use for parallel jobs. The default value 0 uses the number of CPU threads. --prep-blocks-threads Max number of threads to use when computing block hashes (PoW) in groups. Defaults to 4. Decrease this if you don't want monerod hog your computer when syncing. --fast-block-sync Sync up most of the way by using embedded, \"known\" block hashes. Pass 1 to turn on and 0 to turn off. This is on ( 1 ) by default. Normally, for every block the full node must calculate the block hash to verify miner's proof of work. Because the CryptoNight PoW used in Monero is very expensive (even for verification), monerod offers skipping these calculations for old blocks. In other words, it's a mechanism to trust monerod binary regarding old blocks' PoW validity, to sync up faster. --block-sync-size How many blocks are processed in a single batch during chain synchronization. By default this is 20 blocks for newer history and 100 blocks for older history (\"pre v4\"). Default behavior is represented by value 0 . Intuitively, the more resources you have, the bigger batch size you may want to try out. Example: ./monerod --block-sync-size=500 --bootstrap-daemon-address The host:port of a \"bootstrap\" remote open node that the connected wallets can use while this node is still not fully synced. Example: ./monerod --bootstrap-daemon-address=opennode.xmr-tw.org:18089 . The node will forward selected RPC calls to the bootstrap node. The wallet will handle this automatically and transparently. Obviously, such bootstraping phase has privacy implications similar to directly using a remote node. --bootstrap-daemon-login Specify username:password for the bootstrap daemon login (if required). This considers the RPC interface used by the wallet. Normally, open nodes do not require any credentials. --no-sync Do not sync up. Continue using bootstrap daemon instead (if set). See commit . Mining \u00b6 The following options configure solo mining using CPU with the standard software stack monerod . This is mostly useful for: generating your stagenet or testnet coins experimentation and learning if you have super cheap access to vast CPU resources Be advised though that real mining happens in pools and with high-end GPU-s instead of CPU-s. Option Description --start-mining Specify wallet address to mining for. This must be a standard address ! It can be neither a subaddres nor integrated address. --mining-threads Specify mining threads count. By default ony one thread will be used. For best results, set it to number of your physical cores. --extra-messages-file Specify file for extra messages to include into coinbase transactions. --bg-mining-enable Enable unobtrusive mining. In this mode mining will use a small percentage of your system resources to never noticeably slow down your computer. This is intended to encourage people to mine to improve decentralization. That being said chances of finding a block are diminishingly small with solo CPU mining, and even lesser with its unobtrusive version. You can tweak the unobtrusivness / power trade-offs with the further --bg-* options below. --bg-mining-ignore-battery If true, assumes plugged in when unable to query system power status. --bg-mining-min-idle-interval Specify min lookback interval in seconds for determining idle state. --bg-mining-idle-threshold Specify minimum avg idle percentage over lookback interval. --bg-mining-miner-target Specify maximum percentage cpu use by miner(s). Testing Monero itself \u00b6 These options are useful for Monero project developers and testers. Normal users shouldn't be concerned with these. Option Description --keep-alt-blocks Keep alternative blocks on restart. May help with researching reorgs etc. Commit . Research project by noncesense research lab . --test-drop-download For net tests: in download, discard ALL blocks instead checking/saving them (very fast). --test-drop-download-height Like test-drop-download but discards only after around certain height. By default 0 . --regtest Run in a regression testing mode. --keep-fakechain Don't delete any existing database when in fakechain mode. --fixed-difficulty Fixed difficulty used for testing. By default 0 . --test-dbg-lock-sleep Sleep time in ms, defaults to 0 (off), used to debug before/after locking mutex. Values 100 to 1000 are good for tests. --save-graph Save data for dr Monero. Legacy \u00b6 These options should no longer be necessary. They are still present in monerod for backwards compatibility. Option Description --ban-list Specify ban list file, one IP address per line. This was introduced as an emergency measure to deal with large DDoS attacks on Monero p2p network in Dec 2020 / Jan 2021. Example: ./monerod --ban-list=block_tor.txt . Here is the popular block_tor.txt file. It is not recommended to statically ban any IP addresses unless you absolutely need to. Banning IPs often excludes the most vulnerable users who are forced to operate entirely behind Tor or other anonymity networks. --enable-dns-blocklist Similar to --ban-list but instead of a static file uses dynamic IP blocklist available as DNS TXT entries. The DNS blocklist is centrally managed by Monero contributors. It is not recommended unless in emergency situations. --fluffy-blocks Relay compact blocks. Default. Compact block is just a header and a list of transaction IDs. --no-fluffy-blocks Relay classic full blocks. Classic block contains all transactions. --show-time-stats Official docs say \"Show time-stats when processing blocks/txs and disk synchronization\" but it does not seem to produce any output during usual blockchain synchronization. --zmq-rpc-bind-ip IP for ZMQ RPC server to listen on. By default 127.0.0.1 . This is not yet widely used as ZMQ interface currently does not provide meaningful advantage over classic JSON-RPC interface. --zmq-rpc-bind-port Port for ZMQ RPC server to listen on. By default 18082 for mainnet, 38082 for stagenet, and 28082 for testnet. --zmq-pub Address for ZMQ pub - tcp://ip:port or ipc://path --db-type Specify database type. The default and only available: lmdb . Commands \u00b6 Commands give access to specific services provided by the daemon. Commands are executed against the running daemon. Their names follow the command_name pattern. The following groups are only to make reference easier to follow. The daemon itself does not group commands in any way. See running for example usage. You can also type commands directly in the console of the running monerod (if not detached). Help, version, status \u00b6 Option Description help [<command>] Show help for <command> . version Show version information. Example output: Monero 'Boron Butterfly' (v0.14.0.0-release) status Show status. Example output: Height: 186754/186754 (100.0%) on stagenet, not mining, net hash 317 H/s, v9, up to date, 8(out)+0(in) connections, uptime 0d 3h 48m 47s P2P network \u00b6 Option Description print_pl Show the full peer list. print_pl_stats Show the full peer list statistics (white vs gray peers). White peers are online and reachable. Grey peers are offline but your monerod remembers them from past sessions. print_cn Show connected peers with connection initiative (incoming/outgoing) and other stats. ban <IP> [<seconds>] Ban a given <IP> for a given amount of <seconds> . By default the ban is for 24h. Example: ./monerod ban 187.63.135.161 . unban <IP> Unban a given <IP> . bans Show the currently banned IPs. Example output: 187.63.135.161 banned for 86397 seconds . in_peers <max_number> Set the of incoming connections from other peers. out_peers <max_number> Set the of outgoing connections to other peers. limit [<kB/s>] Get or set the download and upload limit. limit_down [<kB/s>] Get or set the download limit. limit_up [<kB/s>] Get or set the upload limit. Transaction pool \u00b6 Option Description flush_txpool [<txid>] Flush specified transaction from transactions pool, or flush the whole transactions pool if was not provided. print_pool Print the transaction pool using a verbose format. print_pool_sh Print the transaction pool using a short format. print_pool_stats Print the transaction pool's statistics (number of transactions, memory size, fees, double spend attempts etc). Transactions \u00b6 Option Description print_coinbase_tx_sum <start_height> [<block_count>] Show a sum of all emitted coins and paid fees within specified range. Example: ./monerod print_coinbase_tx_sum 0 1000000000000 print_tx <transaction_hash> [+hex] [+json] Show specified transaction as JSON and/or HEX. relay_tx <txid> Force relaying the transaction. Useful if you want to rebroadcast the transaction for any reason or if transaction was previously created with \"do_not_relay\":true. Blockchain \u00b6 Option Description print_height Show local blockchain height. sync_info Show blockchain sync progress and connected peers along with download / upload stats. print_bc <begin_height> [<end_height>] Show blocks in range <begin_height> .. <end_height> . The information will include block id, height, timestamp, version, size, weight, number of non-coinbase transactions, difficulty, nonce, and reward. print_block <block_hash> | <block_height> Show detailed data of specified block. hard_fork_info Show current consensus version and future hard fork block height, if any. is_key_image_spent <key_image> Check if specified key image is spent. Key image is a hash. Manage daemon \u00b6 Option Description exit , stop_daemon Ask daemon to exit gracefully. The exit and stop_daemon are identical (one is alias of the other). set_log <level>|<{+,-,}categories> Set the current log level/categories where <level> is a number 0-4. print_status Show if daemon is running. update (check|download) Check if update is available and optionally download it. The hash is SHA-256. On linux use sha256sum to verify. Example output: Update available: v0.13.0.4: https://downloads.getmonero.org/cli/monero-linux-x64-v0.13.0.4.tar.bz2, hash 693e1a0210201f65138ace679d1ab1928aca06bb6e679c20d8b4d2d8717e50d6 Update downloaded to: /opt/monero-v0.13.0.2/monero-linux-x64-v0.13.0.4.tar.bz2 Mining \u00b6 Option Description show_hr Ask monerod daemon to print current hash rate. Relevant only if monerod is mining. hide_hr Ask monerod daemon to stop printing current hash rate. Relevant only if monerod is mining. start_mining <addr> [<threads>] [do_background_mining] [ignore_battery] Ask monerod daemon to start mining. Block reward will go to <addr> . stop_mining Ask monerod daemon to stop mining. Testing Monero itself \u00b6 Option Description start_save_graph Start saving data for dr Monero. stop_save_graph Stop saving data for dr Monero. Legacy \u00b6 Option Description save Flush blockchain data to disk. This is normally no longer necessary as monerod saves the blockchain automatically on exit. output_histogram [@<amount>] <min_count> [<max_count>] Show number of outputs for each amount denomination. This was only relevant in the pre-RingCT era. The old wallet used this to determine which outputs can be used for the requested mixin. With RingCT denominations are irrelevant as amounts are hidden. More info in these SA answers .","title":"monerod"},{"location":"interacting/monerod-reference/#monerod-reference","text":"","title":"monerod - Reference"},{"location":"interacting/monerod-reference/#overview","text":"","title":"Overview"},{"location":"interacting/monerod-reference/#connects-you-to-monero-network","text":"The Monero daemon monerod keeps your computer synced up with the Monero network. It downloads and validates the blockchain from the p2p network.","title":"Connects you to Monero network"},{"location":"interacting/monerod-reference/#not-aware-of-your-private-keys","text":"monerod is entirely decoupled from your wallet. monerod does not access your private keys - it is not aware of your transactions and balance. This allows you to run monerod on a separate computer or in the cloud. In fact, you can connect to a remote monerod instance provided by a semi-trusted 3rd party. Such 3rd party will not be able to steal your funds. This is very handy for learning and experimentation. However, there are privacy and reliability implications to using a remote, untrusted node. For any real business you should be running your own full node .","title":"Not aware of your private keys"},{"location":"interacting/monerod-reference/#syntax","text":"./monerod [options] [command] Options define how the daemon should be working. Their names follow the --option-name pattern. Commands give access to specific services provided by the daemon. Commands are executed against the running daemon. Their names follow the command_name pattern.","title":"Syntax"},{"location":"interacting/monerod-reference/#running","text":"Go to directory where you unpacked Monero. The stagenet is what your should be using for learning and experimentation. ./monerod --stagenet --detach # run as a daemon in background tail -f ~/.bitmonero/stagenet/bitmonero.log # watch the logs ./monerod --stagenet exit # ask daemon to exit gracefully The mainnnet is when you want to deal with the real XMR. ./monerod --detach # run as a daemon in background tail -f ~/.bitmonero/bitmonero.log # watch the logs ./monerod exit # ask daemon to exit gracefully","title":"Running"},{"location":"interacting/monerod-reference/#options","text":"Options define how the daemon should be working. Their names follow the --option-name pattern. The following groups are only to make reference easier to follow. The daemon itself does not group options in any way.","title":"Options"},{"location":"interacting/monerod-reference/#help-and-version","text":"Option Description --help Enlist available options. --version Show monerod version to stdout. Example output: Monero 'Oxygen Orion' (v0.17.1.8-release) --os-version Show build timestamp and target operating system. Example output: OS: Linux #65-Ubuntu SMP Thu Dec 10 12:01:51 UTC 2020 5.4.0-59-generic . --check-updates One of: disabled | notify | download (= notify by default). Check for new versions of Monero and optionally download it. You should probably prefer your OS package manager to do the update, if possible. There is also unimplemented update option shown by the help system.","title":"Help and version"},{"location":"interacting/monerod-reference/#pick-network","text":"Option Description (missing) By default monerod assumes mainnet . --stagenet Run on stagenet . Remember to run your wallet with --stagenet as well. --testnet Run on testnet . Remember to run your wallet with --testnet as well.","title":"Pick network"},{"location":"interacting/monerod-reference/#logging","text":"Option Description --log-file Full path to the log file. Example (mind file permissions): ./monerod --log-file=/var/log/monero/mainnet/monerod.log --log-level 0-4 with 0 being minimal logging and 4 being full tracing. Defaults to 0 . These are general presets and do not directly map to severity levels. For example, even with minimal 0 , you may see some most important INFO entries. Temporarily changing to 1 allows for much better understanding of how the full node operates. Example: ./monerod --log-level=1 --max-log-file-size Soft limit in bytes for the log file (=104850000 by default, which is just under 100MB). Once log file grows past that limit, monerod creates the next log file with a UTC timestamp postfix -YYYY-MM-DD-HH-MM-SS . In production deployments, you would probably prefer to use established solutions like logrotate instead. In that case, set --max-log-file-size=0 to prevent monerod from managing the log files. --max-log-files Limit on the number of log files (=50 by default). The oldest log files are removed. In production deployments, you would probably prefer to use established solutions like logrotate instead.","title":"Logging"},{"location":"interacting/monerod-reference/#server","text":"monerod defaults are adjusted for running it occasionally on the same computer as your Monero wallet. The following options will be helpful if you intend to have an always running node \u2014 most likely on a remote server or your own separate PC. Option Description --config-file Full path to the configuration file . By default monerod looks for bitmonero.conf in Monero data directory . --data-dir Full path to data directory. This is where the blockchain, log files, and p2p network memory are stored. For defaults and details see data directory . --pidfile Full path to the PID file. Works only with --detach . Example: ./monerod --detach --pidfile=/run/monero/monerod.pid --detach Go to background (decouple from the terminal). This is useful for long-running / server scenarios. Typically, you will also want to manage monerod daemon with systemd or similar. By default monerod runs in a foreground. --non-interactive Do not require tty in a foreground mode. Helpful when running in a container. By default monerod runs in a foreground and opens stdin for reading. This breaks containerization because no tty gets assigned and monerod process crashes. You can make it run in a background with --detach but this is inconvenient in a containerized environment because the canonical usage is that the container waits on the main process to exist (forking makes things more complicated). --no-zmq Disable ZMQ RPC server. You should use this option to limit attack surface and number of unnecessarily open ports (the ZMQ server is unfinished thing and you are unlikely to ever use it). --no-igd Disable UPnP port mapping on the router (\"Internet Gateway Device\"). Add this option to improve security if you are not behind a NAT (you can bind directly to public IP or you run through Tor). --max-txpool-weight Set maximum transactions pool size in bytes. By default 648000000 (~618MB). These are transactions pending for confirmations (not included in any block). --enforce-dns-checkpointing The emergency checkpoints set by MoneroPulse operators will be enforced. It is probably a good idea to set enforcing for unattended nodes. If encountered block hash does not match corresponding checkpoint, the local blockchain will be rolled back a few blocks, effectively blocking following what MoneroPulse operators consider invalid fork. The log entry will be produced: ERROR Local blockchain failed to pass a checkpoint, rolling back! Eventually, the alternative (\"fixed\") fork will get heavier and the node will follow it, leaving the \"invalid\" fork behind. By default checkpointing only notifies about discrepancy by producing the following log entry: ERROR WARNING: local blockchain failed to pass a MoneroPulse checkpoint, and you could be on a fork. You should either sync up from scratch, OR download a fresh blockchain bootstrap, OR enable checkpoint enforcing with the --enforce-dns-checkpointing command-line option . Reference: source code . --disable-dns-checkpoints The MoneroPulse checkpoints set by core developers will be discarded. The checkpoints are apparently still fetched though.","title":"Server"},{"location":"interacting/monerod-reference/#p2p-network","text":"The following options define how your node participates in Monero peer-to-peer network. This is for node-to-node communication. The following options do not affect wallet-to-node interface. The node and peer words are used interchangeably. Option Description --p2p-bind-ip IPv4 network interface to bind to for p2p network protocol. Default value 0.0.0.0 binds to all network interfaces. This is typically what you want. You must change this if you want to constrain binding, for example to force working through Tor via torsocks: DNS_PUBLIC=tcp://1.1.1.1 TORSOCKS_ALLOW_INBOUND=1 torsocks ./monerod --p2p-bind-ip 127.0.0.1\u200a --no-igd\u200a --hide-my-port --p2p-bind-port TCP port to listen for p2p network connections. Defaults to 18080 for mainnet, 28080 for testnet, and 38080 for stagenet. You normally wouldn't change that. This is helpful to run several nodes on your machine to simulate private Monero p2p network (likely using private Testnet). Example: ./monerod --p2p-bind-port=48080 --p2p-external-port TCP port to listen for p2p network connections on your router. Relevant if you are behind a NAT and still want to accept incoming connections. You must then set this to relevant port on your router. This is to let monerod know what to advertise on the network. Default is 0 . --p2p-use-ipv6 Enable IPv6 for p2p (disabled by default). --p2p-bind-ipv6-address IPv6 network interface to bind to for p2p network protocol. Default value :: binds to all network interfaces. --p2p-ignore-ipv4 Ignore unsuccessful IPv4 bind for p2p. Useful if you only want to use IPv6. --igd Set UPnP port mapping on the router (\"Internet Gateway Device\"). One of: disabled | enabled | delayed (= delayed by default). Relevant if you are behind NAT and want to accept incoming P2P network connections. The delayed value means it will wait for incoming connections in hope UPnP may not be necessary. After a while w/o incoming connections found it will attempt to map ports with UPnP. If you know you need UPnP change it to enabled to fast track the process. --hide-my-port monerod will still open and listen on the p2p port. However, it will not announce itself as a peer list candidate. Technically, it will return port 0 in a response to p2p handshake ( node_data.my_port = 0 in get_local_node_data function). In effect nodes you connect to won't spread your IP to other nodes. To sum up, it is not really hiding, it is more like \"do not advertise\". --seed-node Connect to a node to retrieve other nodes' addresses, and disconnect. If not specified, monerod will use hardcoded seed nodes on the first run, and peers cached on disk on subsequent runs. --add-peer Manually add node to local peer list, host:port . Syntax supports IP addresses, domain names, onion and i2p hosts. --add-priority-node Specify list of nodes to connect to and then attempt to keep the connection open. To add multiple nodes use the option several times. Example: ./monerod --add-priority-node=178.128.192.138:18081 --add-priority-node=144.76.202.167:18081 --add-exclusive-node Specify list of nodes to connect to only. If this option is given the options --add-priority-node and --seed-node are ignored. To add multiple nodes use the option several times. Example: ./monerod --add-exclusive-node=178.128.192.138:18081 --add-exclusive-node=144.76.202.167:18081 --out-peers Set max number of outgoing connections to other nodes. By default 12. Value -1 represents the code default. --in-peers Set max number of incoming connections (nodes actively connecting to you). By default unlimited. Value -1 represents the code default. --limit-rate-up Set outgoing data transfer limit [kB/s]. By default 2048 kB/s. Value -1 represents the code default. --limit-rate-down Set incoming data transfer limit [kB/s]. By default 8192 kB/s. Value -1 represents the code default. --limit-rate Set the same limit value for incoming and outgoing data transfer. By default ( -1 ) the individual up/down default limits will be used. It is better to use --limit-rate-up and --limit-rate-down instead to avoid confusion. --offline Do not listen for peers, nor connect to any. Useful for working with a local, archival blockchain. --allow-local-ip Allow adding local IP to peer list. Useful mostly for debug purposes when you may want to have multiple nodes on a single machine.","title":"P2P network"},{"location":"interacting/monerod-reference/#tori2p","text":"This is experimental. It may be best to start with this guide . Option Description --tx-proxy Send out your local transactions through SOCKS5 proxy (Tor or I2P). Format: <network-type>,<socks-ip:port>[,max_connections][,disable_noise] Example: ./monerod --tx-proxy \"tx-proxy=tor,127.0.0.1:9050,16\" This was introduced to make publishing transactions over Tor easier (no need for torsocks) while allowing clearnet for blocks at the same time (while torsocks affected everything). Adding ,disable_noise disables Dandelion++ (will speed up tx broadcast but is otherwise not recommended). Note that forwarded transactions (those not originating from connected wallet) will still be relayed over clearnet. Requires multiple --add-peer to manually add onion-enabled p2p seed nodes - see Tor onion seed nodes for Monero P2P network . See this guide and commit . --anonymous-inbound Allow anonymous incoming connections to your onionized P2P interface. Format: <hidden-service-address>,<[bind-ip:]port>[,max_connections] Example: ./monerod --anonymous-inbound \"rveahdfho7wo4b2m.onion:18083,127.0.0.1:18083,100\" . Obviously, you first need to setup the hidden service in your Tor config. See the guide . --pad-transactions Pad relayed transactions to next 1024 bytes to help defend against traffic volume analysis. This only makes sense if you are behind Tor or I2P. See commit .","title":"Tor/I2P"},{"location":"interacting/monerod-reference/#node-rpc-api","text":"monerod node offers powerful API. It serves 3 purposes: provides network data (stats, blocks, transactions, ...) provides local node information (peer list, hash rate if mining, ...) provides interface for wallets (send transactions, ...) This API is typically referred to as \"RPC\" because it is mostly based on JSON/RPC standard. The following options define how the API behaves. Option Description --public-node Advertise to other users they can use this node as a remote one for connecting their wallets. Requires --restricted-rpc , --rpc-bind-ip and --confirm-external-bind . Without --public-node the node can still be public (assuming other relevant options are set) but won't be advertised as such on the P2P network. This option will allow wallets to auto-discover public nodes (instead of requiring user to manually find one). --rpc-bind-ip IP to listen on. By default 127.0.0.1 because API gives full administrative capabilities over the node. Set it to 0.0.0.0 to listen on all interfaces - but only in connection with one of *-restricted-* options and --confirm-external-bind . --rpc-bind-port TCP port to listen on. By default 18081 (mainnet), 28081 (testnet), 38081 (stagenet). --rpc-bind-ipv6-address IPv6 to listen on. By default ::1 (localhost). All remarks for --rpc-bind-ip are applicable here as well. --rpc-use-ipv6 Enable IPv6 for RPC server (disabled by default). --rpc-ignore-ipv4 Ignore unsuccessful IPv4 bind for RPC. Useful if you only want to use IPv6. --rpc-restricted-bind-ip IP to listen on with the limited version of API. The limited API can be made public to create an Open Node. --rpc-restricted-bind-port TCP port to listen on with the limited version of API. To be used in combination with `--rpc-restricted-bind-port . --confirm-external-bind Confirm you consciously set --rpc-bind-ip to non-localhost IP and you understand the consequences. --restricted-rpc Restrict API to view only commands and do not return privacy sensitive data. Note this does not make sense with --rpc-restricted-bind-port because you would end up with two restricted APIs. --rpc-ssl Enable TLS on RPC connections. One of: enabled | disabled | autodetect ( =autodetect by default). You should enable this if you connect a remote wallet. --rpc-ssl-private-key Path to server's private key in PEM format. Generate it with monero-gen-ssl-cert tool. This is to facilitate server authentication to client. --rpc-ssl-certificate Path to server's certificate in PEM format. Generate it with monero-gen-ssl-cert tool. This is to facilitate server authentication to client. --rpc-ssl-allowed-fingerprints List of certificate fingerprints to accept. This is a way to authenticate clients. --rpc-ssl-allow-any-cert Allow any certificate of connecting client. --rpc-ssl-ca-certificates Path to file containing concatenated PEM format certificate(s) to replace system CA(s). --rpc-ssl-allow-chained Allow user chained certificates. This is only applicable if user has a \"real\" CA issued certificate. --rpc-login Specify username[:password] required to connect to API. --rpc-access-control-origins Specify a comma separated list of origins to allow cross origin resource sharing. This is useful if you want to use monerod API directly from a web browser via JavaScript (say in a pure-fronted web appp scenario). With this option monerod will put proper HTTP CORS headers to its responses. You will also need to set --rpc-login if you use this option. Normally though, the API is used by backend app and this option isn't necessary.","title":"Node RPC API"},{"location":"interacting/monerod-reference/#accepting-monero","text":"These are network notifications offered by monerod . There are also wallet notifications like --tx-notify offered by monero-wallet-rpc here . Option Description --block-notify <arg> Run a program for each new block. The <arg> must be a full path . If the <arg> contains %s it will be replaced by the block hash. Example: ./monerod --block-notify=\"/usr/bin/echo %s\" Block notifications are good for immediate reaction. However, you should always assume you will miss some block notifications and you should independently poll the API to cover this up. Mind blockchain reorganizations. Block notifications can revert to same and past heights. Small reorganizations are natural and happen every day. --block-rate-notify <arg> Run a program when the number of blocks received in the recent past deviates significantly from the expectation. The <arg> must be a full path . The <arg > can contain any of %t , %b , %e symbols to interpolate: %t : the number of minutes in the observation window %b : the number of blocks observed in that window %e : the ideal number of blocks expected in that window The option will let you know if the network hash rate drops by a lot. This may be indicative of a large section of the network miners moving off to mine a private chain, to be later released to the network. Note that if this event triggers, it is not incontrovertible proof that this is happening. It might just be chance. The longer the window (the %t parameter), and the larger the distance between actual and expected number of blocks, the more indicative it is of a possible chain reorg double-spend attack being prepared. Recommendation: unless you run economically significant Monero exchange or operation, do not act on this data. It is hard to calibrate and easy to misinterpret. If this is a real attack, it will target high-liquidity entities and not small merchants. --reorg-notify <arg> Run a program when reorganization happens (ie, at least one block is removed from the top of the blockchain). The <arg> must be a full path . The <arg > can contain any of %s , %h , %n symbols to interpolate: %s : the height at which the split occurs %h : the height of the new blockchain %d : the number of blocks discarded from the old chain %n : the number of blocks being added The option will let you know when a block is removed from the chain to be replaced by other blocks. This happens when a 51% attack occurs, but small reorgs also happen in the normal course of things. The %d parameter will be set to the number of blocks discarded from the old chain (so if this is higher than the number of confirmations you wait to act upon an incoming payment, that payment might have been cancelled). The %n parameter wil be set to the number of blocks in the new chain (so if this is higher than the number of confirmations you wait to act upon an incoming payment, any incoming payment in the first block will be automatically acted upon by your platform). Recommendation : unless you run economically significant Monero exchange or operation, you do not need to bother with this option. Simply account for reorganizations by requiring at least 10 confirmations before shipping valuable goods.","title":"Accepting Monero"},{"location":"interacting/monerod-reference/#performance","text":"These are advanced options that allow you to optimize performance of your monerod node, sometimes at the expense of reliability. Option Description --prune-blockchain Pruning saves 2/3 of disk space w/o degrading functionality. For maximum effect this should be used already on the first sync . If you add this option later the past data will only be pruned logically w/o shrinking the file size and the gain will be delayed. If you already have unpruned blockchain, see the monero-blockchain-prune tool. The drawback is that you will contribute less to Monero P2P network in terms of helping new nodes to sync up (up to 1/8 of normal contribution). You will still be useful regarding relaying new transactions and blocks though. --sync-pruned-blocks Accept pruned blocks instead of pruning yourself. It should save network transfer when used with --prune-blockchain . See the commit and comments . --db-sync-mode Specify sync option, using format: [safe|fast|fastest]:[sync|async]:[<nblocks_per_sync>[blocks]|<nbytes_per_sync>[bytes]] The default is fast:async:250000000bytes . The fast:async:* can corrupt blockchain database in case of a system crash. It should not corrupt if just monerod crashes. If you are concerned with system crashes use safe:sync . --max-concurrency Max number of threads to use for parallel jobs. The default value 0 uses the number of CPU threads. --prep-blocks-threads Max number of threads to use when computing block hashes (PoW) in groups. Defaults to 4. Decrease this if you don't want monerod hog your computer when syncing. --fast-block-sync Sync up most of the way by using embedded, \"known\" block hashes. Pass 1 to turn on and 0 to turn off. This is on ( 1 ) by default. Normally, for every block the full node must calculate the block hash to verify miner's proof of work. Because the CryptoNight PoW used in Monero is very expensive (even for verification), monerod offers skipping these calculations for old blocks. In other words, it's a mechanism to trust monerod binary regarding old blocks' PoW validity, to sync up faster. --block-sync-size How many blocks are processed in a single batch during chain synchronization. By default this is 20 blocks for newer history and 100 blocks for older history (\"pre v4\"). Default behavior is represented by value 0 . Intuitively, the more resources you have, the bigger batch size you may want to try out. Example: ./monerod --block-sync-size=500 --bootstrap-daemon-address The host:port of a \"bootstrap\" remote open node that the connected wallets can use while this node is still not fully synced. Example: ./monerod --bootstrap-daemon-address=opennode.xmr-tw.org:18089 . The node will forward selected RPC calls to the bootstrap node. The wallet will handle this automatically and transparently. Obviously, such bootstraping phase has privacy implications similar to directly using a remote node. --bootstrap-daemon-login Specify username:password for the bootstrap daemon login (if required). This considers the RPC interface used by the wallet. Normally, open nodes do not require any credentials. --no-sync Do not sync up. Continue using bootstrap daemon instead (if set). See commit .","title":"Performance"},{"location":"interacting/monerod-reference/#mining","text":"The following options configure solo mining using CPU with the standard software stack monerod . This is mostly useful for: generating your stagenet or testnet coins experimentation and learning if you have super cheap access to vast CPU resources Be advised though that real mining happens in pools and with high-end GPU-s instead of CPU-s. Option Description --start-mining Specify wallet address to mining for. This must be a standard address ! It can be neither a subaddres nor integrated address. --mining-threads Specify mining threads count. By default ony one thread will be used. For best results, set it to number of your physical cores. --extra-messages-file Specify file for extra messages to include into coinbase transactions. --bg-mining-enable Enable unobtrusive mining. In this mode mining will use a small percentage of your system resources to never noticeably slow down your computer. This is intended to encourage people to mine to improve decentralization. That being said chances of finding a block are diminishingly small with solo CPU mining, and even lesser with its unobtrusive version. You can tweak the unobtrusivness / power trade-offs with the further --bg-* options below. --bg-mining-ignore-battery If true, assumes plugged in when unable to query system power status. --bg-mining-min-idle-interval Specify min lookback interval in seconds for determining idle state. --bg-mining-idle-threshold Specify minimum avg idle percentage over lookback interval. --bg-mining-miner-target Specify maximum percentage cpu use by miner(s).","title":"Mining"},{"location":"interacting/monerod-reference/#testing-monero-itself","text":"These options are useful for Monero project developers and testers. Normal users shouldn't be concerned with these. Option Description --keep-alt-blocks Keep alternative blocks on restart. May help with researching reorgs etc. Commit . Research project by noncesense research lab . --test-drop-download For net tests: in download, discard ALL blocks instead checking/saving them (very fast). --test-drop-download-height Like test-drop-download but discards only after around certain height. By default 0 . --regtest Run in a regression testing mode. --keep-fakechain Don't delete any existing database when in fakechain mode. --fixed-difficulty Fixed difficulty used for testing. By default 0 . --test-dbg-lock-sleep Sleep time in ms, defaults to 0 (off), used to debug before/after locking mutex. Values 100 to 1000 are good for tests. --save-graph Save data for dr Monero.","title":"Testing Monero itself"},{"location":"interacting/monerod-reference/#legacy","text":"These options should no longer be necessary. They are still present in monerod for backwards compatibility. Option Description --ban-list Specify ban list file, one IP address per line. This was introduced as an emergency measure to deal with large DDoS attacks on Monero p2p network in Dec 2020 / Jan 2021. Example: ./monerod --ban-list=block_tor.txt . Here is the popular block_tor.txt file. It is not recommended to statically ban any IP addresses unless you absolutely need to. Banning IPs often excludes the most vulnerable users who are forced to operate entirely behind Tor or other anonymity networks. --enable-dns-blocklist Similar to --ban-list but instead of a static file uses dynamic IP blocklist available as DNS TXT entries. The DNS blocklist is centrally managed by Monero contributors. It is not recommended unless in emergency situations. --fluffy-blocks Relay compact blocks. Default. Compact block is just a header and a list of transaction IDs. --no-fluffy-blocks Relay classic full blocks. Classic block contains all transactions. --show-time-stats Official docs say \"Show time-stats when processing blocks/txs and disk synchronization\" but it does not seem to produce any output during usual blockchain synchronization. --zmq-rpc-bind-ip IP for ZMQ RPC server to listen on. By default 127.0.0.1 . This is not yet widely used as ZMQ interface currently does not provide meaningful advantage over classic JSON-RPC interface. --zmq-rpc-bind-port Port for ZMQ RPC server to listen on. By default 18082 for mainnet, 38082 for stagenet, and 28082 for testnet. --zmq-pub Address for ZMQ pub - tcp://ip:port or ipc://path --db-type Specify database type. The default and only available: lmdb .","title":"Legacy"},{"location":"interacting/monerod-reference/#commands","text":"Commands give access to specific services provided by the daemon. Commands are executed against the running daemon. Their names follow the command_name pattern. The following groups are only to make reference easier to follow. The daemon itself does not group commands in any way. See running for example usage. You can also type commands directly in the console of the running monerod (if not detached).","title":"Commands"},{"location":"interacting/monerod-reference/#help-version-status","text":"Option Description help [<command>] Show help for <command> . version Show version information. Example output: Monero 'Boron Butterfly' (v0.14.0.0-release) status Show status. Example output: Height: 186754/186754 (100.0%) on stagenet, not mining, net hash 317 H/s, v9, up to date, 8(out)+0(in) connections, uptime 0d 3h 48m 47s","title":"Help, version, status"},{"location":"interacting/monerod-reference/#p2p-network_1","text":"Option Description print_pl Show the full peer list. print_pl_stats Show the full peer list statistics (white vs gray peers). White peers are online and reachable. Grey peers are offline but your monerod remembers them from past sessions. print_cn Show connected peers with connection initiative (incoming/outgoing) and other stats. ban <IP> [<seconds>] Ban a given <IP> for a given amount of <seconds> . By default the ban is for 24h. Example: ./monerod ban 187.63.135.161 . unban <IP> Unban a given <IP> . bans Show the currently banned IPs. Example output: 187.63.135.161 banned for 86397 seconds . in_peers <max_number> Set the of incoming connections from other peers. out_peers <max_number> Set the of outgoing connections to other peers. limit [<kB/s>] Get or set the download and upload limit. limit_down [<kB/s>] Get or set the download limit. limit_up [<kB/s>] Get or set the upload limit.","title":"P2P network"},{"location":"interacting/monerod-reference/#transaction-pool","text":"Option Description flush_txpool [<txid>] Flush specified transaction from transactions pool, or flush the whole transactions pool if was not provided. print_pool Print the transaction pool using a verbose format. print_pool_sh Print the transaction pool using a short format. print_pool_stats Print the transaction pool's statistics (number of transactions, memory size, fees, double spend attempts etc).","title":"Transaction pool"},{"location":"interacting/monerod-reference/#transactions","text":"Option Description print_coinbase_tx_sum <start_height> [<block_count>] Show a sum of all emitted coins and paid fees within specified range. Example: ./monerod print_coinbase_tx_sum 0 1000000000000 print_tx <transaction_hash> [+hex] [+json] Show specified transaction as JSON and/or HEX. relay_tx <txid> Force relaying the transaction. Useful if you want to rebroadcast the transaction for any reason or if transaction was previously created with \"do_not_relay\":true.","title":"Transactions"},{"location":"interacting/monerod-reference/#blockchain","text":"Option Description print_height Show local blockchain height. sync_info Show blockchain sync progress and connected peers along with download / upload stats. print_bc <begin_height> [<end_height>] Show blocks in range <begin_height> .. <end_height> . The information will include block id, height, timestamp, version, size, weight, number of non-coinbase transactions, difficulty, nonce, and reward. print_block <block_hash> | <block_height> Show detailed data of specified block. hard_fork_info Show current consensus version and future hard fork block height, if any. is_key_image_spent <key_image> Check if specified key image is spent. Key image is a hash.","title":"Blockchain"},{"location":"interacting/monerod-reference/#manage-daemon","text":"Option Description exit , stop_daemon Ask daemon to exit gracefully. The exit and stop_daemon are identical (one is alias of the other). set_log <level>|<{+,-,}categories> Set the current log level/categories where <level> is a number 0-4. print_status Show if daemon is running. update (check|download) Check if update is available and optionally download it. The hash is SHA-256. On linux use sha256sum to verify. Example output: Update available: v0.13.0.4: https://downloads.getmonero.org/cli/monero-linux-x64-v0.13.0.4.tar.bz2, hash 693e1a0210201f65138ace679d1ab1928aca06bb6e679c20d8b4d2d8717e50d6 Update downloaded to: /opt/monero-v0.13.0.2/monero-linux-x64-v0.13.0.4.tar.bz2","title":"Manage daemon"},{"location":"interacting/monerod-reference/#mining_1","text":"Option Description show_hr Ask monerod daemon to print current hash rate. Relevant only if monerod is mining. hide_hr Ask monerod daemon to stop printing current hash rate. Relevant only if monerod is mining. start_mining <addr> [<threads>] [do_background_mining] [ignore_battery] Ask monerod daemon to start mining. Block reward will go to <addr> . stop_mining Ask monerod daemon to stop mining.","title":"Mining"},{"location":"interacting/monerod-reference/#testing-monero-itself_1","text":"Option Description start_save_graph Start saving data for dr Monero. stop_save_graph Stop saving data for dr Monero.","title":"Testing Monero itself"},{"location":"interacting/monerod-reference/#legacy_1","text":"Option Description save Flush blockchain data to disk. This is normally no longer necessary as monerod saves the blockchain automatically on exit. output_histogram [@<amount>] <min_count> [<max_count>] Show number of outputs for each amount denomination. This was only relevant in the pre-RingCT era. The old wallet used this to determine which outputs can be used for the requested mixin. With RingCT denominations are irrelevant as amounts are hidden. More info in these SA answers .","title":"Legacy"},{"location":"interacting/overview/","text":"Interacting with Monero \u00b6 You can interact with Monero via desktop GUI, commandline interface, and programming API. On top of that, Monero nodes interact with each other in a peer-to-peer network. Installation directory overview \u00b6 Once unpacked you will see several executable files. You will also find a nice PDF guide for the GUI wallet. Monero project nicely decouples network node logic from wallet logic. Wallet logic is offered through three independent user interfaces - the GUI, the CLI, and the HTTP API. # cd monero-gui-v0.17.1.9 # ---- guide to Monero GUI ---- monero-gui-wallet-guide.pdf # ---- main executable files ----------- monerod monero-wallet-gui # ---- extra executable files ----------- extras/monero-wallet-cli extras/monero-wallet-rpc extras/monero-blockchain-prune extras/monero-gen-trusted-multisig extras/monero-gen-ssl-cert extras/monero-blockchain-export extras/monero-blockchain-import # ---- don't bother with these ---------- extras/monero-blockchain-stats extras/monero-blockchain-mark-spent-outputs extras/monero-blockchain-prune-known-spent-data extras/monero-blockchain-usage extras/monero-blockchain-ancestry extras/monero-blockchain-depth Executables \u00b6 Executable Description monerod The full node daemon. Does not require a wallet. Documentation . monero-wallet-gui Wallet logic and graphical user interface. Requires monerod running. monero-wallet-cli Wallet logic and commandline user interface. Requires monerod running. monero-wallet-rpc Wallet logic and HTTP API (JSON-RPC protocol). Requires monerod running. monero-blockchain-prune Prune existing local blockchain. This saves 2/3 of disk space (down to 31GB as of Jan 2021). This is preferable over monerod --prune-blockchain which only logically releases space inside the file while the file remains large. The monero-blockchain-prune creates a shrinked copy of the blockchain file. See tutorial1 , tutorial2 . monero-gen-ssl-cert Generate 4096 bit RSA private key and self signed TLS certificate for use with monerod RPC interface. Note, Monero daemon automatically generates TLS certificate on each restart. Manual generation with this tool is only useful if you want to pin TLS certificate fingerprint in your monero wallet. See the pull request . monero-gen-trusted-multisig Tool to generate a set of multisig wallets. See chapter on multisignatures . monero-blockchain-export Tool to export blockchain to blockchain.raw file. monero-blockchain-import Tool to import blockchain.raw - ideally your own trusted copy. Executables - legacy \u00b6 You most likely should not bother with these legacy or very specialized tools. Executable Description monero-blockchain-stats Generate stats like tx/day, blocks/day, bytes/day based on your local blockchain. monero-blockchain-mark-spent-outputs Advanced tool to mitigate potential privacy issues related to Monero forks. You normally shouldn't be concerned with that. See the commit and pull request . monero-blockchain-prune-known-spent-data Previous limited pruning tool to prune select \"known spent\" transaction outputs (from the before RCT era). Nowadays prefer monero-blockchain-prune . This only saves ~200 MB. See the commit . monero-blockchain-usage Advanced tool to mitigate potential privacy issues related to Monero forks. You normally shouldn't be concerned with that. See the commit and the pull request . monero-blockchain-ancestry Advanced research tool to learn ancestors of a transaction, block or chain. Irrelevant for normal users. See this pull request . monero-blockchain-depth Advanced research tool to learn depth of a transaction, block or chain. Irrelevant for normal users. See this commit . Interacting \u00b6 There are quite a few ways you can interact with Monero software. Perhaps the most surprising for newcomers is that monerod daemon accepts interactive keyboard commands while it is running. Also, please note that HTTP API is split across monerod and monero-wallet-rpc . You need to run and call both daemons to explore the full API. This follows the node-logic vs wallet-logic split mentioned earlier. All wallet implementations depend on the monerod running. Executable p2p network node commands via keyboard node HTTP API wallet commands via keyboard wallet HTTP API wallet via GUI monerod \u2714 \u2714 \u2714 monero-wallet-cli \u2714 monero-wallet-rpc \u2714 monero-wallet-gui \u2714 Data directory \u00b6 This is where the blockchain, log files, and p2p network memory are stored. By default data directory is at: $HOME/.bitmonero/ on Linux and macOS C:\\ProgramData\\bitmonero\\ on Windows Please mind: data directory is hidden as per OS convention the bitmonero directory name is historical artefact from before Monero forked away from Bitmonero, about 2000 years Before Christ Data directory contains: lmdb/ - the blockchain database directory p2pstate.bin - saved memory of discovered and rated peers bitmonero.log - log file It can also contain subdirectories for stagenet and testnet, mirroring the same structure: stagenet/ - data directory for Stagenet testnet/ - data directory for Testnet","title":"Overview"},{"location":"interacting/overview/#interacting-with-monero","text":"You can interact with Monero via desktop GUI, commandline interface, and programming API. On top of that, Monero nodes interact with each other in a peer-to-peer network.","title":"Interacting with Monero"},{"location":"interacting/overview/#installation-directory-overview","text":"Once unpacked you will see several executable files. You will also find a nice PDF guide for the GUI wallet. Monero project nicely decouples network node logic from wallet logic. Wallet logic is offered through three independent user interfaces - the GUI, the CLI, and the HTTP API. # cd monero-gui-v0.17.1.9 # ---- guide to Monero GUI ---- monero-gui-wallet-guide.pdf # ---- main executable files ----------- monerod monero-wallet-gui # ---- extra executable files ----------- extras/monero-wallet-cli extras/monero-wallet-rpc extras/monero-blockchain-prune extras/monero-gen-trusted-multisig extras/monero-gen-ssl-cert extras/monero-blockchain-export extras/monero-blockchain-import # ---- don't bother with these ---------- extras/monero-blockchain-stats extras/monero-blockchain-mark-spent-outputs extras/monero-blockchain-prune-known-spent-data extras/monero-blockchain-usage extras/monero-blockchain-ancestry extras/monero-blockchain-depth","title":"Installation directory overview"},{"location":"interacting/overview/#executables","text":"Executable Description monerod The full node daemon. Does not require a wallet. Documentation . monero-wallet-gui Wallet logic and graphical user interface. Requires monerod running. monero-wallet-cli Wallet logic and commandline user interface. Requires monerod running. monero-wallet-rpc Wallet logic and HTTP API (JSON-RPC protocol). Requires monerod running. monero-blockchain-prune Prune existing local blockchain. This saves 2/3 of disk space (down to 31GB as of Jan 2021). This is preferable over monerod --prune-blockchain which only logically releases space inside the file while the file remains large. The monero-blockchain-prune creates a shrinked copy of the blockchain file. See tutorial1 , tutorial2 . monero-gen-ssl-cert Generate 4096 bit RSA private key and self signed TLS certificate for use with monerod RPC interface. Note, Monero daemon automatically generates TLS certificate on each restart. Manual generation with this tool is only useful if you want to pin TLS certificate fingerprint in your monero wallet. See the pull request . monero-gen-trusted-multisig Tool to generate a set of multisig wallets. See chapter on multisignatures . monero-blockchain-export Tool to export blockchain to blockchain.raw file. monero-blockchain-import Tool to import blockchain.raw - ideally your own trusted copy.","title":"Executables"},{"location":"interacting/overview/#executables-legacy","text":"You most likely should not bother with these legacy or very specialized tools. Executable Description monero-blockchain-stats Generate stats like tx/day, blocks/day, bytes/day based on your local blockchain. monero-blockchain-mark-spent-outputs Advanced tool to mitigate potential privacy issues related to Monero forks. You normally shouldn't be concerned with that. See the commit and pull request . monero-blockchain-prune-known-spent-data Previous limited pruning tool to prune select \"known spent\" transaction outputs (from the before RCT era). Nowadays prefer monero-blockchain-prune . This only saves ~200 MB. See the commit . monero-blockchain-usage Advanced tool to mitigate potential privacy issues related to Monero forks. You normally shouldn't be concerned with that. See the commit and the pull request . monero-blockchain-ancestry Advanced research tool to learn ancestors of a transaction, block or chain. Irrelevant for normal users. See this pull request . monero-blockchain-depth Advanced research tool to learn depth of a transaction, block or chain. Irrelevant for normal users. See this commit .","title":"Executables - legacy"},{"location":"interacting/overview/#interacting","text":"There are quite a few ways you can interact with Monero software. Perhaps the most surprising for newcomers is that monerod daemon accepts interactive keyboard commands while it is running. Also, please note that HTTP API is split across monerod and monero-wallet-rpc . You need to run and call both daemons to explore the full API. This follows the node-logic vs wallet-logic split mentioned earlier. All wallet implementations depend on the monerod running. Executable p2p network node commands via keyboard node HTTP API wallet commands via keyboard wallet HTTP API wallet via GUI monerod \u2714 \u2714 \u2714 monero-wallet-cli \u2714 monero-wallet-rpc \u2714 monero-wallet-gui \u2714","title":"Interacting"},{"location":"interacting/overview/#data-directory","text":"This is where the blockchain, log files, and p2p network memory are stored. By default data directory is at: $HOME/.bitmonero/ on Linux and macOS C:\\ProgramData\\bitmonero\\ on Windows Please mind: data directory is hidden as per OS convention the bitmonero directory name is historical artefact from before Monero forked away from Bitmonero, about 2000 years Before Christ Data directory contains: lmdb/ - the blockchain database directory p2pstate.bin - saved memory of discovered and rated peers bitmonero.log - log file It can also contain subdirectories for stagenet and testnet, mirroring the same structure: stagenet/ - data directory for Stagenet testnet/ - data directory for Testnet","title":"Data directory"},{"location":"interacting/verify-monero-binaries/","text":"Verify Monero Binaries \u00b6 Verification must be carried on before extracting the archive and before using Monero . Instructions were tested on Linux. They should also work on macOS with slight modifications. 1. Import lead maintainer PGP key \u00b6 This is a one time action. Skip this step for subsequent Monero releases. Monero core developers sign a list of hashes of released binaries. BinaryFate is Monero core developer who signs the releases. His public key is available on GitHub in the project source code. Import binaryFate's public key to your keyring: curl https://raw.githubusercontent.com/monero-project/monero/master/utils/gpg_keys/binaryfate.asc | gpg --import Trust binaryFate's public key (fingerprint must be exactly this): gpg --edit-key '81AC591FE9C4B65C5806AFC3F0AF4D462A0BDF92' trust 4 Danger If key with this fingerprint was not found then remove imported key immediately (gpg --delete-keys ...). That would mean the key changed (likely was compromised). 2. Verify signature of hash list (hashes.txt) \u00b6 The list of binaries and their hashes is published on getmonero.org and a few other places like release notes on r/monero . Please note the publication channel does not matter as long as you properly verify the signature! u To verify these are real hashes (not tampered with) run: curl https://www.getmonero.org/downloads/hashes.txt | gpg --verify The expected output should contain the line: gpg: Good signature from \"binaryFate <binaryfate@getmonero.org>\" 3. Verify the hash \u00b6 By this step we checked that published hashes were not tampered with. The last step is to compare published hash with downloaded archive SHA-256 hash. Download Monero if you didn't already (but do not unpack). Replace the example file name with actual one: file_name=monero-gui-linux-x64-v0.17.1.9.tar.bz2 file_hash=`sha256sum $file_name | cut -c 1-64` curl https://www.getmonero.org/downloads/hashes.txt > /tmp/reference-hashes.txt # verify the signature (previous step is repeated here for completeness) gpg --verify /tmp/reference-hashes.txt # grep must print the hash (output cannot be empty) grep $file_hash /tmp/reference-hashes.txt Danger If the grep output is empty then double check everything because apparently the hashes don't match. If grep printed filename and hash then everything is alright!","title":"Verify"},{"location":"interacting/verify-monero-binaries/#verify-monero-binaries","text":"Verification must be carried on before extracting the archive and before using Monero . Instructions were tested on Linux. They should also work on macOS with slight modifications.","title":"Verify Monero Binaries"},{"location":"interacting/verify-monero-binaries/#1-import-lead-maintainer-pgp-key","text":"This is a one time action. Skip this step for subsequent Monero releases. Monero core developers sign a list of hashes of released binaries. BinaryFate is Monero core developer who signs the releases. His public key is available on GitHub in the project source code. Import binaryFate's public key to your keyring: curl https://raw.githubusercontent.com/monero-project/monero/master/utils/gpg_keys/binaryfate.asc | gpg --import Trust binaryFate's public key (fingerprint must be exactly this): gpg --edit-key '81AC591FE9C4B65C5806AFC3F0AF4D462A0BDF92' trust 4 Danger If key with this fingerprint was not found then remove imported key immediately (gpg --delete-keys ...). That would mean the key changed (likely was compromised).","title":"1. Import lead maintainer PGP key"},{"location":"interacting/verify-monero-binaries/#2-verify-signature-of-hash-list-hashestxt","text":"The list of binaries and their hashes is published on getmonero.org and a few other places like release notes on r/monero . Please note the publication channel does not matter as long as you properly verify the signature! u To verify these are real hashes (not tampered with) run: curl https://www.getmonero.org/downloads/hashes.txt | gpg --verify The expected output should contain the line: gpg: Good signature from \"binaryFate <binaryfate@getmonero.org>\"","title":"2. Verify signature of hash list (hashes.txt)"},{"location":"interacting/verify-monero-binaries/#3-verify-the-hash","text":"By this step we checked that published hashes were not tampered with. The last step is to compare published hash with downloaded archive SHA-256 hash. Download Monero if you didn't already (but do not unpack). Replace the example file name with actual one: file_name=monero-gui-linux-x64-v0.17.1.9.tar.bz2 file_hash=`sha256sum $file_name | cut -c 1-64` curl https://www.getmonero.org/downloads/hashes.txt > /tmp/reference-hashes.txt # verify the signature (previous step is repeated here for completeness) gpg --verify /tmp/reference-hashes.txt # grep must print the hash (output cannot be empty) grep $file_hash /tmp/reference-hashes.txt Danger If the grep output is empty then double check everything because apparently the hashes don't match. If grep printed filename and hash then everything is alright!","title":"3. Verify the hash"},{"location":"proof-of-work/cryptonight/","text":"CryptoNight \u00b6 CryptoNight is a memory hard hash function Background \u00b6 CryptoNight was originally designed around 2013 as part of the CryptoNote suite. One design goal was to make it very friendly for the off-the-shelf CPU-s, by employing: native AES encryption fast 64 bit multipliers scratchpad fitting exactly the size of the per-core L3 cache on Intel CPUs (about 2MB) More ambitious design goal was to make it inefficiently computable on ASIC-s. This goal has since failed, as it inevitably happens with \"ASIC hard\" algorithms. Efficient CryptoNight ASIC was developed in 2017 by Bitmain. Monero inherited CryptoNight as its proof of work in 2014. Since then Monero slightly evolved the algorithm to intentionally break compatibility with released ASIC-s. Currently Monero implements CryptoNight v2, a third iteration of original CryptoNight (v0, v1, v2). The goal is to find small-enough hash \u00b6 In hashing based PoW algorithms the goal is to find small-enough hash. Hash is simply an integer (normally, a very large integer). Most hashing functions result in 256-bit hashes (integers between 0 and 2^256). This includes Bitcoin's double-SHA-256 and Monero's CryptoNight. Miner randomly tweaks input data until the hash fits under specified threshold. The threshold (also a large integer) is established collectively by the network as part of the consensus mechanism. The PoW is only considered valid (solved) if hash fits under the threshold. Because hash functions are one-way, it is not possible to analytically calculate input data that would result in a small-enough hash. The solution must be brute-forced by tweaking the input data and recalculating the hash over and over again. Miners have a few areas of flexibility regarding input data - most importantly they can iterate with the nonce value. They also have a power over which transactions are included in the block and how they are put together in a merkle tree. Cryptographic primitives \u00b6 CryptoNight is based on: AES encryption 5 hashing functions, all of which were finalists in NIST SHA-3 competition: Keccak (the primary one) BLAKE Groestl JH Skein Input data \u00b6 In Monero the input to hashing function is concatenation of: serialized block header (around 46 bytes; subject to varint representation) merkle tree root (32 bytes) number of transactions included in the block (around 1-2 bytes; subject to varint representation) See get_block_hashing_blob() function to dig further. Algorithm \u00b6 Warning The article attempts to give reader a high-level understanding of the CryptoNight algorithm. For implementation details refer to CryptoNote Standard and Monero source code. See references at the bottom. Overview \u00b6 CryptoNight attempts to make memory access a bottleneck for performance (\"memory hardness\"). It has three steps: Initialize large area of memory with pseudo-random data. This memory is known as the scratchpad. Perform numerous read/write operations at pseudo-random (but deterministic) addresses on the scratchpad. Hash the entire scratchpad to produce the resulting value. Step 1: scratchpad initialization \u00b6 Firstly, the input data is hashed with Keccak-1600. This results in 200 bytes of pseudorandom data (1600 bits == 200 bytes). These 200 bytes become a seed to generate a larger, 2MB-wide buffer of pseudorandom data, by applying AES-256 encryption. The first 0..31 bytes of Keccak-1600 hash are used as AES key. The encryption is performed on 128 bytes-long payloads until 2MB is ready. The first payload are Keccak-1600 bytes 66..191. The next payload is encryption result of the previous payload. Each 128-byte payload is actually encrypted 10 times. The details are a bit more nuanced, see \"Scratchpad Initialization\" in CryptoNote Standard . Step 2: memory-hard loop \u00b6 The second step is basically 524288 iterations of a simple stateful algorithm. Each algorithm iteration reads from and writes back to the scratchpad, at pseudorandom-but-deterministic locations. Critically, next iteration depends on the state prepared by previous iterations. It is not possible to directly calculate state of future iterations. The specific operations include AES, XOR, 8byte_mul, 8byte_add - operations that are CPU-friendly (highly optimized on modern CPU-s). The goal here is to make memory latency the bottleneck in attempt to close the gap between potential ASIC-s and general purpose CPU-s. Step 3: hashing \u00b6 The final step (simplifying) is to: combine original Keccak-1600 output with the whole scratchpad pick the hashing algorithm based on 2 low-order bits of the result 0=BLAKE-256 1=Groestl-256 2=JH-256 3=Skein-256 hash the result with selected function The resulting 256-bit hash is the final output of CryptoNight algorithm. Monero specific modifications \u00b6 CryptoNight v0 \u00b6 This is how Monero community refers to original implementation of CryptoNight. CryptoNight v1 \u00b6 See the source code diff . CryptoNight v2 \u00b6 See the rationale and the source code diff . CryptoNight v3 aka CryptoNightR \u00b6 See the rationale and the source code diff . Critique \u00b6 CryptoNight hash is relatively expensive to verify. This poses a risk of DoS-ing nodes with incorrect proofs to process. See strong asymmetry requirement. The hash function was designed from scratch with limited peer review. While CryptoNight is composed of proven and peer-reviewed primitives, combining secure primitives doesn't necessarily result in a secure cryptosystem. CryptoNight ultimately failed to prevent ASIC-s. Complexity of CryptoNight kills competition in ASIC manufacturing. CryptoNight proof of work remains one of the most controversial aspect of Monero. Reference \u00b6 CryptoNight hash function description in the CryptoNote Standard CryptoNight v2 source code The entry point is cn_slow_hash() function. Manually removing support and optimizations for multiple architectures should help you understand the actual code. \"Egalitarian Proof of Work\" chapter in CryptoNote whitepaper First days of Monero mining by dr David Andersen Some test vectors in Monero source code","title":"CryptoNight"},{"location":"proof-of-work/cryptonight/#cryptonight","text":"CryptoNight is a memory hard hash function","title":"CryptoNight"},{"location":"proof-of-work/cryptonight/#background","text":"CryptoNight was originally designed around 2013 as part of the CryptoNote suite. One design goal was to make it very friendly for the off-the-shelf CPU-s, by employing: native AES encryption fast 64 bit multipliers scratchpad fitting exactly the size of the per-core L3 cache on Intel CPUs (about 2MB) More ambitious design goal was to make it inefficiently computable on ASIC-s. This goal has since failed, as it inevitably happens with \"ASIC hard\" algorithms. Efficient CryptoNight ASIC was developed in 2017 by Bitmain. Monero inherited CryptoNight as its proof of work in 2014. Since then Monero slightly evolved the algorithm to intentionally break compatibility with released ASIC-s. Currently Monero implements CryptoNight v2, a third iteration of original CryptoNight (v0, v1, v2).","title":"Background"},{"location":"proof-of-work/cryptonight/#the-goal-is-to-find-small-enough-hash","text":"In hashing based PoW algorithms the goal is to find small-enough hash. Hash is simply an integer (normally, a very large integer). Most hashing functions result in 256-bit hashes (integers between 0 and 2^256). This includes Bitcoin's double-SHA-256 and Monero's CryptoNight. Miner randomly tweaks input data until the hash fits under specified threshold. The threshold (also a large integer) is established collectively by the network as part of the consensus mechanism. The PoW is only considered valid (solved) if hash fits under the threshold. Because hash functions are one-way, it is not possible to analytically calculate input data that would result in a small-enough hash. The solution must be brute-forced by tweaking the input data and recalculating the hash over and over again. Miners have a few areas of flexibility regarding input data - most importantly they can iterate with the nonce value. They also have a power over which transactions are included in the block and how they are put together in a merkle tree.","title":"The goal is to find small-enough hash"},{"location":"proof-of-work/cryptonight/#cryptographic-primitives","text":"CryptoNight is based on: AES encryption 5 hashing functions, all of which were finalists in NIST SHA-3 competition: Keccak (the primary one) BLAKE Groestl JH Skein","title":"Cryptographic primitives"},{"location":"proof-of-work/cryptonight/#input-data","text":"In Monero the input to hashing function is concatenation of: serialized block header (around 46 bytes; subject to varint representation) merkle tree root (32 bytes) number of transactions included in the block (around 1-2 bytes; subject to varint representation) See get_block_hashing_blob() function to dig further.","title":"Input data"},{"location":"proof-of-work/cryptonight/#algorithm","text":"Warning The article attempts to give reader a high-level understanding of the CryptoNight algorithm. For implementation details refer to CryptoNote Standard and Monero source code. See references at the bottom.","title":"Algorithm"},{"location":"proof-of-work/cryptonight/#overview","text":"CryptoNight attempts to make memory access a bottleneck for performance (\"memory hardness\"). It has three steps: Initialize large area of memory with pseudo-random data. This memory is known as the scratchpad. Perform numerous read/write operations at pseudo-random (but deterministic) addresses on the scratchpad. Hash the entire scratchpad to produce the resulting value.","title":"Overview"},{"location":"proof-of-work/cryptonight/#step-1-scratchpad-initialization","text":"Firstly, the input data is hashed with Keccak-1600. This results in 200 bytes of pseudorandom data (1600 bits == 200 bytes). These 200 bytes become a seed to generate a larger, 2MB-wide buffer of pseudorandom data, by applying AES-256 encryption. The first 0..31 bytes of Keccak-1600 hash are used as AES key. The encryption is performed on 128 bytes-long payloads until 2MB is ready. The first payload are Keccak-1600 bytes 66..191. The next payload is encryption result of the previous payload. Each 128-byte payload is actually encrypted 10 times. The details are a bit more nuanced, see \"Scratchpad Initialization\" in CryptoNote Standard .","title":"Step 1: scratchpad initialization"},{"location":"proof-of-work/cryptonight/#step-2-memory-hard-loop","text":"The second step is basically 524288 iterations of a simple stateful algorithm. Each algorithm iteration reads from and writes back to the scratchpad, at pseudorandom-but-deterministic locations. Critically, next iteration depends on the state prepared by previous iterations. It is not possible to directly calculate state of future iterations. The specific operations include AES, XOR, 8byte_mul, 8byte_add - operations that are CPU-friendly (highly optimized on modern CPU-s). The goal here is to make memory latency the bottleneck in attempt to close the gap between potential ASIC-s and general purpose CPU-s.","title":"Step 2: memory-hard loop"},{"location":"proof-of-work/cryptonight/#step-3-hashing","text":"The final step (simplifying) is to: combine original Keccak-1600 output with the whole scratchpad pick the hashing algorithm based on 2 low-order bits of the result 0=BLAKE-256 1=Groestl-256 2=JH-256 3=Skein-256 hash the result with selected function The resulting 256-bit hash is the final output of CryptoNight algorithm.","title":"Step 3: hashing"},{"location":"proof-of-work/cryptonight/#monero-specific-modifications","text":"","title":"Monero specific modifications"},{"location":"proof-of-work/cryptonight/#cryptonight-v0","text":"This is how Monero community refers to original implementation of CryptoNight.","title":"CryptoNight v0"},{"location":"proof-of-work/cryptonight/#cryptonight-v1","text":"See the source code diff .","title":"CryptoNight v1"},{"location":"proof-of-work/cryptonight/#cryptonight-v2","text":"See the rationale and the source code diff .","title":"CryptoNight v2"},{"location":"proof-of-work/cryptonight/#cryptonight-v3-aka-cryptonightr","text":"See the rationale and the source code diff .","title":"CryptoNight v3 aka CryptoNightR"},{"location":"proof-of-work/cryptonight/#critique","text":"CryptoNight hash is relatively expensive to verify. This poses a risk of DoS-ing nodes with incorrect proofs to process. See strong asymmetry requirement. The hash function was designed from scratch with limited peer review. While CryptoNight is composed of proven and peer-reviewed primitives, combining secure primitives doesn't necessarily result in a secure cryptosystem. CryptoNight ultimately failed to prevent ASIC-s. Complexity of CryptoNight kills competition in ASIC manufacturing. CryptoNight proof of work remains one of the most controversial aspect of Monero.","title":"Critique"},{"location":"proof-of-work/cryptonight/#reference","text":"CryptoNight hash function description in the CryptoNote Standard CryptoNight v2 source code The entry point is cn_slow_hash() function. Manually removing support and optimizations for multiple architectures should help you understand the actual code. \"Egalitarian Proof of Work\" chapter in CryptoNote whitepaper First days of Monero mining by dr David Andersen Some test vectors in Monero source code","title":"Reference"},{"location":"proof-of-work/pow-in-cryptocurrencies/","text":"Proof of Work in Cryptocurrencies \u00b6 Proof of work is a Sybil protection mechanism PoW protects against Sybil attack \u00b6 In decentralized cryptocurrencies untrusted actors confirm (blocks of) transactions. If threshold voting was employed then the scheme would break immediately. This is because nothing prevents a single actor from creating arbitrary number of pseudonyms and take over the voting. In distributed systems this is known as Sybil attack. Instead, cryptocurrencies employ proof of work. In the proof of work scheme, it is not the number of actors that counts. It is the amount of committed computational resources. This, of course, is much harder to game. To endanger the scheme, an attacker would have to actually control majority (>50%) of computational resources. In practice, attacker would need this control over significant period of time. PoW is a leader election mechanism \u00b6 In distributed systems \"leader election\" is a process of establishing which node is responsible for (temporarily) coordinating the system. In cryptocurrencies PoW is used to elect the node that \"wins\" the next block. Using PoW for leader election was one of the key inventions introduced by Bitcoin. Competing nodes (known as \"miners\") work on a solution to artificial problem. Every now and then, someone randomly finds the solution. Chances are linearly proportional to committed computing power. The winner uses its solution to \"underwrite\" the block it assembled. Only blocks with valid solutions are accepted by the network. The winner also gets a reward for its work. The reward is a specific amount of cryptocurrency created \"out of thin air\" and assigned to self. The winner also gets all fees coming from transactions included in the block. The difficulty of the PoW problem is dynamically adjusted by the network, with the goal of finding blocks with a roughly constant rate (typically, every couple of minutes).","title":"PoW in Cryptocurrencies"},{"location":"proof-of-work/pow-in-cryptocurrencies/#proof-of-work-in-cryptocurrencies","text":"Proof of work is a Sybil protection mechanism","title":"Proof of Work in Cryptocurrencies"},{"location":"proof-of-work/pow-in-cryptocurrencies/#pow-protects-against-sybil-attack","text":"In decentralized cryptocurrencies untrusted actors confirm (blocks of) transactions. If threshold voting was employed then the scheme would break immediately. This is because nothing prevents a single actor from creating arbitrary number of pseudonyms and take over the voting. In distributed systems this is known as Sybil attack. Instead, cryptocurrencies employ proof of work. In the proof of work scheme, it is not the number of actors that counts. It is the amount of committed computational resources. This, of course, is much harder to game. To endanger the scheme, an attacker would have to actually control majority (>50%) of computational resources. In practice, attacker would need this control over significant period of time.","title":"PoW protects against Sybil attack"},{"location":"proof-of-work/pow-in-cryptocurrencies/#pow-is-a-leader-election-mechanism","text":"In distributed systems \"leader election\" is a process of establishing which node is responsible for (temporarily) coordinating the system. In cryptocurrencies PoW is used to elect the node that \"wins\" the next block. Using PoW for leader election was one of the key inventions introduced by Bitcoin. Competing nodes (known as \"miners\") work on a solution to artificial problem. Every now and then, someone randomly finds the solution. Chances are linearly proportional to committed computing power. The winner uses its solution to \"underwrite\" the block it assembled. Only blocks with valid solutions are accepted by the network. The winner also gets a reward for its work. The reward is a specific amount of cryptocurrency created \"out of thin air\" and assigned to self. The winner also gets all fees coming from transactions included in the block. The difficulty of the PoW problem is dynamically adjusted by the network, with the goal of finding blocks with a roughly constant rate (typically, every couple of minutes).","title":"PoW is a leader election mechanism"},{"location":"proof-of-work/random-x/","text":"RandomX \u00b6 For general information about RandomX you can read this article .","title":"RandomX"},{"location":"proof-of-work/random-x/#randomx","text":"For general information about RandomX you can read this article .","title":"RandomX"},{"location":"proof-of-work/what-is-pow/","text":"Proof of Work \u00b6 Proof of work is a way to legitimize untrusted party What exactly is proof of work? \u00b6 Proof of work is a cryptographic proof that untrusted party committed significant computational resources to solve artificial problem. Technically, the \"proof\" is simply a solution to the problem at hand. It's all about legitimizing untrusted party \u00b6 How an untrusted party on the Internet could earn any level of your trust? It can prove its commitment by solving agreed computationally hard problem. For example, by requiring untrusted party to perform a hard computation before you accept their connection, you limit connections only to \"committed\" parties. In another example, you could require PoW to be attached to incoming e-mails to make spam prohibitively expensive. Work must be otherwise useless \u00b6 The work on and solution to \"computationally hard problem\" cannot be useful in any other way than to prove the commitment. If the work is useful elsewhere then it doesn't prove commitment to you. The problem must be artificial. Otherwise incentives are skewed and the whole scheme breaks. Strong asymmetry \u00b6 The requirement for proof of work scheme is strong asymmetry for work vs verification resources. The work must be arbitrarily hard. At the same time proof verification must remain dirt cheap (in terms of computational resources). Cheap verification is critical because at this stage we are dealing with potentially huge number of untrusted parties, who could DoS the verifier by submitting invalid proofs. Such proofs should be trivial to discard.","title":"What is PoW?"},{"location":"proof-of-work/what-is-pow/#proof-of-work","text":"Proof of work is a way to legitimize untrusted party","title":"Proof of Work"},{"location":"proof-of-work/what-is-pow/#what-exactly-is-proof-of-work","text":"Proof of work is a cryptographic proof that untrusted party committed significant computational resources to solve artificial problem. Technically, the \"proof\" is simply a solution to the problem at hand.","title":"What exactly is proof of work?"},{"location":"proof-of-work/what-is-pow/#its-all-about-legitimizing-untrusted-party","text":"How an untrusted party on the Internet could earn any level of your trust? It can prove its commitment by solving agreed computationally hard problem. For example, by requiring untrusted party to perform a hard computation before you accept their connection, you limit connections only to \"committed\" parties. In another example, you could require PoW to be attached to incoming e-mails to make spam prohibitively expensive.","title":"It's all about legitimizing untrusted party"},{"location":"proof-of-work/what-is-pow/#work-must-be-otherwise-useless","text":"The work on and solution to \"computationally hard problem\" cannot be useful in any other way than to prove the commitment. If the work is useful elsewhere then it doesn't prove commitment to you. The problem must be artificial. Otherwise incentives are skewed and the whole scheme breaks.","title":"Work must be otherwise useless"},{"location":"proof-of-work/what-is-pow/#strong-asymmetry","text":"The requirement for proof of work scheme is strong asymmetry for work vs verification resources. The work must be arbitrarily hard. At the same time proof verification must remain dirt cheap (in terms of computational resources). Cheap verification is critical because at this stage we are dealing with potentially huge number of untrusted parties, who could DoS the verifier by submitting invalid proofs. Such proofs should be trivial to discard.","title":"Strong asymmetry"},{"location":"public-address/integrated-address/","text":"Integrated Address \u00b6 Integrated addresses are ideal for accepting Monero in an automated fashion - like in online stores and exchanges. Monero integrated address embeds a payment ID. This allows you to learn for what you are being paid. Please note these are Monero technical payment IDs and must not be confused with business identifiers like order number or invoice number. The transaction to integrated address will not reveal the payment ID publicly. Payment ID in a transaction will be encrypted with a shared secret (one-time random key known only to sender and recipient). Only the recipient will be able to match the transaction against payment ID. Monero integrated address obsoletes the former practice of using full 32-bytes payment ID in a transaction extra field (where it was not encrypted). Data structure ( src ): Index Size in bytes Description 0 1 identifies the network and address type; 19 - main chain; 54 - test chain 1 32 public spend key 33 32 public view key 65 8 compact payment ID - 8 bytes randomly generated by the recipient; note that it does not need encryption in the address itself but it is hidden in a transaction paying to integrated address to prevent linking payment with the address by external observers 73 4 checksum ( Keccak-f[1600] hash of the previous 73 bytes, trimmed to first 4 bytes) It totals to 77 bytes. The bytes are then encoded ( src ) in Monero specific Base58 format, resulting in a 106 chars long string. Example integrated address: 4LL9oSLmtpccfufTMvppY6JwXNouMBzSkbLYfpAV5Usx3skxNgYeYTRj5UzqtReoS44qo9mtmXCqY45DJ852K5Jv2bYXZKKQePHES9khPK Integrated addresses vs subaddresses \u00b6 Both types allow you to learn for what you are being paid. Individuals should prefer subaddresses to receive payments. This is to improve privacy in certain scenarios. See article on subaddresses for details. Businesses accepting payments in an automated way should prefer integrated addresses . The rationale is as follows: Scenario where subaddresses improve privacy is not applicable to businesses b/c businesses have the same identity over time. Consequently, subaddresses provide no benefits over integrated addresses. No private key is necessary to generate integrated address. This provides a strong security advantage because services that generate integrated addresses need no access to wallet. In contrast, to generate a subaddress, one needs a private view key. No shared counter is necessary to generate integrated address. This allows individual services to independently generate integrated addresses w/o synchronizing on a common sequence. In contrast, subaddresses are generated sequentially, and so the sequence (the counter or index) is a coupling point between the wallet and all services that need to generate the address. Back to integrated addresses, note that embedded payment IDs are 64-bit. This means the space is large enough that one can simply generate them randomly and reliably assume uniqueness. In very specific scenarios, preparation effort to monitor a very huge number of subaddresses, could became an issue. See this reddit thread for details. Caveats \u00b6 There are some caveats: Single transaction cannot pay to multiple integrated addresses. As individual running a wallet you should generally prefer subaddresses. However, if you happen to use integrated addresses, you should allow Monero software to generate integrated addresses for you (instead of forcing your own payment IDs). Reference \u00b6 question on StackExchange","title":"Integrated"},{"location":"public-address/integrated-address/#integrated-address","text":"Integrated addresses are ideal for accepting Monero in an automated fashion - like in online stores and exchanges. Monero integrated address embeds a payment ID. This allows you to learn for what you are being paid. Please note these are Monero technical payment IDs and must not be confused with business identifiers like order number or invoice number. The transaction to integrated address will not reveal the payment ID publicly. Payment ID in a transaction will be encrypted with a shared secret (one-time random key known only to sender and recipient). Only the recipient will be able to match the transaction against payment ID. Monero integrated address obsoletes the former practice of using full 32-bytes payment ID in a transaction extra field (where it was not encrypted). Data structure ( src ): Index Size in bytes Description 0 1 identifies the network and address type; 19 - main chain; 54 - test chain 1 32 public spend key 33 32 public view key 65 8 compact payment ID - 8 bytes randomly generated by the recipient; note that it does not need encryption in the address itself but it is hidden in a transaction paying to integrated address to prevent linking payment with the address by external observers 73 4 checksum ( Keccak-f[1600] hash of the previous 73 bytes, trimmed to first 4 bytes) It totals to 77 bytes. The bytes are then encoded ( src ) in Monero specific Base58 format, resulting in a 106 chars long string. Example integrated address: 4LL9oSLmtpccfufTMvppY6JwXNouMBzSkbLYfpAV5Usx3skxNgYeYTRj5UzqtReoS44qo9mtmXCqY45DJ852K5Jv2bYXZKKQePHES9khPK","title":"Integrated Address"},{"location":"public-address/integrated-address/#integrated-addresses-vs-subaddresses","text":"Both types allow you to learn for what you are being paid. Individuals should prefer subaddresses to receive payments. This is to improve privacy in certain scenarios. See article on subaddresses for details. Businesses accepting payments in an automated way should prefer integrated addresses . The rationale is as follows: Scenario where subaddresses improve privacy is not applicable to businesses b/c businesses have the same identity over time. Consequently, subaddresses provide no benefits over integrated addresses. No private key is necessary to generate integrated address. This provides a strong security advantage because services that generate integrated addresses need no access to wallet. In contrast, to generate a subaddress, one needs a private view key. No shared counter is necessary to generate integrated address. This allows individual services to independently generate integrated addresses w/o synchronizing on a common sequence. In contrast, subaddresses are generated sequentially, and so the sequence (the counter or index) is a coupling point between the wallet and all services that need to generate the address. Back to integrated addresses, note that embedded payment IDs are 64-bit. This means the space is large enough that one can simply generate them randomly and reliably assume uniqueness. In very specific scenarios, preparation effort to monitor a very huge number of subaddresses, could became an issue. See this reddit thread for details.","title":"Integrated addresses vs subaddresses"},{"location":"public-address/integrated-address/#caveats","text":"There are some caveats: Single transaction cannot pay to multiple integrated addresses. As individual running a wallet you should generally prefer subaddresses. However, if you happen to use integrated addresses, you should allow Monero software to generate integrated addresses for you (instead of forcing your own payment IDs).","title":"Caveats"},{"location":"public-address/integrated-address/#reference","text":"question on StackExchange","title":"Reference"},{"location":"public-address/main-address/","text":"","title":"Main address"},{"location":"public-address/standard-address/","text":"Address \u00b6 Monero public address is what you publish to get paid. An address can be generated offline and for free. It boils down to generating a large random number representing your private spending key. Publishing your Monero address does not endanger your privacy. That's because in Monero transactions go to stealth addresses which are decoupled from your public address. There are a few types of public addresses in Monero: Standard address - basic type of an address, also referred to as raw address Subaddress - what you should be using by default Integrated address - relevant for exchanges, merchants, and other businesses accepting Monero in a fully automated way Standard address \u00b6 Historically, raw address was the only available option. For that reason it is the most widely adopted and supported address type. Its strength is simplicity. However, these days users should prefer receiving to subaddresses instead. Technically, raw address is also a basis for creating subaddresses and integrated addresses. Raw address is still useful for : accepting block reward in a solo-mining scenario as other addresses are not supported accepting from senders who batch payouts (like mining pools); in this scenario the sender is paying multiple parties using a single transaction; such transaction has multiple outputs; subaddresses do not work in this scenario accepting from senders who use legacy wallets (can't send to subaddress) Monero raw address is composed of two public keys: public spend key public view key It also contains a checksum and a \"network byte\" which actually identifies both the network and the address type. Data structure \u00b6 Index Size in bytes Description 0 1 identifies the network and address type; 18 - main chain; 53 - test chain 1 32 public spend key 33 32 public view key 65 4 checksum ( Keccak-f[1600] hash of the previous 65 bytes, trimmed to first 4 bytes) It totals to 69 bytes. The bytes are then encoded ( src ) in Monero specific Base58 format, resulting in a 95 chars long string. Example standard address: 4AdUndXHHZ6cfufTMvppY6JwXNouMBzSkbLYfpAV5Usx3skxNgYeYTRj5UzqtReoS44qo9mtmXCqY45DJ852K5Jv2684Rge See the source code . Generating \u00b6 Standard address is derived from the root private key. TODO. Reference \u00b6 StackExchenge answer https://xmr.llcoins.net/addresstests.html","title":"Standard"},{"location":"public-address/standard-address/#address","text":"Monero public address is what you publish to get paid. An address can be generated offline and for free. It boils down to generating a large random number representing your private spending key. Publishing your Monero address does not endanger your privacy. That's because in Monero transactions go to stealth addresses which are decoupled from your public address. There are a few types of public addresses in Monero: Standard address - basic type of an address, also referred to as raw address Subaddress - what you should be using by default Integrated address - relevant for exchanges, merchants, and other businesses accepting Monero in a fully automated way","title":"Address"},{"location":"public-address/standard-address/#standard-address","text":"Historically, raw address was the only available option. For that reason it is the most widely adopted and supported address type. Its strength is simplicity. However, these days users should prefer receiving to subaddresses instead. Technically, raw address is also a basis for creating subaddresses and integrated addresses. Raw address is still useful for : accepting block reward in a solo-mining scenario as other addresses are not supported accepting from senders who batch payouts (like mining pools); in this scenario the sender is paying multiple parties using a single transaction; such transaction has multiple outputs; subaddresses do not work in this scenario accepting from senders who use legacy wallets (can't send to subaddress) Monero raw address is composed of two public keys: public spend key public view key It also contains a checksum and a \"network byte\" which actually identifies both the network and the address type.","title":"Standard address"},{"location":"public-address/standard-address/#data-structure","text":"Index Size in bytes Description 0 1 identifies the network and address type; 18 - main chain; 53 - test chain 1 32 public spend key 33 32 public view key 65 4 checksum ( Keccak-f[1600] hash of the previous 65 bytes, trimmed to first 4 bytes) It totals to 69 bytes. The bytes are then encoded ( src ) in Monero specific Base58 format, resulting in a 95 chars long string. Example standard address: 4AdUndXHHZ6cfufTMvppY6JwXNouMBzSkbLYfpAV5Usx3skxNgYeYTRj5UzqtReoS44qo9mtmXCqY45DJ852K5Jv2684Rge See the source code .","title":"Data structure"},{"location":"public-address/standard-address/#generating","text":"Standard address is derived from the root private key. TODO.","title":"Generating"},{"location":"public-address/standard-address/#reference","text":"StackExchenge answer https://xmr.llcoins.net/addresstests.html","title":"Reference"},{"location":"public-address/subaddress/","text":"Subaddress \u00b6 Subaddress is what you should be using by default to receive Monero. Learn for what you are being paid \u00b6 By providing a unique subaddress for each anticipated payment you will know for what you are being paid. This use case overlaps with integrated addresses. Subaddresses are generally prefered for reasons outlined below. Prevent payer from linking your payouts together \u00b6 To prevent the payer from linking your payouts together simply generate a new subaddress for each payout. This way specific service (like anonymous exchange) that sends you Monero won't (easilly) know it is you again receving Monero. The exception to this is when a service (or group of colluding services) decides to actively attack you, one address at the time, with the so-called Janus attack , which risks them losing funds. If you need perfect unlinkability of your receivables, the only solution remains to use a separate seed (separate Monero wallet). Also, note it won't help if you have an account with the service. Then your payouts are already linked in the service database, regardless of Monero. Group funds into accounts \u00b6 Accounts are a convenience wallet-level feature to group subaddresses under one label and balance. You may want to organize your funds into accounts like \"cash\", \"work\", \"trading\", \"mining\", \"donations\", etc. As accounts are only groupings of subaddresses, they themselves do not have an address. Accounts are deterministically derived from the root private key along with subaddresses. Accounts are similar to subaccounts in your classic bank account. There is a very important difference though. In Monero funds don't really sit on accounts or public addresses. Public addresses are conceptually a gateway or a routing mechanism. Funds sit on transactions' unspent outputs. Thus, a single transaction can - in principle - aggregate and spend outputs from multiple addresses (and by extension from multiple accounts). The CLI or GUI wallet may not directly support creating such transactions for simplicity. In short, think of accounts as a soft grouping of your funds. Why not multiple wallets? \u00b6 The advantage over creating multiple wallets is that you only have a single seed to manage. All subaddresses can be derived from the wallet seed. Additionally, you conveniently manage your subaddresses within a single user interface. Wallet level feature \u00b6 Subaddresses and accounts are a wallet-level feature to construct and interpret transactions. They do not affect the consensus. Data structure \u00b6 Subaddress has a dedicated \"network byte\": Index Size in bytes Description 0 1 identifies the network and address type; 42 - mainnet; 36 - stagenet; 63 - testnet Otherwise the data structure is the same as for the standard address . Generating \u00b6 Each subaddress conceptually has: account index (also known as \"major\" index) subaddress index within the account (also known as \"minor\" index) The indexes are 0-based. By default wallets use account index 0. The indexes are not directly included in the subaddress data structure. Instead, they are used as input to generating subaddress keys. Private view key \u00b6 A per-subaddress scalar m is derived as follows: m = Hs(\"SubAddr\" || a || account_index || subaddress_index_within_account) Where: Hs is a Keccak-256 hash function interpreted as integer and modulo l (maximum edwards25519 scalar) || is a byte array concatenation operator SubAddr is a 0-terminated fixed string (8 bytes total) a is a private view key of the standard address (a 32 byte little endian unsigned integer) account_index is index of an account (a 32 bit little endian unsigned integer) subaddress_index_within_account is index of the subaddress within the account (a 32 bit little endian unsigned integer) Deriving \"sub view keys\" from the main view key allows for creating a view only wallet that monitors the entire wallet including subaddresses. Public spend key \u00b6 The subaddress public spend key D is derived as follows: D = B + m*G Where: B is standard address public spend key m is a per-subaddress scalar that is derived from the private spend key G is the \"base point\"; this is simply a constant specific to edwards25519 Public view key \u00b6 The subaddress public view key C is derived as follows: C = a*D Where: a is a private view key of the standard address D is a public spend key of the subaddress Special case for (0, 0) \u00b6 The subaddress #0 on the account #0 is the standard address . As standard address has different generation rules, this is simply implemented via an if statement. Building the address string \u00b6 The procedure is the same as for the standard address . Caveats \u00b6 It is not recommended to sweep all the balances of subaddress to standard address in a single transaction. That links the subaddresses together on the blockchain. However, this only concerns privacy against specific sender and the situation will never get worse than not using subaddresses in the first place. If you need to join funds while preserving maximum privacy do it with individual transactions (one per subaddress). Convenience labels are not preserved when recreating from seed. Reference \u00b6 monero-python - the easiest to follow implementation by Micha\u0142 Sa\u0142aban get_subaddress_spend_public_key() - Monero reference implementation historical discussion on Github - gives context but is not up to date with all details StackExchange answer - excellent summary by knaccc","title":"Subaddress"},{"location":"public-address/subaddress/#subaddress","text":"Subaddress is what you should be using by default to receive Monero.","title":"Subaddress"},{"location":"public-address/subaddress/#learn-for-what-you-are-being-paid","text":"By providing a unique subaddress for each anticipated payment you will know for what you are being paid. This use case overlaps with integrated addresses. Subaddresses are generally prefered for reasons outlined below.","title":"Learn for what you are being paid"},{"location":"public-address/subaddress/#prevent-payer-from-linking-your-payouts-together","text":"To prevent the payer from linking your payouts together simply generate a new subaddress for each payout. This way specific service (like anonymous exchange) that sends you Monero won't (easilly) know it is you again receving Monero. The exception to this is when a service (or group of colluding services) decides to actively attack you, one address at the time, with the so-called Janus attack , which risks them losing funds. If you need perfect unlinkability of your receivables, the only solution remains to use a separate seed (separate Monero wallet). Also, note it won't help if you have an account with the service. Then your payouts are already linked in the service database, regardless of Monero.","title":"Prevent payer from linking your payouts together"},{"location":"public-address/subaddress/#group-funds-into-accounts","text":"Accounts are a convenience wallet-level feature to group subaddresses under one label and balance. You may want to organize your funds into accounts like \"cash\", \"work\", \"trading\", \"mining\", \"donations\", etc. As accounts are only groupings of subaddresses, they themselves do not have an address. Accounts are deterministically derived from the root private key along with subaddresses. Accounts are similar to subaccounts in your classic bank account. There is a very important difference though. In Monero funds don't really sit on accounts or public addresses. Public addresses are conceptually a gateway or a routing mechanism. Funds sit on transactions' unspent outputs. Thus, a single transaction can - in principle - aggregate and spend outputs from multiple addresses (and by extension from multiple accounts). The CLI or GUI wallet may not directly support creating such transactions for simplicity. In short, think of accounts as a soft grouping of your funds.","title":"Group funds into accounts"},{"location":"public-address/subaddress/#why-not-multiple-wallets","text":"The advantage over creating multiple wallets is that you only have a single seed to manage. All subaddresses can be derived from the wallet seed. Additionally, you conveniently manage your subaddresses within a single user interface.","title":"Why not multiple wallets?"},{"location":"public-address/subaddress/#wallet-level-feature","text":"Subaddresses and accounts are a wallet-level feature to construct and interpret transactions. They do not affect the consensus.","title":"Wallet level feature"},{"location":"public-address/subaddress/#data-structure","text":"Subaddress has a dedicated \"network byte\": Index Size in bytes Description 0 1 identifies the network and address type; 42 - mainnet; 36 - stagenet; 63 - testnet Otherwise the data structure is the same as for the standard address .","title":"Data structure"},{"location":"public-address/subaddress/#generating","text":"Each subaddress conceptually has: account index (also known as \"major\" index) subaddress index within the account (also known as \"minor\" index) The indexes are 0-based. By default wallets use account index 0. The indexes are not directly included in the subaddress data structure. Instead, they are used as input to generating subaddress keys.","title":"Generating"},{"location":"public-address/subaddress/#private-view-key","text":"A per-subaddress scalar m is derived as follows: m = Hs(\"SubAddr\" || a || account_index || subaddress_index_within_account) Where: Hs is a Keccak-256 hash function interpreted as integer and modulo l (maximum edwards25519 scalar) || is a byte array concatenation operator SubAddr is a 0-terminated fixed string (8 bytes total) a is a private view key of the standard address (a 32 byte little endian unsigned integer) account_index is index of an account (a 32 bit little endian unsigned integer) subaddress_index_within_account is index of the subaddress within the account (a 32 bit little endian unsigned integer) Deriving \"sub view keys\" from the main view key allows for creating a view only wallet that monitors the entire wallet including subaddresses.","title":"Private view key"},{"location":"public-address/subaddress/#public-spend-key","text":"The subaddress public spend key D is derived as follows: D = B + m*G Where: B is standard address public spend key m is a per-subaddress scalar that is derived from the private spend key G is the \"base point\"; this is simply a constant specific to edwards25519","title":"Public spend key"},{"location":"public-address/subaddress/#public-view-key","text":"The subaddress public view key C is derived as follows: C = a*D Where: a is a private view key of the standard address D is a public spend key of the subaddress","title":"Public view key"},{"location":"public-address/subaddress/#special-case-for-0-0","text":"The subaddress #0 on the account #0 is the standard address . As standard address has different generation rules, this is simply implemented via an if statement.","title":"Special case for (0, 0)"},{"location":"public-address/subaddress/#building-the-address-string","text":"The procedure is the same as for the standard address .","title":"Building the address string"},{"location":"public-address/subaddress/#caveats","text":"It is not recommended to sweep all the balances of subaddress to standard address in a single transaction. That links the subaddresses together on the blockchain. However, this only concerns privacy against specific sender and the situation will never get worse than not using subaddresses in the first place. If you need to join funds while preserving maximum privacy do it with individual transactions (one per subaddress). Convenience labels are not preserved when recreating from seed.","title":"Caveats"},{"location":"public-address/subaddress/#reference","text":"monero-python - the easiest to follow implementation by Micha\u0142 Sa\u0142aban get_subaddress_spend_public_key() - Monero reference implementation historical discussion on Github - gives context but is not up to date with all details StackExchange answer - excellent summary by knaccc","title":"Reference"},{"location":"r/accepting-monero-comparison-matrix/","text":"","title":"Accepting monero comparison matrix"},{"location":"running-node/open-node-tor-onion/","text":"Running Monero Open Node + Tor Onion \u00b6 Powerful setup This is great contribution to Monero network and also a pretty sophisticated personal setup. If you are a beginner, you don't need this. The end goal You will publicly offer the following services, where xxx.yyy.zzz.vvv is your server IP address. xxx.yyy.zzz.vvv:18080 - clearnet P2P service (for other nodes) xxx.yyy.zzz.vvv:18081 - clearnet RPC service (for wallets) yourlongv3onionaddress.onion:18083 - onion P2P service (for other onion nodes) yourlongv3onionaddress.onion:18081 - onion RPC service (for wallets connecting over Tor) Why different P2P ports for clearnet and onion? This is a monerod requirement. Broadcasting bad transactions from your IP As with any public data broadcast or relay service, \"bad traffic\" or in this case \"bad transactions\" may appear to originate from your server IP address from an outside observer perspective - even though they really originate from a remote wallet user. This is a potential risk you need to keep in mind. Why run this specific setup? \u00b6 You will be able to connect your desktop and mobile Monero wallets to your own trusted Monero node, in a secure and private way over Tor. Your node will be always ready w/o delays (always synced up, contrary to intermittently running node on a laptop). Serving blocks and transactions in Monero P2P network helps new users to bootstrap and sync up their nodes. It also strenghtens Monero P2P network against DDoS attacks and network partitioning. Open wallet inteface (the \"RPC\") allows anyone to connect their wallets to Monero network through your node. This is useful for beginner users who don't run their own nodes yet. Tor onion for wallet interface is useful for wallet users connecting over Tor because it mitigates Tor exit nodes MiTM risks (which are very real). By connecting wallet to an onion service, no MiTM attack is realistic because within the Tor network connections are end-to-end TLS-ed. Tor onion for P2P network is useful for other full node users as it allows them to broadcast transactions over Tor (using --tx-proxy option). Assumptions \u00b6 You understand basic Linux administration. You seek Monero specific guidance. You have root access to a Linux server with 2GB+ RAM and 120GB+ SSD (or 50GB+ for the pruned node version). This is current for Jan 2021. Some commands assume Ubuntu but you will easily translate them to your distribution. Install Tor \u00b6 Install Tor . Modify /etc/tor/torrc as shown below. Enable tor service with systemctl enable tor and restart it via systemctl restart tor Verify the Tor is up systemctl status tor@default A fresh onion address and corresponding key pair got created for you by the tor daemon in /var/lib/tor/monero/ . You may want to backup these to secure control over your onion address. This happens on restart whenever you add new HiddenServiceDir to torrc config. Monero daemon itself is not necessary at this point. The onion services (AKA hidden services) will just wait until localhost monerod shows up at specified ports 18081 and 18083. /etc/tor/torrc \u00b6 HiddenServiceDir /var/lib/tor/monero HiddenServicePort 18081 127.0.0.1 :18081 # interface for wallet ( \"RPC\" ) HiddenServicePort 18083 127.0.0.1 :18083 # interface for P2P network How Tor onion services work? The tor daemon will simply pass over the traffic from virtual onion port to actual localhost port, where some service is listening (in our case, this will be monerod ). A single onion address can offer multiple services at various virtual ports. We will use this to expose both P2P and RPC monerod services on a single onion. You could host any number of onion addresses at single server or IP address but we won't need that here. Install Monero \u00b6 Create monero user and group useradd --system monero Create monero binaries directory (empty for now) mkdir -p /opt/monero and chown -R monero:monero /opt/monero Create monero data directory mkdir -p /srv/monero and chown -R monero:monero /srv/monero Create monero log directory mkdir -p /var/log/monero and chown -R monero:monero /var/log/monero Feel free to adjust above to your preferred conventions, just remember to adjust the paths accordingly. Download and verify the file. Extract tar -xf monero-linux-x64-v0.17.1.9.tar.bz2 (adjust filename). Move binaries to /opt/monero/ with mv monero-x86_64-linux-gnu-v0.17.1.9/* /opt/monero/ then chown -R monero:monero /opt/monero Create /etc/monero.conf as shown below and paste your values in placeholders . Create /etc/systemd/system/monero.service as shown below. Enable monero service with systemctl enable monero and restart it with systemctl restart monero Verify it is up systemctl status monero Verify it is working as intended tail -n100 /var/log/monero/monero.log /etc/monero.conf \u00b6 This is just an example configuration and it is by no means authoritative. Feel free to modify, see monerod reference . Modify paths if you changed them. Print your onion address with cat /var/lib/tor/monero/hostname and paste it to anonymous-inbound option. # /etc/monero.conf # # Configuration file for monerod. For all available options see the MoneroDocs: # https://monerodocs.org/interacting/monerod-reference/ # Data directory (blockchain db and indices) data-dir=/srv/monero # Optional prunning # prune-blockchain=1 # Pruning saves 2/3 of disk space w/o degrading functionality but contributes less to the network # sync-pruned-blocks=1 # Allow downloading pruned blocks instead of prunning them yourself check-updates=disabled # Do not check DNS TXT records for a new version # Log file log-file=/var/log/monero/monero.log log-level=0 # Minimal logs, WILL NOT log peers or wallets connecting max-log-file-size=2147483648 # Set to 2GB to mitigate log trimming by monerod; configure logrotate instead # P2P full node p2p-bind-ip=0.0.0.0 # Bind to all interfaces (the default) p2p-bind-port=18080 # Bind to default port # RPC open node public-node=1 # Advertise to other users they can use this node as a remote one for connecting their wallets confirm-external-bind=1 # Open Node (confirm) rpc-bind-ip=0.0.0.0 # Bind to all interfaces (the Open Node) rpc-bind-port=18081 # Bind to default port (the Open Node) restricted-rpc=1 # Obligatory for Open Node interface no-igd=1 # Disable UPnP port mapping no-zmq=1 # Disable ZMQ RPC server to decrease attack surface (it's not used) # RPC TLS rpc-ssl=autodetect # Use TLS if client wallet supports it (the default behavior); the certificate will be generated on the fly on every restart # Mempool size max-txpool-weight=268435456 # Maximum unconfirmed transactions pool size in bytes (here 256MB, default ~618MB) # Slow but reliable db writes db-sync-mode=safe out-peers=64 # This will enable much faster sync and tx awareness; the default 8 is suboptimal nowadays in-peers=64 # The default is unlimited; we prefer to put a cap on this limit-rate-up=1048576 # 1048576 kB/s == 1GB/s; a raise from default 2048 kB/s; contribute more to p2p network limit-rate-down=1048576 # 1048576 kB/s == 1GB/s; a raise from default 8192 kB/s; allow for faster initial sync # Tor: broadcast transactions originating from connected wallets over Tor (does not concern relayed transactions) tx-proxy=tor,127.0.0.1:9050,16 # Tor : add P2P seed nodes for the Tor network add-peer=moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion:18080 add-peer=monerozf6koypqrt.onion:18080 add-peer=zbjkbsxc5munw3qusl7j2hpcmikhqocdf4pqhnhtpzw5nt5jrmofptid.onion:18083 # https://github.com/monero-project/monero/blob/master/src/p2p/net_node.inl add-peer=rno75kjcw3ein6i446sqby2xkyqjarb75oq36ah6c2mribyklzhurpyd.onion:28083 # it's mainnet despite the weird port, according to reddit add-peer=sqzrokz36lgkng2i2nlzgzns2ugcxqosflygsxbkybb4xn6gq3ouugqd.onion:18083 # very flaky, works 1 in 3 times # Tor: tell monerod your onion address so it can be advertised on P2P network anonymous-inbound=PASTE_YOUR_ONION_HOSTNAME:18083,127.0.0.1:18083,64 # Tor: be forgiving to connecting wallets; suggested by http://xmrguide42y34onq.onion/remote_nodes disable-rpc-ban=1 /etc/.../monero.service \u00b6 # /etc/systemd/system/monero.service [Unit] Description = Monero Daemon After = network.target Wants = network.target [Service] ExecStart = /opt/monero/monerod --detach --config-file /etc/monero.conf --pidfile /run/monero/monerod.pid ExecStartPost = /bin/sleep 0.1 Type = forking PIDFile = /run/monero/monerod.pid Restart = always RestartSec = 16 User = monero Group = monero RuntimeDirectory = monero StandardOutput = journal StandardError = journal [Install] WantedBy = multi-user.target Open firewall ports \u00b6 If you use a firewall (and you should), open 18080 and 18081 ports for incoming TCP connections. These are for the incoming clearnet connections, P2P and RPC respectively. You do not need to open any ports for Tor. The onion services work with virtual ports. The tor daemon does not directly accept incoming connections and so it needs no open ports. For example, for popular ufw firewall, that would be: ufw allow 18080 /tcp ufw allow 18081 /tcp To verify, use ufw status . The output should be similar to the following (the 22 being default SSH port, unrelated to Monero): To Action From -- ------ ---- 22/tcp LIMIT Anywhere 18080/tcp ALLOW Anywhere 18081/tcp ALLOW Anywhere 22/tcp (v6) LIMIT Anywhere (v6) 18080/tcp (v6) ALLOW Anywhere (v6) 18081/tcp (v6) ALLOW Anywhere (v6) Testing \u00b6 On server \u00b6 List all services listening on ports and make sure it is what you expect: sudo netstat -lntpu The output should include these (in any order); obviously the PID values will differ. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ... tcp 0 0 0.0.0.0:18080 0.0.0.0:* LISTEN 259255/monerod tcp 0 0 0.0.0.0:18081 0.0.0.0:* LISTEN 259255/monerod tcp 0 0 127.0.0.1:18083 0.0.0.0:* LISTEN 259255/monerod tcp 0 0 127.0.0.1:9050 0.0.0.0:* LISTEN 258786/tor On client machine \u00b6 Finally, we want to test connections from your client machine. Install tor and torsocks on your laptop, you will want them anyway for Monero wallet. Just for testing, you will also need nmap and proxychains . Test clearnet P2P connection: nmap -Pn -p 18080 YOUR_IP_ADDRESS_HERE Test clearnet RPC connection: curl --digest -X POST http://YOUR_IP_ADDRESS_HERE:18081/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_info\"}' -H 'Content-Type: application/json' Test onion P2P connection (skip if you don't have proxychains): proxychains nmap -Pn -p 18083 YOUR_ONION_ADDRESS_HERE.onion Test onion RPC connection: torsocks curl --digest -X POST http://YOUR_ONION_ADDRESS_HERE.onion:18081/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_info\"}' -H 'Content-Type: application/json' Debugging \u00b6 Tor: Status: systemctl status tor@default Logs: journalctl -xe --unit tor@default Monero: Status: systemctl status monero Logs: tail -n100 /var/log/monero/monero.log Logs more info: change log-level=0 to log-level=1 in monero.conf (remember to revert once solved) Further improvements \u00b6 Periodic restarts \u00b6 It's likely worthwhile to add peridic auto-restarting to both tor and monerod every couple hours. Neither daemon is perfect; they can get stuck or leak memory in edge case situations, like the recent attacks on Tor v3 or DDoS attacks on the Monero network. One possible way would be to use systemd timers.","title":"Open Node + Tor Onion"},{"location":"running-node/open-node-tor-onion/#running-monero-open-node-tor-onion","text":"Powerful setup This is great contribution to Monero network and also a pretty sophisticated personal setup. If you are a beginner, you don't need this. The end goal You will publicly offer the following services, where xxx.yyy.zzz.vvv is your server IP address. xxx.yyy.zzz.vvv:18080 - clearnet P2P service (for other nodes) xxx.yyy.zzz.vvv:18081 - clearnet RPC service (for wallets) yourlongv3onionaddress.onion:18083 - onion P2P service (for other onion nodes) yourlongv3onionaddress.onion:18081 - onion RPC service (for wallets connecting over Tor) Why different P2P ports for clearnet and onion? This is a monerod requirement. Broadcasting bad transactions from your IP As with any public data broadcast or relay service, \"bad traffic\" or in this case \"bad transactions\" may appear to originate from your server IP address from an outside observer perspective - even though they really originate from a remote wallet user. This is a potential risk you need to keep in mind.","title":"Running Monero Open Node + Tor Onion"},{"location":"running-node/open-node-tor-onion/#why-run-this-specific-setup","text":"You will be able to connect your desktop and mobile Monero wallets to your own trusted Monero node, in a secure and private way over Tor. Your node will be always ready w/o delays (always synced up, contrary to intermittently running node on a laptop). Serving blocks and transactions in Monero P2P network helps new users to bootstrap and sync up their nodes. It also strenghtens Monero P2P network against DDoS attacks and network partitioning. Open wallet inteface (the \"RPC\") allows anyone to connect their wallets to Monero network through your node. This is useful for beginner users who don't run their own nodes yet. Tor onion for wallet interface is useful for wallet users connecting over Tor because it mitigates Tor exit nodes MiTM risks (which are very real). By connecting wallet to an onion service, no MiTM attack is realistic because within the Tor network connections are end-to-end TLS-ed. Tor onion for P2P network is useful for other full node users as it allows them to broadcast transactions over Tor (using --tx-proxy option).","title":"Why run this specific setup?"},{"location":"running-node/open-node-tor-onion/#assumptions","text":"You understand basic Linux administration. You seek Monero specific guidance. You have root access to a Linux server with 2GB+ RAM and 120GB+ SSD (or 50GB+ for the pruned node version). This is current for Jan 2021. Some commands assume Ubuntu but you will easily translate them to your distribution.","title":"Assumptions"},{"location":"running-node/open-node-tor-onion/#install-tor","text":"Install Tor . Modify /etc/tor/torrc as shown below. Enable tor service with systemctl enable tor and restart it via systemctl restart tor Verify the Tor is up systemctl status tor@default A fresh onion address and corresponding key pair got created for you by the tor daemon in /var/lib/tor/monero/ . You may want to backup these to secure control over your onion address. This happens on restart whenever you add new HiddenServiceDir to torrc config. Monero daemon itself is not necessary at this point. The onion services (AKA hidden services) will just wait until localhost monerod shows up at specified ports 18081 and 18083.","title":"Install Tor"},{"location":"running-node/open-node-tor-onion/#etctortorrc","text":"HiddenServiceDir /var/lib/tor/monero HiddenServicePort 18081 127.0.0.1 :18081 # interface for wallet ( \"RPC\" ) HiddenServicePort 18083 127.0.0.1 :18083 # interface for P2P network How Tor onion services work? The tor daemon will simply pass over the traffic from virtual onion port to actual localhost port, where some service is listening (in our case, this will be monerod ). A single onion address can offer multiple services at various virtual ports. We will use this to expose both P2P and RPC monerod services on a single onion. You could host any number of onion addresses at single server or IP address but we won't need that here.","title":"/etc/tor/torrc"},{"location":"running-node/open-node-tor-onion/#install-monero","text":"Create monero user and group useradd --system monero Create monero binaries directory (empty for now) mkdir -p /opt/monero and chown -R monero:monero /opt/monero Create monero data directory mkdir -p /srv/monero and chown -R monero:monero /srv/monero Create monero log directory mkdir -p /var/log/monero and chown -R monero:monero /var/log/monero Feel free to adjust above to your preferred conventions, just remember to adjust the paths accordingly. Download and verify the file. Extract tar -xf monero-linux-x64-v0.17.1.9.tar.bz2 (adjust filename). Move binaries to /opt/monero/ with mv monero-x86_64-linux-gnu-v0.17.1.9/* /opt/monero/ then chown -R monero:monero /opt/monero Create /etc/monero.conf as shown below and paste your values in placeholders . Create /etc/systemd/system/monero.service as shown below. Enable monero service with systemctl enable monero and restart it with systemctl restart monero Verify it is up systemctl status monero Verify it is working as intended tail -n100 /var/log/monero/monero.log","title":"Install Monero"},{"location":"running-node/open-node-tor-onion/#etcmoneroconf","text":"This is just an example configuration and it is by no means authoritative. Feel free to modify, see monerod reference . Modify paths if you changed them. Print your onion address with cat /var/lib/tor/monero/hostname and paste it to anonymous-inbound option. # /etc/monero.conf # # Configuration file for monerod. For all available options see the MoneroDocs: # https://monerodocs.org/interacting/monerod-reference/ # Data directory (blockchain db and indices) data-dir=/srv/monero # Optional prunning # prune-blockchain=1 # Pruning saves 2/3 of disk space w/o degrading functionality but contributes less to the network # sync-pruned-blocks=1 # Allow downloading pruned blocks instead of prunning them yourself check-updates=disabled # Do not check DNS TXT records for a new version # Log file log-file=/var/log/monero/monero.log log-level=0 # Minimal logs, WILL NOT log peers or wallets connecting max-log-file-size=2147483648 # Set to 2GB to mitigate log trimming by monerod; configure logrotate instead # P2P full node p2p-bind-ip=0.0.0.0 # Bind to all interfaces (the default) p2p-bind-port=18080 # Bind to default port # RPC open node public-node=1 # Advertise to other users they can use this node as a remote one for connecting their wallets confirm-external-bind=1 # Open Node (confirm) rpc-bind-ip=0.0.0.0 # Bind to all interfaces (the Open Node) rpc-bind-port=18081 # Bind to default port (the Open Node) restricted-rpc=1 # Obligatory for Open Node interface no-igd=1 # Disable UPnP port mapping no-zmq=1 # Disable ZMQ RPC server to decrease attack surface (it's not used) # RPC TLS rpc-ssl=autodetect # Use TLS if client wallet supports it (the default behavior); the certificate will be generated on the fly on every restart # Mempool size max-txpool-weight=268435456 # Maximum unconfirmed transactions pool size in bytes (here 256MB, default ~618MB) # Slow but reliable db writes db-sync-mode=safe out-peers=64 # This will enable much faster sync and tx awareness; the default 8 is suboptimal nowadays in-peers=64 # The default is unlimited; we prefer to put a cap on this limit-rate-up=1048576 # 1048576 kB/s == 1GB/s; a raise from default 2048 kB/s; contribute more to p2p network limit-rate-down=1048576 # 1048576 kB/s == 1GB/s; a raise from default 8192 kB/s; allow for faster initial sync # Tor: broadcast transactions originating from connected wallets over Tor (does not concern relayed transactions) tx-proxy=tor,127.0.0.1:9050,16 # Tor : add P2P seed nodes for the Tor network add-peer=moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion:18080 add-peer=monerozf6koypqrt.onion:18080 add-peer=zbjkbsxc5munw3qusl7j2hpcmikhqocdf4pqhnhtpzw5nt5jrmofptid.onion:18083 # https://github.com/monero-project/monero/blob/master/src/p2p/net_node.inl add-peer=rno75kjcw3ein6i446sqby2xkyqjarb75oq36ah6c2mribyklzhurpyd.onion:28083 # it's mainnet despite the weird port, according to reddit add-peer=sqzrokz36lgkng2i2nlzgzns2ugcxqosflygsxbkybb4xn6gq3ouugqd.onion:18083 # very flaky, works 1 in 3 times # Tor: tell monerod your onion address so it can be advertised on P2P network anonymous-inbound=PASTE_YOUR_ONION_HOSTNAME:18083,127.0.0.1:18083,64 # Tor: be forgiving to connecting wallets; suggested by http://xmrguide42y34onq.onion/remote_nodes disable-rpc-ban=1","title":"/etc/monero.conf"},{"location":"running-node/open-node-tor-onion/#etcmoneroservice","text":"# /etc/systemd/system/monero.service [Unit] Description = Monero Daemon After = network.target Wants = network.target [Service] ExecStart = /opt/monero/monerod --detach --config-file /etc/monero.conf --pidfile /run/monero/monerod.pid ExecStartPost = /bin/sleep 0.1 Type = forking PIDFile = /run/monero/monerod.pid Restart = always RestartSec = 16 User = monero Group = monero RuntimeDirectory = monero StandardOutput = journal StandardError = journal [Install] WantedBy = multi-user.target","title":"/etc/.../monero.service"},{"location":"running-node/open-node-tor-onion/#open-firewall-ports","text":"If you use a firewall (and you should), open 18080 and 18081 ports for incoming TCP connections. These are for the incoming clearnet connections, P2P and RPC respectively. You do not need to open any ports for Tor. The onion services work with virtual ports. The tor daemon does not directly accept incoming connections and so it needs no open ports. For example, for popular ufw firewall, that would be: ufw allow 18080 /tcp ufw allow 18081 /tcp To verify, use ufw status . The output should be similar to the following (the 22 being default SSH port, unrelated to Monero): To Action From -- ------ ---- 22/tcp LIMIT Anywhere 18080/tcp ALLOW Anywhere 18081/tcp ALLOW Anywhere 22/tcp (v6) LIMIT Anywhere (v6) 18080/tcp (v6) ALLOW Anywhere (v6) 18081/tcp (v6) ALLOW Anywhere (v6)","title":"Open firewall ports"},{"location":"running-node/open-node-tor-onion/#testing","text":"","title":"Testing"},{"location":"running-node/open-node-tor-onion/#on-server","text":"List all services listening on ports and make sure it is what you expect: sudo netstat -lntpu The output should include these (in any order); obviously the PID values will differ. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ... tcp 0 0 0.0.0.0:18080 0.0.0.0:* LISTEN 259255/monerod tcp 0 0 0.0.0.0:18081 0.0.0.0:* LISTEN 259255/monerod tcp 0 0 127.0.0.1:18083 0.0.0.0:* LISTEN 259255/monerod tcp 0 0 127.0.0.1:9050 0.0.0.0:* LISTEN 258786/tor","title":"On server"},{"location":"running-node/open-node-tor-onion/#on-client-machine","text":"Finally, we want to test connections from your client machine. Install tor and torsocks on your laptop, you will want them anyway for Monero wallet. Just for testing, you will also need nmap and proxychains . Test clearnet P2P connection: nmap -Pn -p 18080 YOUR_IP_ADDRESS_HERE Test clearnet RPC connection: curl --digest -X POST http://YOUR_IP_ADDRESS_HERE:18081/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_info\"}' -H 'Content-Type: application/json' Test onion P2P connection (skip if you don't have proxychains): proxychains nmap -Pn -p 18083 YOUR_ONION_ADDRESS_HERE.onion Test onion RPC connection: torsocks curl --digest -X POST http://YOUR_ONION_ADDRESS_HERE.onion:18081/json_rpc -d '{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_info\"}' -H 'Content-Type: application/json'","title":"On client machine"},{"location":"running-node/open-node-tor-onion/#debugging","text":"Tor: Status: systemctl status tor@default Logs: journalctl -xe --unit tor@default Monero: Status: systemctl status monero Logs: tail -n100 /var/log/monero/monero.log Logs more info: change log-level=0 to log-level=1 in monero.conf (remember to revert once solved)","title":"Debugging"},{"location":"running-node/open-node-tor-onion/#further-improvements","text":"","title":"Further improvements"},{"location":"running-node/open-node-tor-onion/#periodic-restarts","text":"It's likely worthwhile to add peridic auto-restarting to both tor and monerod every couple hours. Neither daemon is perfect; they can get stuck or leak memory in edge case situations, like the recent attacks on Tor v3 or DDoS attacks on the Monero network. One possible way would be to use systemd timers.","title":"Periodic restarts"}]} |