bitcoin-s/docs/rpc/rpc-bitcoind/index.html
Docusaurus bot 5cf9f1ba0f Deploy website
Deploy website version based on 80b5c4c25b
2020-01-02 13:26:00 +00:00

179 lines
No EOL
21 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>bitcoind/Bitcoin Core · bitcoin-s</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&gt; Note: `bitcoin-s-bitcoind-rpc` requires you to have `bitcoind` (Bitcoin Core daemon) installed. Grab this at [bitcoincore.org](https://bitcoincore.org/en/download/)"/><meta name="docsearch:version" content="0.2.0"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="bitcoind/Bitcoin Core · bitcoin-s"/><meta property="og:type" content="website"/><meta property="og:url" content="https://bitcoin-s.org/"/><meta property="og:description" content="&gt; Note: `bitcoin-s-bitcoind-rpc` requires you to have `bitcoind` (Bitcoin Core daemon) installed. Grab this at [bitcoincore.org](https://bitcoincore.org/en/download/)"/><meta property="og:image" content="https://bitcoin-s.org/img/undraw_online.svg"/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://bitcoin-s.org/img/undraw_tweetstorm.svg"/><link rel="shortcut icon" href="/img/favicon.ico"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="https://fonts.googleapis.com/css?family=Montserrat:500"></script><script type="text/javascript" src="https://www.googletagmanager.com/gtag/js?id=UA-61958686-2"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/favicon.ico" alt="bitcoin-s"/><h2 class="headerTitleWithLogo">bitcoin-s</h2></a><a href="/versions"><h3>0.2.0</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/core/core-intro" target="_self">Docs</a></li><li class=""><a href="/api/org/bitcoins" target="_self">API</a></li><li class=""><a href="/help" target="_self">Help</a></li><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>RPC clients</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/getting-started">Add Bitcoin-S to your project</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Core module</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/core/core-intro">Core module</a></li><li class="navListItem"><a class="navItem" href="/docs/core/addresses">Generating addresses</a></li><li class="navListItem"><a class="navItem" href="/docs/core/hd-keys">HD key generation</a></li><li class="navListItem"><a class="navItem" href="/docs/core/txbuilder">TxBuilder example</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">RPC clients</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/rpc/rpc-clients-intro">Introduction</a></li><li class="navListItem"><a class="navItem" href="/docs/rpc/rpc-eclair">Eclair</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/rpc/rpc-bitcoind">bitcoind/Bitcoin Core</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Applications</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/applications/chain">Blockchain Verification</a></li><li class="navListItem"><a class="navItem" href="/docs/applications/cli">bitcoin-s cli</a></li><li class="navListItem"><a class="navItem" href="/docs/applications/configuration">Application configuration</a></li><li class="navListItem"><a class="navItem" href="/docs/applications/key-manager">Key Manager</a></li><li class="navListItem"><a class="navItem" href="/docs/applications/node">Light client</a></li><li class="navListItem"><a class="navItem" href="/docs/applications/wallet">Wallet</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Contributing</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/contributing">Contributing</a></li><li class="navListItem"><a class="navItem" href="/docs/contributing-website">Contributing to the website</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Security</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/security">Security</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/bitcoin-s/bitcoin-s/blob/master/docs/rpc/bitcoind.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">bitcoind/Bitcoin Core</h1></header><article><div><span><blockquote>
<p>Note: <code>bitcoin-s-bitcoind-rpc</code> requires you to have <code>bitcoind</code> (Bitcoin Core daemon) installed. Grab this at <a href="https://bitcoincore.org/en/download/">bitcoincore.org</a></p>
</blockquote>
<p>The Bitcoin Core RPC client in Bitcoin-S currently supports the Bitcoin Core 0.16, 0.17, 0.18, and 0.19
version lines. It can be set up to work with both local and remote Bitcoin Core servers.</p>
<h2><a class="anchor" aria-hidden="true" id="connecting-to-a-local-bitcoind-instance"></a><a href="#connecting-to-a-local-bitcoind-instance" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Connecting to a local <code>bitcoind</code> instance</h2>
<h3><a class="anchor" aria-hidden="true" id="getting-started-quickly-with-default-options"></a><a href="#getting-started-quickly-with-default-options" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Getting started quickly, with default options:</h3>
<pre><code class="hljs css language-scala"><span class="hljs-keyword">import</span> scala.concurrent._
<span class="hljs-keyword">import</span> org.bitcoins.{rpc, core}
<span class="hljs-keyword">import</span> core.currency.<span class="hljs-type">Bitcoins</span>
<span class="hljs-keyword">import</span> rpc.client.common._
<span class="hljs-keyword">import</span> java.io._
<span class="hljs-keyword">implicit</span> <span class="hljs-keyword">val</span> ec: <span class="hljs-type">ExecutionContext</span> = <span class="hljs-type">ExecutionContext</span>.global
<span class="hljs-comment">// this reads authentication credentials and</span>
<span class="hljs-comment">// connection details from the default data</span>
<span class="hljs-comment">// directory on your platform</span>
<span class="hljs-keyword">val</span> client = <span class="hljs-type">BitcoindRpcClient</span>.fromDatadir(binary=<span class="hljs-keyword">new</span> <span class="hljs-type">File</span>(<span class="hljs-string">"/path/to/bitcoind"</span>), datadir=<span class="hljs-keyword">new</span> <span class="hljs-type">File</span>(<span class="hljs-string">"/path/to/bitcoind-datadir"</span>))
<span class="hljs-keyword">val</span> balance: <span class="hljs-type">Future</span>[<span class="hljs-type">Bitcoins</span>] = <span class="hljs-keyword">for</span> {
_ &lt;- client.start()
balance &lt;- client.getBalance
} <span class="hljs-keyword">yield</span> balance
</code></pre>
<h2><a class="anchor" aria-hidden="true" id="connecting-to-a-remote-bitcoind"></a><a href="#connecting-to-a-remote-bitcoind" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Connecting to a remote <code>bitcoind</code></h2>
<p>First, we create a secure connection to our <code>bitcoind</code> instance by setting
up a SSH tunnel:</p>
<pre><code class="hljs css language-bash">$ ssh -L 8332:localhost:8332 \
my-cool-user@my-cool-website.com
</code></pre>
<blockquote>
<p>Note: the port number '8332' is the default for mainnet. If you want to
connect to a testnet <code>bitcoind</code>, the default port is '18332'</p>
</blockquote>
<p>Now that we have a secure connection between our remote <code>bitcoind</code>, we're
ready to create the connection with our RPC client</p>
<pre><code class="hljs css language-scala"><span class="hljs-keyword">import</span> java.net.<span class="hljs-type">URI</span>
<span class="hljs-keyword">import</span> scala.concurrent._
<span class="hljs-keyword">import</span> org.bitcoins.core.config._
<span class="hljs-keyword">import</span> org.bitcoins.rpc.config._
<span class="hljs-keyword">import</span> org.bitcoins.rpc.client.common._
<span class="hljs-keyword">val</span> username = <span class="hljs-string">"FILL_ME_IN"</span> <span class="hljs-comment">//this username comes from 'rpcuser' in your bitcoin.conf file //this username comes from 'rpcuser' in your bitcoin.conf file</span>
<span class="hljs-keyword">val</span> password = <span class="hljs-string">"FILL_ME_IN"</span> <span class="hljs-comment">//this password comes from your 'rpcpassword' in your bitcoin.conf file //this password comes from your 'rpcpassword' in your bitcoin.conf file</span>
<span class="hljs-keyword">val</span> authCredentials = <span class="hljs-type">BitcoindAuthCredentials</span>.<span class="hljs-type">PasswordBased</span>(
username = username,
password = password
)
<span class="hljs-keyword">val</span> bitcoindInstance = {
<span class="hljs-type">BitcoindInstance</span> (
network = <span class="hljs-type">MainNet</span>,
uri = <span class="hljs-keyword">new</span> <span class="hljs-type">URI</span>(<span class="hljs-string">s"http://localhost:<span class="hljs-subst">${MainNet.port}</span>"</span>),
rpcUri = <span class="hljs-keyword">new</span> <span class="hljs-type">URI</span>(<span class="hljs-string">s"http://localhost:<span class="hljs-subst">${MainNet.rpcPort}</span>"</span>),
authCredentials = authCredentials
)
}
<span class="hljs-keyword">implicit</span> <span class="hljs-keyword">val</span> ec: <span class="hljs-type">ExecutionContext</span> = <span class="hljs-type">ExecutionContext</span>.global
<span class="hljs-keyword">val</span> rpcCli = <span class="hljs-type">BitcoindRpcClient</span>(bitcoindInstance)
rpcCli.getBalance.onComplete { <span class="hljs-keyword">case</span> balance =&gt;
println(<span class="hljs-string">s"Wallet balance=<span class="hljs-subst">${balance}</span>"</span>)
}
</code></pre>
<h2><a class="anchor" aria-hidden="true" id="error-handling"></a><a href="#error-handling" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Error handling</h2>
<p>All errors returned by Bitcoin Core are mapped to a corresponding
<a href="https://github.com/bitcoin-s/bitcoin-s/blob/master/bitcoind-rpc/src/main/scala/org/bitcoins/rpc/BitcoindException.scala"><code>BitcoindException</code></a>.
These exceptions contain an error code and a message. <code>BitcoindException</code> is a sealed
trait, which means you can easily pattern match exhaustively. Of course, other errors
could also happen: network errors, stack overflows or out-of-memory errors. The provided
class is only intended to cover errors returned by Bitcoin Core. An example of how error
handling could look:</p>
<pre><code class="hljs css language-scala"><span class="hljs-keyword">import</span> org.bitcoins.rpc.client.common._
<span class="hljs-keyword">import</span> org.bitcoins.rpc.<span class="hljs-type">BitcoindWalletException</span>
<span class="hljs-keyword">import</span> org.bitcoins.core.crypto._
<span class="hljs-keyword">import</span> org.bitcoins.core.protocol._
<span class="hljs-keyword">import</span> org.bitcoins.core.currency._
<span class="hljs-keyword">import</span> java.io._
<span class="hljs-keyword">import</span> scala.concurrent._
<span class="hljs-keyword">implicit</span> <span class="hljs-keyword">val</span> ec = <span class="hljs-type">ExecutionContext</span>.global
<span class="hljs-comment">// let's assume you have an already running client,</span>
<span class="hljs-comment">// so there's no need to start this one</span>
<span class="hljs-keyword">val</span> cli = <span class="hljs-type">BitcoindRpcClient</span>.fromDatadir(binary=<span class="hljs-keyword">new</span> <span class="hljs-type">File</span>(<span class="hljs-string">"/path/to/bitcoind"</span>), datadir=<span class="hljs-keyword">new</span> <span class="hljs-type">File</span>(<span class="hljs-string">"/path/to/bitcoind-datadir"</span>))
<span class="hljs-comment">// let's also assume you have a bitcoin address</span>
<span class="hljs-keyword">val</span> address: <span class="hljs-type">BitcoinAddress</span> = ???
<span class="hljs-keyword">val</span> txid: <span class="hljs-type">Future</span>[<span class="hljs-type">DoubleSha256DigestBE</span>] =
cli.sendToAddress(address, <span class="hljs-number">3.</span>bitcoins).recoverWith {
<span class="hljs-keyword">case</span> <span class="hljs-type">BitcoindWalletException</span>.<span class="hljs-type">UnlockNeeded</span>(_) =&gt;
cli.walletPassphrase(<span class="hljs-string">"my_passphrase"</span>, <span class="hljs-number">60</span>).flatMap { _ =&gt;
cli.sendToAddress(address, <span class="hljs-number">3.</span>bitcoins)
}
}
</code></pre>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 2019-12-22 by Chris Stewart</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/rpc/rpc-eclair"><span class="arrow-prev"></span><span>Eclair</span></a><a class="docs-next button" href="/docs/applications/chain"><span>Blockchain Verification</span><span class="arrow-next"></span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#connecting-to-a-local-bitcoind-instance">Connecting to a local <code>bitcoind</code> instance</a><ul class="toc-headings"><li><a href="#getting-started-quickly-with-default-options">Getting started quickly, with default options:</a></li></ul></li><li><a href="#connecting-to-a-remote-bitcoind">Connecting to a remote <code>bitcoind</code></a></li><li><a href="#error-handling">Error handling</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/favicon.ico" alt="bitcoin-s" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/getting-started">Getting Started</a><a href="/docs/en/core/core-intro">Guides</a><a href="/api/org/bitcoins">API Reference</a></div><div><h5>Community</h5><a href="/en/users.html">User Showcase</a><a href="https://join.slack.com/t/suredbits/shared_invite/enQtNDEyMjY3MTg1MTg3LTYyYjkwOGUzMDQ4NDAwZjE1M2I3MmQyNWNlZjNlYjg4OGRjYTRjNWUwNjRjNjg4Y2NjZjAxYjU1N2JjMTU1YWM" target="_blank" rel="noreferrer noopener">Slack</a><a href="https://gitter.im/bitcoin-s-core/">Gitter chat</a></div><div><h5>More</h5><a href="https://github.com/bitcoin-s/bitcoin-s">GitHub</a><a class="github-button" href="https://github.com/bitcoin-s/bitcoin-s" data-icon="octicon-star" data-count-href="/bitcoin-s/bitcoin-s-core/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 Suredbits &amp; the bitcoin-s developers</section></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>
document.addEventListener('keyup', function(e) {
if (e.target !== document.body) {
return;
}
// keyCode for '/' (slash)
if (e.keyCode === 191) {
const search = document.getElementById('search_input_react');
search && search.focus();
}
});
</script><script>
var search = docsearch({
apiKey: '0a510688bf8448e19aeb380377d328d3',
indexName: 'bitcoin-s',
inputSelector: '#search_input_react'
});
</script></body></html>