mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-03-19 13:35:17 +01:00
parent
fe5bb2124e
commit
fdc8cc36ae
20 changed files with 136 additions and 114 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -80,7 +80,7 @@ reason to keep using legacy transaction formats.</p>
|
||||||
<span class="hljs-keyword">val</span> privkey = <span class="hljs-type">ECPrivateKey</span>()
|
<span class="hljs-keyword">val</span> privkey = <span class="hljs-type">ECPrivateKey</span>()
|
||||||
<span class="hljs-comment">// privkey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
<span class="hljs-comment">// privkey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||||
<span class="hljs-keyword">val</span> pubkey = privkey.publicKey
|
<span class="hljs-keyword">val</span> pubkey = privkey.publicKey
|
||||||
<span class="hljs-comment">// pubkey: org.bitcoins.crypto.ECPublicKey = ECPublicKey(035a2653a7fd8708121be205821c1ee0cf7ffde01dfb27829c60fbbaa5fea9af81)</span>
|
<span class="hljs-comment">// pubkey: org.bitcoins.crypto.ECPublicKey = ECPublicKey(039ab00c738ed8d4aee9012713a8494ab7541c527f89b7bc5eda65ba0b6b977455)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> segwitAddress = {
|
<span class="hljs-keyword">val</span> segwitAddress = {
|
||||||
<span class="hljs-comment">// see https://bitcoin.org/en/glossary/pubkey-script</span>
|
<span class="hljs-comment">// see https://bitcoin.org/en/glossary/pubkey-script</span>
|
||||||
|
@ -89,10 +89,10 @@ reason to keep using legacy transaction formats.</p>
|
||||||
<span class="hljs-keyword">val</span> scriptPubKey = <span class="hljs-type">P2WPKHWitnessSPKV0</span>(pubkey)
|
<span class="hljs-keyword">val</span> scriptPubKey = <span class="hljs-type">P2WPKHWitnessSPKV0</span>(pubkey)
|
||||||
<span class="hljs-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
<span class="hljs-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
||||||
}
|
}
|
||||||
<span class="hljs-comment">// segwitAddress: Bech32Address = tb1qrypcnmjzwrjrf2lp7c7662h9ulcmxw76at2yn2</span>
|
<span class="hljs-comment">// segwitAddress: Bech32Address = tb1qt44tx89fwmhlry3e83w9eh83nd3heg9pjctkvf</span>
|
||||||
|
|
||||||
println(segwitAddress.toString)
|
println(segwitAddress.toString)
|
||||||
<span class="hljs-comment">// tb1qrypcnmjzwrjrf2lp7c7662h9ulcmxw76at2yn2</span>
|
<span class="hljs-comment">// tb1qt44tx89fwmhlry3e83w9eh83nd3heg9pjctkvf</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<h2><a class="anchor" aria-hidden="true" id="generating-legacy-base58-addresses"></a><a href="#generating-legacy-base58-addresses" 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>Generating legacy (base58) addresses</h2>
|
<h2><a class="anchor" aria-hidden="true" id="generating-legacy-base58-addresses"></a><a href="#generating-legacy-base58-addresses" 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>Generating legacy (base58) addresses</h2>
|
||||||
<p>If you need to generate legacy addresses for backwards
|
<p>If you need to generate legacy addresses for backwards
|
||||||
|
@ -101,10 +101,10 @@ Take a look:</p>
|
||||||
<pre><code class="hljs css language-scala"><span class="hljs-comment">// we're reusing the same private/public key pair</span>
|
<pre><code class="hljs css language-scala"><span class="hljs-comment">// we're reusing the same private/public key pair</span>
|
||||||
<span class="hljs-comment">// from before. don't do this in an actual application!</span>
|
<span class="hljs-comment">// from before. don't do this in an actual application!</span>
|
||||||
<span class="hljs-keyword">val</span> legacyAddress = <span class="hljs-type">P2PKHAddress</span>(pubkey, <span class="hljs-type">TestNet3</span>)
|
<span class="hljs-keyword">val</span> legacyAddress = <span class="hljs-type">P2PKHAddress</span>(pubkey, <span class="hljs-type">TestNet3</span>)
|
||||||
<span class="hljs-comment">// legacyAddress: P2PKHAddress = mhoDRjFmuo2sBdAHdZiZ3CrvY2f2okx5Yg</span>
|
<span class="hljs-comment">// legacyAddress: P2PKHAddress = mp2txWuAuJm8LA1Beo4BzR6y75rGBGX5Cj</span>
|
||||||
|
|
||||||
println(legacyAddress.toString)
|
println(legacyAddress.toString)
|
||||||
<span class="hljs-comment">// mhoDRjFmuo2sBdAHdZiZ3CrvY2f2okx5Yg</span>
|
<span class="hljs-comment">// mp2txWuAuJm8LA1Beo4BzR6y75rGBGX5Cj</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/core/core-intro"><span class="arrow-prev">← </span><span>Core Module</span></a><a class="docs-next button" href="/docs/next/core/hd-keys"><span>HD Key Generation</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#generating-segwit-bech32-addresses">Generating SegWit (bech32) addresses</a></li><li><a href="#generating-legacy-base58-addresses">Generating legacy (base58) addresses</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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & the bitcoin-s developers</section></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>
|
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/core/core-intro"><span class="arrow-prev">← </span><span>Core Module</span></a><a class="docs-next button" href="/docs/next/core/hd-keys"><span>HD Key Generation</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#generating-segwit-bech32-addresses">Generating SegWit (bech32) addresses</a></li><li><a href="#generating-legacy-base58-addresses">Generating legacy (base58) addresses</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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & 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) {
|
document.addEventListener('keyup', function(e) {
|
||||||
|
|
|
@ -80,7 +80,7 @@ reason to keep using legacy transaction formats.</p>
|
||||||
<span class="hljs-keyword">val</span> privkey = <span class="hljs-type">ECPrivateKey</span>()
|
<span class="hljs-keyword">val</span> privkey = <span class="hljs-type">ECPrivateKey</span>()
|
||||||
<span class="hljs-comment">// privkey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
<span class="hljs-comment">// privkey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||||
<span class="hljs-keyword">val</span> pubkey = privkey.publicKey
|
<span class="hljs-keyword">val</span> pubkey = privkey.publicKey
|
||||||
<span class="hljs-comment">// pubkey: org.bitcoins.crypto.ECPublicKey = ECPublicKey(035a2653a7fd8708121be205821c1ee0cf7ffde01dfb27829c60fbbaa5fea9af81)</span>
|
<span class="hljs-comment">// pubkey: org.bitcoins.crypto.ECPublicKey = ECPublicKey(039ab00c738ed8d4aee9012713a8494ab7541c527f89b7bc5eda65ba0b6b977455)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> segwitAddress = {
|
<span class="hljs-keyword">val</span> segwitAddress = {
|
||||||
<span class="hljs-comment">// see https://bitcoin.org/en/glossary/pubkey-script</span>
|
<span class="hljs-comment">// see https://bitcoin.org/en/glossary/pubkey-script</span>
|
||||||
|
@ -89,10 +89,10 @@ reason to keep using legacy transaction formats.</p>
|
||||||
<span class="hljs-keyword">val</span> scriptPubKey = <span class="hljs-type">P2WPKHWitnessSPKV0</span>(pubkey)
|
<span class="hljs-keyword">val</span> scriptPubKey = <span class="hljs-type">P2WPKHWitnessSPKV0</span>(pubkey)
|
||||||
<span class="hljs-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
<span class="hljs-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
||||||
}
|
}
|
||||||
<span class="hljs-comment">// segwitAddress: Bech32Address = tb1qrypcnmjzwrjrf2lp7c7662h9ulcmxw76at2yn2</span>
|
<span class="hljs-comment">// segwitAddress: Bech32Address = tb1qt44tx89fwmhlry3e83w9eh83nd3heg9pjctkvf</span>
|
||||||
|
|
||||||
println(segwitAddress.toString)
|
println(segwitAddress.toString)
|
||||||
<span class="hljs-comment">// tb1qrypcnmjzwrjrf2lp7c7662h9ulcmxw76at2yn2</span>
|
<span class="hljs-comment">// tb1qt44tx89fwmhlry3e83w9eh83nd3heg9pjctkvf</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<h2><a class="anchor" aria-hidden="true" id="generating-legacy-base58-addresses"></a><a href="#generating-legacy-base58-addresses" 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>Generating legacy (base58) addresses</h2>
|
<h2><a class="anchor" aria-hidden="true" id="generating-legacy-base58-addresses"></a><a href="#generating-legacy-base58-addresses" 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>Generating legacy (base58) addresses</h2>
|
||||||
<p>If you need to generate legacy addresses for backwards
|
<p>If you need to generate legacy addresses for backwards
|
||||||
|
@ -101,10 +101,10 @@ Take a look:</p>
|
||||||
<pre><code class="hljs css language-scala"><span class="hljs-comment">// we're reusing the same private/public key pair</span>
|
<pre><code class="hljs css language-scala"><span class="hljs-comment">// we're reusing the same private/public key pair</span>
|
||||||
<span class="hljs-comment">// from before. don't do this in an actual application!</span>
|
<span class="hljs-comment">// from before. don't do this in an actual application!</span>
|
||||||
<span class="hljs-keyword">val</span> legacyAddress = <span class="hljs-type">P2PKHAddress</span>(pubkey, <span class="hljs-type">TestNet3</span>)
|
<span class="hljs-keyword">val</span> legacyAddress = <span class="hljs-type">P2PKHAddress</span>(pubkey, <span class="hljs-type">TestNet3</span>)
|
||||||
<span class="hljs-comment">// legacyAddress: P2PKHAddress = mhoDRjFmuo2sBdAHdZiZ3CrvY2f2okx5Yg</span>
|
<span class="hljs-comment">// legacyAddress: P2PKHAddress = mp2txWuAuJm8LA1Beo4BzR6y75rGBGX5Cj</span>
|
||||||
|
|
||||||
println(legacyAddress.toString)
|
println(legacyAddress.toString)
|
||||||
<span class="hljs-comment">// mhoDRjFmuo2sBdAHdZiZ3CrvY2f2okx5Yg</span>
|
<span class="hljs-comment">// mp2txWuAuJm8LA1Beo4BzR6y75rGBGX5Cj</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/core/core-intro"><span class="arrow-prev">← </span><span>Core Module</span></a><a class="docs-next button" href="/docs/next/core/hd-keys"><span>HD Key Generation</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#generating-segwit-bech32-addresses">Generating SegWit (bech32) addresses</a></li><li><a href="#generating-legacy-base58-addresses">Generating legacy (base58) addresses</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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & the bitcoin-s developers</section></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>
|
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/core/core-intro"><span class="arrow-prev">← </span><span>Core Module</span></a><a class="docs-next button" href="/docs/next/core/hd-keys"><span>HD Key Generation</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#generating-segwit-bech32-addresses">Generating SegWit (bech32) addresses</a></li><li><a href="#generating-legacy-base58-addresses">Generating legacy (base58) addresses</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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & 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) {
|
document.addEventListener('keyup', function(e) {
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -86,13 +86,13 @@ use that to generate further private and public keys:</p>
|
||||||
<span class="hljs-comment">// how long our phrase ends up being</span>
|
<span class="hljs-comment">// how long our phrase ends up being</span>
|
||||||
<span class="hljs-comment">// 256 bits of entropy results in 24 words</span>
|
<span class="hljs-comment">// 256 bits of entropy results in 24 words</span>
|
||||||
<span class="hljs-keyword">val</span> entropy: <span class="hljs-type">BitVector</span> = <span class="hljs-type">MnemonicCode</span>.getEntropy256Bits
|
<span class="hljs-keyword">val</span> entropy: <span class="hljs-type">BitVector</span> = <span class="hljs-type">MnemonicCode</span>.getEntropy256Bits
|
||||||
<span class="hljs-comment">// entropy: BitVector = BitVector(256 bits, 0x100f38fc286df82a6c444809b31b5716cfceb2d1308779fadde9e29f2dce5a78)</span>
|
<span class="hljs-comment">// entropy: BitVector = BitVector(256 bits, 0x1db9fa634dafce2d49f6e253b308ba804a554691192aa370e8b18510ddefa1be)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> mnemonicCode = <span class="hljs-type">MnemonicCode</span>.fromEntropy(entropy)
|
<span class="hljs-keyword">val</span> mnemonicCode = <span class="hljs-type">MnemonicCode</span>.fromEntropy(entropy)
|
||||||
<span class="hljs-comment">// mnemonicCode: MnemonicCode = Masked(MnemonicCodeImpl)</span>
|
<span class="hljs-comment">// mnemonicCode: MnemonicCode = Masked(MnemonicCodeImpl)</span>
|
||||||
|
|
||||||
mnemonicCode.words <span class="hljs-comment">// the phrase the user should write down</span>
|
mnemonicCode.words <span class="hljs-comment">// the phrase the user should write down</span>
|
||||||
<span class="hljs-comment">// res0: Vector[String] = Vector(avoid, keep, disease, express, test, benefit, rain, math, answer, occur, still, collect, woman, floor, dynamic, axis, ketchup, street, kidney, share, version, transfer, hazard, bench) // the phrase the user should write down</span>
|
<span class="hljs-comment">// res0: Vector[String] = Vector(buffalo, sound, occur, opera, woman, birth, chief, sword, father, obscure, concert, above, pipe, person, dutch, census, pet, mansion, cluster, any, assist, water, manage, sustain) // the phrase the user should write down</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// the password argument is an optional, extra security</span>
|
<span class="hljs-comment">// the password argument is an optional, extra security</span>
|
||||||
<span class="hljs-comment">// measure. all MnemonicCode instances will give you a</span>
|
<span class="hljs-comment">// measure. all MnemonicCode instances will give you a</span>
|
||||||
|
@ -108,7 +108,7 @@ mnemonicCode.words <span class="hljs-comment">// the phrase the user should writ
|
||||||
bip39Seed)
|
bip39Seed)
|
||||||
<span class="hljs-comment">// xpriv: ExtPrivateKey = Masked(ExtPrivateKeyImpl)</span>
|
<span class="hljs-comment">// xpriv: ExtPrivateKey = Masked(ExtPrivateKeyImpl)</span>
|
||||||
<span class="hljs-keyword">val</span> xpub = xpriv.extPublicKey
|
<span class="hljs-keyword">val</span> xpub = xpriv.extPublicKey
|
||||||
<span class="hljs-comment">// xpub: ExtPublicKey = zpub6jftahH18ngZyGTP5uy5ZgkFCBV2TXzmRqTwe2Y8nvqT3a7GNhB8t3yPbroEZeEB3BhC3GBvt7XspVJa9wfawbGeqg3PBLcw4zpELyXRVDB</span>
|
<span class="hljs-comment">// xpub: ExtPublicKey = zpub6jftahH18ngZyXuanu8tTGhPgtXFTiSk8e8Rb6LcDLCo9AdGyHX36qYKax6btgbjMCWgd39Sk1ifGqwianV9Z22qYv9oH9NghzxuZfRy7yt</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// you can now use the generated xpriv to derive further</span>
|
<span class="hljs-comment">// you can now use the generated xpriv to derive further</span>
|
||||||
<span class="hljs-comment">// private or public keys</span>
|
<span class="hljs-comment">// private or public keys</span>
|
||||||
|
@ -154,7 +154,7 @@ spend or steal any of your money.</p>
|
||||||
<span class="hljs-comment">// can generate addresses with it!</span>
|
<span class="hljs-comment">// can generate addresses with it!</span>
|
||||||
accountXpriv.extPublicKey
|
accountXpriv.extPublicKey
|
||||||
}
|
}
|
||||||
<span class="hljs-comment">// accountXpub: ExtPublicKey = zpub6s5U1GxJDjCzPetCHUFbTXrWjQPWd2bJu1izQRhcGBcBDg5nZ1ZrcbBr3KRfUcGmVVb61rNnrxVDQdAsz57Zpw2zDyvi8PaRseGCbd1yYZU</span>
|
<span class="hljs-comment">// accountXpub: ExtPublicKey = zpub6qzdo1TddQyudWms3PXPYLMEJSSAiA1cZfbnWJyjbPiUtXY99vgkDiqAJALGpTDkNFpa2ZTBVHadSvjPCPbLtpuFq3RCa5NPc7NZdQ52Czq</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// address no. 0 ---------------┐</span>
|
<span class="hljs-comment">// address no. 0 ---------------┐</span>
|
||||||
<span class="hljs-comment">// external address ----------┐ |</span>
|
<span class="hljs-comment">// external address ----------┐ |</span>
|
||||||
|
@ -177,12 +177,12 @@ spend or steal any of your money.</p>
|
||||||
<span class="hljs-keyword">val</span> scriptPubKey = <span class="hljs-type">P2WPKHWitnessSPKV0</span>(pubkey)
|
<span class="hljs-keyword">val</span> scriptPubKey = <span class="hljs-type">P2WPKHWitnessSPKV0</span>(pubkey)
|
||||||
<span class="hljs-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
<span class="hljs-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
||||||
}
|
}
|
||||||
<span class="hljs-comment">// firstAccountAddress: Bech32Address = tb1qumt3h9n2x73pawadg6c643xq6ynut90av5azyw</span>
|
<span class="hljs-comment">// firstAccountAddress: Bech32Address = tb1q3qgwkypauc33yf6detr80xapc9s9c595hsmh8t</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// tada! We just generated an address you can send money to,</span>
|
<span class="hljs-comment">// tada! We just generated an address you can send money to,</span>
|
||||||
<span class="hljs-comment">// without having access to the private key!</span>
|
<span class="hljs-comment">// without having access to the private key!</span>
|
||||||
firstAccountAddress.value
|
firstAccountAddress.value
|
||||||
<span class="hljs-comment">// res2: String = tb1qumt3h9n2x73pawadg6c643xq6ynut90av5azyw</span>
|
<span class="hljs-comment">// res2: String = tb1q3qgwkypauc33yf6detr80xapc9s9c595hsmh8t</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// you can now continue deriving addresses from the same public</span>
|
<span class="hljs-comment">// you can now continue deriving addresses from the same public</span>
|
||||||
<span class="hljs-comment">// key, by imitating what we did above. To get the next</span>
|
<span class="hljs-comment">// key, by imitating what we did above. To get the next</span>
|
||||||
|
|
|
@ -86,13 +86,13 @@ use that to generate further private and public keys:</p>
|
||||||
<span class="hljs-comment">// how long our phrase ends up being</span>
|
<span class="hljs-comment">// how long our phrase ends up being</span>
|
||||||
<span class="hljs-comment">// 256 bits of entropy results in 24 words</span>
|
<span class="hljs-comment">// 256 bits of entropy results in 24 words</span>
|
||||||
<span class="hljs-keyword">val</span> entropy: <span class="hljs-type">BitVector</span> = <span class="hljs-type">MnemonicCode</span>.getEntropy256Bits
|
<span class="hljs-keyword">val</span> entropy: <span class="hljs-type">BitVector</span> = <span class="hljs-type">MnemonicCode</span>.getEntropy256Bits
|
||||||
<span class="hljs-comment">// entropy: BitVector = BitVector(256 bits, 0x100f38fc286df82a6c444809b31b5716cfceb2d1308779fadde9e29f2dce5a78)</span>
|
<span class="hljs-comment">// entropy: BitVector = BitVector(256 bits, 0x1db9fa634dafce2d49f6e253b308ba804a554691192aa370e8b18510ddefa1be)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> mnemonicCode = <span class="hljs-type">MnemonicCode</span>.fromEntropy(entropy)
|
<span class="hljs-keyword">val</span> mnemonicCode = <span class="hljs-type">MnemonicCode</span>.fromEntropy(entropy)
|
||||||
<span class="hljs-comment">// mnemonicCode: MnemonicCode = Masked(MnemonicCodeImpl)</span>
|
<span class="hljs-comment">// mnemonicCode: MnemonicCode = Masked(MnemonicCodeImpl)</span>
|
||||||
|
|
||||||
mnemonicCode.words <span class="hljs-comment">// the phrase the user should write down</span>
|
mnemonicCode.words <span class="hljs-comment">// the phrase the user should write down</span>
|
||||||
<span class="hljs-comment">// res0: Vector[String] = Vector(avoid, keep, disease, express, test, benefit, rain, math, answer, occur, still, collect, woman, floor, dynamic, axis, ketchup, street, kidney, share, version, transfer, hazard, bench) // the phrase the user should write down</span>
|
<span class="hljs-comment">// res0: Vector[String] = Vector(buffalo, sound, occur, opera, woman, birth, chief, sword, father, obscure, concert, above, pipe, person, dutch, census, pet, mansion, cluster, any, assist, water, manage, sustain) // the phrase the user should write down</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// the password argument is an optional, extra security</span>
|
<span class="hljs-comment">// the password argument is an optional, extra security</span>
|
||||||
<span class="hljs-comment">// measure. all MnemonicCode instances will give you a</span>
|
<span class="hljs-comment">// measure. all MnemonicCode instances will give you a</span>
|
||||||
|
@ -108,7 +108,7 @@ mnemonicCode.words <span class="hljs-comment">// the phrase the user should writ
|
||||||
bip39Seed)
|
bip39Seed)
|
||||||
<span class="hljs-comment">// xpriv: ExtPrivateKey = Masked(ExtPrivateKeyImpl)</span>
|
<span class="hljs-comment">// xpriv: ExtPrivateKey = Masked(ExtPrivateKeyImpl)</span>
|
||||||
<span class="hljs-keyword">val</span> xpub = xpriv.extPublicKey
|
<span class="hljs-keyword">val</span> xpub = xpriv.extPublicKey
|
||||||
<span class="hljs-comment">// xpub: ExtPublicKey = zpub6jftahH18ngZyGTP5uy5ZgkFCBV2TXzmRqTwe2Y8nvqT3a7GNhB8t3yPbroEZeEB3BhC3GBvt7XspVJa9wfawbGeqg3PBLcw4zpELyXRVDB</span>
|
<span class="hljs-comment">// xpub: ExtPublicKey = zpub6jftahH18ngZyXuanu8tTGhPgtXFTiSk8e8Rb6LcDLCo9AdGyHX36qYKax6btgbjMCWgd39Sk1ifGqwianV9Z22qYv9oH9NghzxuZfRy7yt</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// you can now use the generated xpriv to derive further</span>
|
<span class="hljs-comment">// you can now use the generated xpriv to derive further</span>
|
||||||
<span class="hljs-comment">// private or public keys</span>
|
<span class="hljs-comment">// private or public keys</span>
|
||||||
|
@ -154,7 +154,7 @@ spend or steal any of your money.</p>
|
||||||
<span class="hljs-comment">// can generate addresses with it!</span>
|
<span class="hljs-comment">// can generate addresses with it!</span>
|
||||||
accountXpriv.extPublicKey
|
accountXpriv.extPublicKey
|
||||||
}
|
}
|
||||||
<span class="hljs-comment">// accountXpub: ExtPublicKey = zpub6s5U1GxJDjCzPetCHUFbTXrWjQPWd2bJu1izQRhcGBcBDg5nZ1ZrcbBr3KRfUcGmVVb61rNnrxVDQdAsz57Zpw2zDyvi8PaRseGCbd1yYZU</span>
|
<span class="hljs-comment">// accountXpub: ExtPublicKey = zpub6qzdo1TddQyudWms3PXPYLMEJSSAiA1cZfbnWJyjbPiUtXY99vgkDiqAJALGpTDkNFpa2ZTBVHadSvjPCPbLtpuFq3RCa5NPc7NZdQ52Czq</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// address no. 0 ---------------┐</span>
|
<span class="hljs-comment">// address no. 0 ---------------┐</span>
|
||||||
<span class="hljs-comment">// external address ----------┐ |</span>
|
<span class="hljs-comment">// external address ----------┐ |</span>
|
||||||
|
@ -177,12 +177,12 @@ spend or steal any of your money.</p>
|
||||||
<span class="hljs-keyword">val</span> scriptPubKey = <span class="hljs-type">P2WPKHWitnessSPKV0</span>(pubkey)
|
<span class="hljs-keyword">val</span> scriptPubKey = <span class="hljs-type">P2WPKHWitnessSPKV0</span>(pubkey)
|
||||||
<span class="hljs-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
<span class="hljs-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
||||||
}
|
}
|
||||||
<span class="hljs-comment">// firstAccountAddress: Bech32Address = tb1qumt3h9n2x73pawadg6c643xq6ynut90av5azyw</span>
|
<span class="hljs-comment">// firstAccountAddress: Bech32Address = tb1q3qgwkypauc33yf6detr80xapc9s9c595hsmh8t</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// tada! We just generated an address you can send money to,</span>
|
<span class="hljs-comment">// tada! We just generated an address you can send money to,</span>
|
||||||
<span class="hljs-comment">// without having access to the private key!</span>
|
<span class="hljs-comment">// without having access to the private key!</span>
|
||||||
firstAccountAddress.value
|
firstAccountAddress.value
|
||||||
<span class="hljs-comment">// res2: String = tb1qumt3h9n2x73pawadg6c643xq6ynut90av5azyw</span>
|
<span class="hljs-comment">// res2: String = tb1q3qgwkypauc33yf6detr80xapc9s9c595hsmh8t</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// you can now continue deriving addresses from the same public</span>
|
<span class="hljs-comment">// you can now continue deriving addresses from the same public</span>
|
||||||
<span class="hljs-comment">// key, by imitating what we did above. To get the next</span>
|
<span class="hljs-comment">// key, by imitating what we did above. To get the next</span>
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
});
|
});
|
||||||
</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/core/txbuilder.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">TxBuilder Example</h1></header><article><div><span><p>Bitcoin-S features a transaction building API that allows you to construct and sign Bitcoin transactions. Here's an example of how to use it</p>
|
</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/core/txbuilder.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">TxBuilder Example</h1></header><article><div><span><p>Bitcoin-S features a transaction building API that allows you to construct and sign Bitcoin transactions. Here's an example of how to use it</p>
|
||||||
<pre><code class="hljs css language-scala"><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>.<span class="hljs-type">Implicits</span>.global
|
<pre><code class="hljs css language-scala"><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>.<span class="hljs-type">Implicits</span>.global
|
||||||
<span class="hljs-comment">// ec: ExecutionContext = scala.concurrent.impl.ExecutionContextImpl$$anon$3@3089318e[Running, parallelism = 2, size = 0, active = 0, running = 0, steals = 0, tasks = 0, submissions = 0]</span>
|
<span class="hljs-comment">// ec: ExecutionContext = scala.concurrent.impl.ExecutionContextImpl$$anon$3@3a675e77[Running, parallelism = 2, size = 0, active = 0, running = 0, steals = 0, tasks = 0, submissions = 0]</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// Initialize a transaction builder</span>
|
<span class="hljs-comment">// Initialize a transaction builder</span>
|
||||||
<span class="hljs-keyword">val</span> builder = <span class="hljs-type">RawTxBuilder</span>()
|
<span class="hljs-keyword">val</span> builder = <span class="hljs-type">RawTxBuilder</span>()
|
||||||
|
@ -74,19 +74,19 @@
|
||||||
<span class="hljs-keyword">val</span> privKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
<span class="hljs-keyword">val</span> privKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
||||||
<span class="hljs-comment">// privKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
<span class="hljs-comment">// privKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||||
<span class="hljs-keyword">val</span> pubKey = privKey.publicKey
|
<span class="hljs-keyword">val</span> pubKey = privKey.publicKey
|
||||||
<span class="hljs-comment">// pubKey: ECPublicKey = ECPublicKey(033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd)</span>
|
<span class="hljs-comment">// pubKey: ECPublicKey = ECPublicKey(02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this is the script that the TxBuilder is going to create a</span>
|
<span class="hljs-comment">// this is the script that the TxBuilder is going to create a</span>
|
||||||
<span class="hljs-comment">// script signature that validly spends this scriptPubKey</span>
|
<span class="hljs-comment">// script signature that validly spends this scriptPubKey</span>
|
||||||
<span class="hljs-keyword">val</span> creditingSpk = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = privKey.publicKey)
|
<span class="hljs-keyword">val</span> creditingSpk = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = privKey.publicKey)
|
||||||
<span class="hljs-comment">// creditingSpk: P2PKHScriptPubKey = pkh(9d78c6eaa5d24af8e361fe510d1659b5c639cff0)</span>
|
<span class="hljs-comment">// creditingSpk: P2PKHScriptPubKey = pkh(9bf93b35063383451d9294b707ef28955d0e4987)</span>
|
||||||
<span class="hljs-keyword">val</span> amount = <span class="hljs-number">10000.</span>satoshis
|
<span class="hljs-keyword">val</span> amount = <span class="hljs-number">10000.</span>satoshis
|
||||||
<span class="hljs-comment">// amount: Satoshis = 10000 sats</span>
|
<span class="hljs-comment">// amount: Satoshis = 10000 sats</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this is the UTXO we are going to be spending</span>
|
<span class="hljs-comment">// this is the UTXO we are going to be spending</span>
|
||||||
<span class="hljs-keyword">val</span> utxo =
|
<span class="hljs-keyword">val</span> utxo =
|
||||||
<span class="hljs-type">TransactionOutput</span>(value = amount, scriptPubKey = creditingSpk)
|
<span class="hljs-type">TransactionOutput</span>(value = amount, scriptPubKey = creditingSpk)
|
||||||
<span class="hljs-comment">// utxo: TransactionOutput = TransactionOutput(10000 sats,pkh(9d78c6eaa5d24af8e361fe510d1659b5c639cff0))</span>
|
<span class="hljs-comment">// utxo: TransactionOutput = TransactionOutput(10000 sats,pkh(9bf93b35063383451d9294b707ef28955d0e4987))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// the private key that locks the funds for the script we are spending too</span>
|
<span class="hljs-comment">// the private key that locks the funds for the script we are spending too</span>
|
||||||
<span class="hljs-keyword">val</span> destinationPrivKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
<span class="hljs-keyword">val</span> destinationPrivKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
||||||
|
@ -99,7 +99,7 @@
|
||||||
<span class="hljs-comment">// the script that corresponds to destination private key, this is what is receiving the money</span>
|
<span class="hljs-comment">// the script that corresponds to destination private key, this is what is receiving the money</span>
|
||||||
<span class="hljs-keyword">val</span> destinationSPK =
|
<span class="hljs-keyword">val</span> destinationSPK =
|
||||||
<span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = destinationPrivKey.publicKey)
|
<span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = destinationPrivKey.publicKey)
|
||||||
<span class="hljs-comment">// destinationSPK: P2PKHScriptPubKey = pkh(1bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f)</span>
|
<span class="hljs-comment">// destinationSPK: P2PKHScriptPubKey = pkh(3729c0df339ab0b20444f367df9959467469a52f)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this is where we are sending money too</span>
|
<span class="hljs-comment">// this is where we are sending money too</span>
|
||||||
<span class="hljs-comment">// we could add more destinations here if we</span>
|
<span class="hljs-comment">// we could add more destinations here if we</span>
|
||||||
|
@ -110,7 +110,7 @@
|
||||||
|
|
||||||
<span class="hljs-type">Vector</span>(destination0)
|
<span class="hljs-type">Vector</span>(destination0)
|
||||||
}
|
}
|
||||||
<span class="hljs-comment">// destinations: Vector[TransactionOutput] = Vector(TransactionOutput(5000 sats,pkh(1bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f)))</span>
|
<span class="hljs-comment">// destinations: Vector[TransactionOutput] = Vector(TransactionOutput(5000 sats,pkh(3729c0df339ab0b20444f367df9959467469a52f)))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// Add the destinations to the tx builder</span>
|
<span class="hljs-comment">// Add the destinations to the tx builder</span>
|
||||||
builder ++= destinations
|
builder ++= destinations
|
||||||
|
@ -123,17 +123,17 @@ builder ++= destinations
|
||||||
inputs = <span class="hljs-type">Vector</span>.empty,
|
inputs = <span class="hljs-type">Vector</span>.empty,
|
||||||
outputs = <span class="hljs-type">Vector</span>(utxo),
|
outputs = <span class="hljs-type">Vector</span>(utxo),
|
||||||
lockTime = <span class="hljs-type">UInt32</span>.zero)
|
lockTime = <span class="hljs-type">UInt32</span>.zero)
|
||||||
<span class="hljs-comment">// creditingTx: BaseTransaction = BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9d78c6eaa5d24af8e361fe510d1659b5c639cff0))),UInt32Impl(0))</span>
|
<span class="hljs-comment">// creditingTx: BaseTransaction = BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9bf93b35063383451d9294b707ef28955d0e4987))),UInt32Impl(0))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this is the information we need from the crediting TX</span>
|
<span class="hljs-comment">// this is the information we need from the crediting TX</span>
|
||||||
<span class="hljs-comment">// to properly "link" it in the transaction we are creating</span>
|
<span class="hljs-comment">// to properly "link" it in the transaction we are creating</span>
|
||||||
<span class="hljs-keyword">val</span> outPoint = <span class="hljs-type">TransactionOutPoint</span>(creditingTx.txId, <span class="hljs-type">UInt32</span>.zero)
|
<span class="hljs-keyword">val</span> outPoint = <span class="hljs-type">TransactionOutPoint</span>(creditingTx.txId, <span class="hljs-type">UInt32</span>.zero)
|
||||||
<span class="hljs-comment">// outPoint: TransactionOutPoint = TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0)</span>
|
<span class="hljs-comment">// outPoint: TransactionOutPoint = TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0)</span>
|
||||||
<span class="hljs-keyword">val</span> input = <span class="hljs-type">TransactionInput</span>(
|
<span class="hljs-keyword">val</span> input = <span class="hljs-type">TransactionInput</span>(
|
||||||
outPoint,
|
outPoint,
|
||||||
<span class="hljs-type">EmptyScriptSignature</span>,
|
<span class="hljs-type">EmptyScriptSignature</span>,
|
||||||
sequenceNumber = <span class="hljs-type">UInt32</span>.zero)
|
sequenceNumber = <span class="hljs-type">UInt32</span>.zero)
|
||||||
<span class="hljs-comment">// input: TransactionInput = TransactionInputImpl(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),EmptyScriptSignature,UInt32Impl(0))</span>
|
<span class="hljs-comment">// input: TransactionInput = TransactionInputImpl(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),EmptyScriptSignature,UInt32Impl(0))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// Add a new input to our builder</span>
|
<span class="hljs-comment">// Add a new input to our builder</span>
|
||||||
builder += input
|
builder += input
|
||||||
|
@ -141,11 +141,11 @@ builder += input
|
||||||
|
|
||||||
<span class="hljs-comment">// We can now generate a RawTxBuilderResult ready to be finalized</span>
|
<span class="hljs-comment">// We can now generate a RawTxBuilderResult ready to be finalized</span>
|
||||||
<span class="hljs-keyword">val</span> builderResult = builder.result()
|
<span class="hljs-keyword">val</span> builderResult = builder.result()
|
||||||
<span class="hljs-comment">// builderResult: RawTxBuilderResult = RawTxBuilderResult(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(1bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f))),UInt32Impl(0))</span>
|
<span class="hljs-comment">// builderResult: RawTxBuilderResult = RawTxBuilderResult(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(3729c0df339ab0b20444f367df9959467469a52f))),UInt32Impl(0))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this contains the information needed to analyze our input during finalization</span>
|
<span class="hljs-comment">// this contains the information needed to analyze our input during finalization</span>
|
||||||
<span class="hljs-keyword">val</span> inputInfo = <span class="hljs-type">P2PKHInputInfo</span>(outPoint, amount, privKey.publicKey)
|
<span class="hljs-keyword">val</span> inputInfo = <span class="hljs-type">P2PKHInputInfo</span>(outPoint, amount, privKey.publicKey)
|
||||||
<span class="hljs-comment">// inputInfo: P2PKHInputInfo = P2PKHInputInfo(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),10000 sats,ECPublicKey(033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd))</span>
|
<span class="hljs-comment">// inputInfo: P2PKHInputInfo = P2PKHInputInfo(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),10000 sats,ECPublicKey(02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this is how much we are going to pay as a fee to the network</span>
|
<span class="hljs-comment">// this is how much we are going to pay as a fee to the network</span>
|
||||||
<span class="hljs-comment">// for this example, we are going to pay 1 satoshi per byte</span>
|
<span class="hljs-comment">// for this example, we are going to pay 1 satoshi per byte</span>
|
||||||
|
@ -155,18 +155,18 @@ builder += input
|
||||||
<span class="hljs-keyword">val</span> changePrivKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
<span class="hljs-keyword">val</span> changePrivKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
||||||
<span class="hljs-comment">// changePrivKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
<span class="hljs-comment">// changePrivKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||||
<span class="hljs-keyword">val</span> changeSPK = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = changePrivKey.publicKey)
|
<span class="hljs-keyword">val</span> changeSPK = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = changePrivKey.publicKey)
|
||||||
<span class="hljs-comment">// changeSPK: P2PKHScriptPubKey = pkh(02a32dfb38db3e0314c47fc7dd5df73fc0068132)</span>
|
<span class="hljs-comment">// changeSPK: P2PKHScriptPubKey = pkh(25753e8b8b6a874528fd8165cc0209e0ecfbd0af)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// We chose a finalizer that adds a change output to our tx based on a fee rate</span>
|
<span class="hljs-comment">// We chose a finalizer that adds a change output to our tx based on a fee rate</span>
|
||||||
<span class="hljs-keyword">val</span> finalizer = <span class="hljs-type">StandardNonInteractiveFinalizer</span>(
|
<span class="hljs-keyword">val</span> finalizer = <span class="hljs-type">StandardNonInteractiveFinalizer</span>(
|
||||||
<span class="hljs-type">Vector</span>(inputInfo),
|
<span class="hljs-type">Vector</span>(inputInfo),
|
||||||
feeRate,
|
feeRate,
|
||||||
changeSPK)
|
changeSPK)
|
||||||
<span class="hljs-comment">// finalizer: StandardNonInteractiveFinalizer = StandardNonInteractiveFinalizer(Vector(P2PKHInputInfo(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),10000 sats,ECPublicKey(033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd))),1 sats/byte,pkh(02a32dfb38db3e0314c47fc7dd5df73fc0068132))</span>
|
<span class="hljs-comment">// finalizer: StandardNonInteractiveFinalizer = StandardNonInteractiveFinalizer(Vector(P2PKHInputInfo(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),10000 sats,ECPublicKey(02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe))),1 sats/byte,pkh(25753e8b8b6a874528fd8165cc0209e0ecfbd0af))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// We can now finalize the tx builder result from earlier with this finalizer</span>
|
<span class="hljs-comment">// We can now finalize the tx builder result from earlier with this finalizer</span>
|
||||||
<span class="hljs-keyword">val</span> unsignedTx: <span class="hljs-type">Transaction</span> = finalizer.buildTx(builderResult)
|
<span class="hljs-keyword">val</span> unsignedTx: <span class="hljs-type">Transaction</span> = finalizer.buildTx(builderResult)
|
||||||
<span class="hljs-comment">// unsignedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(1bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f)), TransactionOutput(4775 sats,pkh(02a32dfb38db3e0314c47fc7dd5df73fc0068132))),UInt32Impl(0))</span>
|
<span class="hljs-comment">// unsignedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(3729c0df339ab0b20444f367df9959467469a52f)), TransactionOutput(4775 sats,pkh(25753e8b8b6a874528fd8165cc0209e0ecfbd0af))),UInt32Impl(0))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// We now turn to signing the unsigned transaction</span>
|
<span class="hljs-comment">// We now turn to signing the unsigned transaction</span>
|
||||||
<span class="hljs-comment">// this contains all the information we need to</span>
|
<span class="hljs-comment">// this contains all the information we need to</span>
|
||||||
|
@ -176,12 +176,12 @@ builder += input
|
||||||
signers = <span class="hljs-type">Vector</span>(privKey),
|
signers = <span class="hljs-type">Vector</span>(privKey),
|
||||||
hashType =
|
hashType =
|
||||||
<span class="hljs-type">HashType</span>.sigHashAll)
|
<span class="hljs-type">HashType</span>.sigHashAll)
|
||||||
<span class="hljs-comment">// utxoInfo: ScriptSignatureParams[P2PKHInputInfo] = ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),10000 sats,ECPublicKey(033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9d78c6eaa5d24af8e361fe510d1659b5c639cff0))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(Int32Impl(1)))</span>
|
<span class="hljs-comment">// utxoInfo: ScriptSignatureParams[P2PKHInputInfo] = ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),10000 sats,ECPublicKey(02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9bf93b35063383451d9294b707ef28955d0e4987))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(Int32Impl(1)))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// all of the UTXO spending information, since we only have</span>
|
<span class="hljs-comment">// all of the UTXO spending information, since we only have</span>
|
||||||
<span class="hljs-comment">// one input, this is just one element</span>
|
<span class="hljs-comment">// one input, this is just one element</span>
|
||||||
<span class="hljs-keyword">val</span> utxoInfos: <span class="hljs-type">Vector</span>[<span class="hljs-type">ScriptSignatureParams</span>[<span class="hljs-type">InputInfo</span>]] = <span class="hljs-type">Vector</span>(utxoInfo)
|
<span class="hljs-keyword">val</span> utxoInfos: <span class="hljs-type">Vector</span>[<span class="hljs-type">ScriptSignatureParams</span>[<span class="hljs-type">InputInfo</span>]] = <span class="hljs-type">Vector</span>(utxoInfo)
|
||||||
<span class="hljs-comment">// utxoInfos: Vector[ScriptSignatureParams[InputInfo]] = Vector(ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),10000 sats,ECPublicKey(033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9d78c6eaa5d24af8e361fe510d1659b5c639cff0))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(Int32Impl(1))))</span>
|
<span class="hljs-comment">// utxoInfos: Vector[ScriptSignatureParams[InputInfo]] = Vector(ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),10000 sats,ECPublicKey(02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9bf93b35063383451d9294b707ef28955d0e4987))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(Int32Impl(1))))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// Yay! Now we use the RawTxSigner object to sign the tx.</span>
|
<span class="hljs-comment">// Yay! Now we use the RawTxSigner object to sign the tx.</span>
|
||||||
<span class="hljs-comment">// The 'sign' method is going produce a validly signed transaction</span>
|
<span class="hljs-comment">// The 'sign' method is going produce a validly signed transaction</span>
|
||||||
|
@ -197,7 +197,7 @@ builder += input
|
||||||
utxoInfos = utxoInfos,
|
utxoInfos = utxoInfos,
|
||||||
expectedFeeRate = feeRate
|
expectedFeeRate = feeRate
|
||||||
)
|
)
|
||||||
<span class="hljs-comment">// signedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),P2PKHScriptSignature(ECPublicKeyBytes(ByteVector(33 bytes, 0x033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd)), ECDigitalSignature(30440220355f580c648363f59ebd3f6e3d0a160913487c0fc3da949b9aad6edb9dca8e0e022054afd7554c70557f14a3721af4fa69b79717dde2f140ea97fcb46a501cbb162a01)),UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(1bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f)), TransactionOutput(4775 sats,pkh(02a32dfb38db3e0314c47fc7dd5df73fc0068132))),UInt32Impl(0))</span>
|
<span class="hljs-comment">// signedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),P2PKHScriptSignature(ECPublicKeyBytes(ByteVector(33 bytes, 0x02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe)), ECDigitalSignature(304402203a02202a1597d53934a876621e4ccd58bdfcc7a6f00b868867b8d330423b47a902205fe5b664cd76f270015238286ee3e6cf2345ad0cf37993e3b289a293d964512901)),UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(3729c0df339ab0b20444f367df9959467469a52f)), TransactionOutput(4775 sats,pkh(25753e8b8b6a874528fd8165cc0209e0ecfbd0af))),UInt32Impl(0))</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<pre><code class="hljs css language-scala">signedTx.inputs.length
|
<pre><code class="hljs css language-scala">signedTx.inputs.length
|
||||||
<span class="hljs-comment">// res2: Int = 1</span>
|
<span class="hljs-comment">// res2: Int = 1</span>
|
||||||
|
@ -207,7 +207,7 @@ signedTx.outputs.length
|
||||||
|
|
||||||
<span class="hljs-comment">//remember, you can call .hex on any bitcoin-s data structure to get the hex representation!</span>
|
<span class="hljs-comment">//remember, you can call .hex on any bitcoin-s data structure to get the hex representation!</span>
|
||||||
signedTx.hex
|
signedTx.hex
|
||||||
<span class="hljs-comment">// res4: String = 0200000001ee21039af2dae2ea3ec9d6312a96e90929fe5a81ebebb445dced96882217030d000000006a4730440220355f580c648363f59ebd3f6e3d0a160913487c0fc3da949b9aad6edb9dca8e0e022054afd7554c70557f14a3721af4fa69b79717dde2f140ea97fcb46a501cbb162a0121033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd000000000288130000000000001976a9141bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f88aca7120000000000001976a91402a32dfb38db3e0314c47fc7dd5df73fc006813288ac00000000</span>
|
<span class="hljs-comment">// res4: String = 02000000010336e76ba19bb84ee20781c148cd0825dcdada864f4ed44aceef46b296f350c5000000006a47304402203a02202a1597d53934a876621e4ccd58bdfcc7a6f00b868867b8d330423b47a902205fe5b664cd76f270015238286ee3e6cf2345ad0cf37993e3b289a293d9645129012102a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe000000000288130000000000001976a9143729c0df339ab0b20444f367df9959467469a52f88aca7120000000000001976a91425753e8b8b6a874528fd8165cc0209e0ecfbd0af88ac00000000</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/core/dlc"><span class="arrow-prev">← </span><span>Discreet Log Contract Data Structures</span></a><a class="docs-next button" href="/docs/next/core/lightning-network"><span>Lightning Network Data Types</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & the bitcoin-s developers</section></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>
|
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/core/dlc"><span class="arrow-prev">← </span><span>Discreet Log Contract Data Structures</span></a><a class="docs-next button" href="/docs/next/core/lightning-network"><span>Lightning Network Data Types</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & 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) {
|
document.addEventListener('keyup', function(e) {
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
});
|
});
|
||||||
</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/core/txbuilder.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">TxBuilder Example</h1></header><article><div><span><p>Bitcoin-S features a transaction building API that allows you to construct and sign Bitcoin transactions. Here's an example of how to use it</p>
|
</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/core/txbuilder.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">TxBuilder Example</h1></header><article><div><span><p>Bitcoin-S features a transaction building API that allows you to construct and sign Bitcoin transactions. Here's an example of how to use it</p>
|
||||||
<pre><code class="hljs css language-scala"><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>.<span class="hljs-type">Implicits</span>.global
|
<pre><code class="hljs css language-scala"><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>.<span class="hljs-type">Implicits</span>.global
|
||||||
<span class="hljs-comment">// ec: ExecutionContext = scala.concurrent.impl.ExecutionContextImpl$$anon$3@3089318e[Running, parallelism = 2, size = 0, active = 0, running = 0, steals = 0, tasks = 0, submissions = 0]</span>
|
<span class="hljs-comment">// ec: ExecutionContext = scala.concurrent.impl.ExecutionContextImpl$$anon$3@3a675e77[Running, parallelism = 2, size = 0, active = 0, running = 0, steals = 0, tasks = 0, submissions = 0]</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// Initialize a transaction builder</span>
|
<span class="hljs-comment">// Initialize a transaction builder</span>
|
||||||
<span class="hljs-keyword">val</span> builder = <span class="hljs-type">RawTxBuilder</span>()
|
<span class="hljs-keyword">val</span> builder = <span class="hljs-type">RawTxBuilder</span>()
|
||||||
|
@ -74,19 +74,19 @@
|
||||||
<span class="hljs-keyword">val</span> privKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
<span class="hljs-keyword">val</span> privKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
||||||
<span class="hljs-comment">// privKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
<span class="hljs-comment">// privKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||||
<span class="hljs-keyword">val</span> pubKey = privKey.publicKey
|
<span class="hljs-keyword">val</span> pubKey = privKey.publicKey
|
||||||
<span class="hljs-comment">// pubKey: ECPublicKey = ECPublicKey(033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd)</span>
|
<span class="hljs-comment">// pubKey: ECPublicKey = ECPublicKey(02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this is the script that the TxBuilder is going to create a</span>
|
<span class="hljs-comment">// this is the script that the TxBuilder is going to create a</span>
|
||||||
<span class="hljs-comment">// script signature that validly spends this scriptPubKey</span>
|
<span class="hljs-comment">// script signature that validly spends this scriptPubKey</span>
|
||||||
<span class="hljs-keyword">val</span> creditingSpk = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = privKey.publicKey)
|
<span class="hljs-keyword">val</span> creditingSpk = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = privKey.publicKey)
|
||||||
<span class="hljs-comment">// creditingSpk: P2PKHScriptPubKey = pkh(9d78c6eaa5d24af8e361fe510d1659b5c639cff0)</span>
|
<span class="hljs-comment">// creditingSpk: P2PKHScriptPubKey = pkh(9bf93b35063383451d9294b707ef28955d0e4987)</span>
|
||||||
<span class="hljs-keyword">val</span> amount = <span class="hljs-number">10000.</span>satoshis
|
<span class="hljs-keyword">val</span> amount = <span class="hljs-number">10000.</span>satoshis
|
||||||
<span class="hljs-comment">// amount: Satoshis = 10000 sats</span>
|
<span class="hljs-comment">// amount: Satoshis = 10000 sats</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this is the UTXO we are going to be spending</span>
|
<span class="hljs-comment">// this is the UTXO we are going to be spending</span>
|
||||||
<span class="hljs-keyword">val</span> utxo =
|
<span class="hljs-keyword">val</span> utxo =
|
||||||
<span class="hljs-type">TransactionOutput</span>(value = amount, scriptPubKey = creditingSpk)
|
<span class="hljs-type">TransactionOutput</span>(value = amount, scriptPubKey = creditingSpk)
|
||||||
<span class="hljs-comment">// utxo: TransactionOutput = TransactionOutput(10000 sats,pkh(9d78c6eaa5d24af8e361fe510d1659b5c639cff0))</span>
|
<span class="hljs-comment">// utxo: TransactionOutput = TransactionOutput(10000 sats,pkh(9bf93b35063383451d9294b707ef28955d0e4987))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// the private key that locks the funds for the script we are spending too</span>
|
<span class="hljs-comment">// the private key that locks the funds for the script we are spending too</span>
|
||||||
<span class="hljs-keyword">val</span> destinationPrivKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
<span class="hljs-keyword">val</span> destinationPrivKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
||||||
|
@ -99,7 +99,7 @@
|
||||||
<span class="hljs-comment">// the script that corresponds to destination private key, this is what is receiving the money</span>
|
<span class="hljs-comment">// the script that corresponds to destination private key, this is what is receiving the money</span>
|
||||||
<span class="hljs-keyword">val</span> destinationSPK =
|
<span class="hljs-keyword">val</span> destinationSPK =
|
||||||
<span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = destinationPrivKey.publicKey)
|
<span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = destinationPrivKey.publicKey)
|
||||||
<span class="hljs-comment">// destinationSPK: P2PKHScriptPubKey = pkh(1bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f)</span>
|
<span class="hljs-comment">// destinationSPK: P2PKHScriptPubKey = pkh(3729c0df339ab0b20444f367df9959467469a52f)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this is where we are sending money too</span>
|
<span class="hljs-comment">// this is where we are sending money too</span>
|
||||||
<span class="hljs-comment">// we could add more destinations here if we</span>
|
<span class="hljs-comment">// we could add more destinations here if we</span>
|
||||||
|
@ -110,7 +110,7 @@
|
||||||
|
|
||||||
<span class="hljs-type">Vector</span>(destination0)
|
<span class="hljs-type">Vector</span>(destination0)
|
||||||
}
|
}
|
||||||
<span class="hljs-comment">// destinations: Vector[TransactionOutput] = Vector(TransactionOutput(5000 sats,pkh(1bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f)))</span>
|
<span class="hljs-comment">// destinations: Vector[TransactionOutput] = Vector(TransactionOutput(5000 sats,pkh(3729c0df339ab0b20444f367df9959467469a52f)))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// Add the destinations to the tx builder</span>
|
<span class="hljs-comment">// Add the destinations to the tx builder</span>
|
||||||
builder ++= destinations
|
builder ++= destinations
|
||||||
|
@ -123,17 +123,17 @@ builder ++= destinations
|
||||||
inputs = <span class="hljs-type">Vector</span>.empty,
|
inputs = <span class="hljs-type">Vector</span>.empty,
|
||||||
outputs = <span class="hljs-type">Vector</span>(utxo),
|
outputs = <span class="hljs-type">Vector</span>(utxo),
|
||||||
lockTime = <span class="hljs-type">UInt32</span>.zero)
|
lockTime = <span class="hljs-type">UInt32</span>.zero)
|
||||||
<span class="hljs-comment">// creditingTx: BaseTransaction = BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9d78c6eaa5d24af8e361fe510d1659b5c639cff0))),UInt32Impl(0))</span>
|
<span class="hljs-comment">// creditingTx: BaseTransaction = BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9bf93b35063383451d9294b707ef28955d0e4987))),UInt32Impl(0))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this is the information we need from the crediting TX</span>
|
<span class="hljs-comment">// this is the information we need from the crediting TX</span>
|
||||||
<span class="hljs-comment">// to properly "link" it in the transaction we are creating</span>
|
<span class="hljs-comment">// to properly "link" it in the transaction we are creating</span>
|
||||||
<span class="hljs-keyword">val</span> outPoint = <span class="hljs-type">TransactionOutPoint</span>(creditingTx.txId, <span class="hljs-type">UInt32</span>.zero)
|
<span class="hljs-keyword">val</span> outPoint = <span class="hljs-type">TransactionOutPoint</span>(creditingTx.txId, <span class="hljs-type">UInt32</span>.zero)
|
||||||
<span class="hljs-comment">// outPoint: TransactionOutPoint = TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0)</span>
|
<span class="hljs-comment">// outPoint: TransactionOutPoint = TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0)</span>
|
||||||
<span class="hljs-keyword">val</span> input = <span class="hljs-type">TransactionInput</span>(
|
<span class="hljs-keyword">val</span> input = <span class="hljs-type">TransactionInput</span>(
|
||||||
outPoint,
|
outPoint,
|
||||||
<span class="hljs-type">EmptyScriptSignature</span>,
|
<span class="hljs-type">EmptyScriptSignature</span>,
|
||||||
sequenceNumber = <span class="hljs-type">UInt32</span>.zero)
|
sequenceNumber = <span class="hljs-type">UInt32</span>.zero)
|
||||||
<span class="hljs-comment">// input: TransactionInput = TransactionInputImpl(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),EmptyScriptSignature,UInt32Impl(0))</span>
|
<span class="hljs-comment">// input: TransactionInput = TransactionInputImpl(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),EmptyScriptSignature,UInt32Impl(0))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// Add a new input to our builder</span>
|
<span class="hljs-comment">// Add a new input to our builder</span>
|
||||||
builder += input
|
builder += input
|
||||||
|
@ -141,11 +141,11 @@ builder += input
|
||||||
|
|
||||||
<span class="hljs-comment">// We can now generate a RawTxBuilderResult ready to be finalized</span>
|
<span class="hljs-comment">// We can now generate a RawTxBuilderResult ready to be finalized</span>
|
||||||
<span class="hljs-keyword">val</span> builderResult = builder.result()
|
<span class="hljs-keyword">val</span> builderResult = builder.result()
|
||||||
<span class="hljs-comment">// builderResult: RawTxBuilderResult = RawTxBuilderResult(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(1bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f))),UInt32Impl(0))</span>
|
<span class="hljs-comment">// builderResult: RawTxBuilderResult = RawTxBuilderResult(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(3729c0df339ab0b20444f367df9959467469a52f))),UInt32Impl(0))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this contains the information needed to analyze our input during finalization</span>
|
<span class="hljs-comment">// this contains the information needed to analyze our input during finalization</span>
|
||||||
<span class="hljs-keyword">val</span> inputInfo = <span class="hljs-type">P2PKHInputInfo</span>(outPoint, amount, privKey.publicKey)
|
<span class="hljs-keyword">val</span> inputInfo = <span class="hljs-type">P2PKHInputInfo</span>(outPoint, amount, privKey.publicKey)
|
||||||
<span class="hljs-comment">// inputInfo: P2PKHInputInfo = P2PKHInputInfo(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),10000 sats,ECPublicKey(033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd))</span>
|
<span class="hljs-comment">// inputInfo: P2PKHInputInfo = P2PKHInputInfo(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),10000 sats,ECPublicKey(02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// this is how much we are going to pay as a fee to the network</span>
|
<span class="hljs-comment">// this is how much we are going to pay as a fee to the network</span>
|
||||||
<span class="hljs-comment">// for this example, we are going to pay 1 satoshi per byte</span>
|
<span class="hljs-comment">// for this example, we are going to pay 1 satoshi per byte</span>
|
||||||
|
@ -155,18 +155,18 @@ builder += input
|
||||||
<span class="hljs-keyword">val</span> changePrivKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
<span class="hljs-keyword">val</span> changePrivKey = <span class="hljs-type">ECPrivateKey</span>.freshPrivateKey
|
||||||
<span class="hljs-comment">// changePrivKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
<span class="hljs-comment">// changePrivKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||||
<span class="hljs-keyword">val</span> changeSPK = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = changePrivKey.publicKey)
|
<span class="hljs-keyword">val</span> changeSPK = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = changePrivKey.publicKey)
|
||||||
<span class="hljs-comment">// changeSPK: P2PKHScriptPubKey = pkh(02a32dfb38db3e0314c47fc7dd5df73fc0068132)</span>
|
<span class="hljs-comment">// changeSPK: P2PKHScriptPubKey = pkh(25753e8b8b6a874528fd8165cc0209e0ecfbd0af)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// We chose a finalizer that adds a change output to our tx based on a fee rate</span>
|
<span class="hljs-comment">// We chose a finalizer that adds a change output to our tx based on a fee rate</span>
|
||||||
<span class="hljs-keyword">val</span> finalizer = <span class="hljs-type">StandardNonInteractiveFinalizer</span>(
|
<span class="hljs-keyword">val</span> finalizer = <span class="hljs-type">StandardNonInteractiveFinalizer</span>(
|
||||||
<span class="hljs-type">Vector</span>(inputInfo),
|
<span class="hljs-type">Vector</span>(inputInfo),
|
||||||
feeRate,
|
feeRate,
|
||||||
changeSPK)
|
changeSPK)
|
||||||
<span class="hljs-comment">// finalizer: StandardNonInteractiveFinalizer = StandardNonInteractiveFinalizer(Vector(P2PKHInputInfo(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),10000 sats,ECPublicKey(033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd))),1 sats/byte,pkh(02a32dfb38db3e0314c47fc7dd5df73fc0068132))</span>
|
<span class="hljs-comment">// finalizer: StandardNonInteractiveFinalizer = StandardNonInteractiveFinalizer(Vector(P2PKHInputInfo(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),10000 sats,ECPublicKey(02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe))),1 sats/byte,pkh(25753e8b8b6a874528fd8165cc0209e0ecfbd0af))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// We can now finalize the tx builder result from earlier with this finalizer</span>
|
<span class="hljs-comment">// We can now finalize the tx builder result from earlier with this finalizer</span>
|
||||||
<span class="hljs-keyword">val</span> unsignedTx: <span class="hljs-type">Transaction</span> = finalizer.buildTx(builderResult)
|
<span class="hljs-keyword">val</span> unsignedTx: <span class="hljs-type">Transaction</span> = finalizer.buildTx(builderResult)
|
||||||
<span class="hljs-comment">// unsignedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(1bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f)), TransactionOutput(4775 sats,pkh(02a32dfb38db3e0314c47fc7dd5df73fc0068132))),UInt32Impl(0))</span>
|
<span class="hljs-comment">// unsignedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(3729c0df339ab0b20444f367df9959467469a52f)), TransactionOutput(4775 sats,pkh(25753e8b8b6a874528fd8165cc0209e0ecfbd0af))),UInt32Impl(0))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// We now turn to signing the unsigned transaction</span>
|
<span class="hljs-comment">// We now turn to signing the unsigned transaction</span>
|
||||||
<span class="hljs-comment">// this contains all the information we need to</span>
|
<span class="hljs-comment">// this contains all the information we need to</span>
|
||||||
|
@ -176,12 +176,12 @@ builder += input
|
||||||
signers = <span class="hljs-type">Vector</span>(privKey),
|
signers = <span class="hljs-type">Vector</span>(privKey),
|
||||||
hashType =
|
hashType =
|
||||||
<span class="hljs-type">HashType</span>.sigHashAll)
|
<span class="hljs-type">HashType</span>.sigHashAll)
|
||||||
<span class="hljs-comment">// utxoInfo: ScriptSignatureParams[P2PKHInputInfo] = ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),10000 sats,ECPublicKey(033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9d78c6eaa5d24af8e361fe510d1659b5c639cff0))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(Int32Impl(1)))</span>
|
<span class="hljs-comment">// utxoInfo: ScriptSignatureParams[P2PKHInputInfo] = ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),10000 sats,ECPublicKey(02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9bf93b35063383451d9294b707ef28955d0e4987))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(Int32Impl(1)))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// all of the UTXO spending information, since we only have</span>
|
<span class="hljs-comment">// all of the UTXO spending information, since we only have</span>
|
||||||
<span class="hljs-comment">// one input, this is just one element</span>
|
<span class="hljs-comment">// one input, this is just one element</span>
|
||||||
<span class="hljs-keyword">val</span> utxoInfos: <span class="hljs-type">Vector</span>[<span class="hljs-type">ScriptSignatureParams</span>[<span class="hljs-type">InputInfo</span>]] = <span class="hljs-type">Vector</span>(utxoInfo)
|
<span class="hljs-keyword">val</span> utxoInfos: <span class="hljs-type">Vector</span>[<span class="hljs-type">ScriptSignatureParams</span>[<span class="hljs-type">InputInfo</span>]] = <span class="hljs-type">Vector</span>(utxoInfo)
|
||||||
<span class="hljs-comment">// utxoInfos: Vector[ScriptSignatureParams[InputInfo]] = Vector(ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),10000 sats,ECPublicKey(033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9d78c6eaa5d24af8e361fe510d1659b5c639cff0))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(Int32Impl(1))))</span>
|
<span class="hljs-comment">// utxoInfos: Vector[ScriptSignatureParams[InputInfo]] = Vector(ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),10000 sats,ECPublicKey(02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(9bf93b35063383451d9294b707ef28955d0e4987))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(Int32Impl(1))))</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// Yay! Now we use the RawTxSigner object to sign the tx.</span>
|
<span class="hljs-comment">// Yay! Now we use the RawTxSigner object to sign the tx.</span>
|
||||||
<span class="hljs-comment">// The 'sign' method is going produce a validly signed transaction</span>
|
<span class="hljs-comment">// The 'sign' method is going produce a validly signed transaction</span>
|
||||||
|
@ -197,7 +197,7 @@ builder += input
|
||||||
utxoInfos = utxoInfos,
|
utxoInfos = utxoInfos,
|
||||||
expectedFeeRate = feeRate
|
expectedFeeRate = feeRate
|
||||||
)
|
)
|
||||||
<span class="hljs-comment">// signedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(0d0317228896eddc45b4ebeb815afe2909e9962a31d6c93eeae2daf29a0321ee:0),P2PKHScriptSignature(ECPublicKeyBytes(ByteVector(33 bytes, 0x033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd)), ECDigitalSignature(30440220355f580c648363f59ebd3f6e3d0a160913487c0fc3da949b9aad6edb9dca8e0e022054afd7554c70557f14a3721af4fa69b79717dde2f140ea97fcb46a501cbb162a01)),UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(1bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f)), TransactionOutput(4775 sats,pkh(02a32dfb38db3e0314c47fc7dd5df73fc0068132))),UInt32Impl(0))</span>
|
<span class="hljs-comment">// signedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(c550f396b246efce4ad44e4f86dadadc2508cd48c18107e24eb89ba16be73603:0),P2PKHScriptSignature(ECPublicKeyBytes(ByteVector(33 bytes, 0x02a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe)), ECDigitalSignature(304402203a02202a1597d53934a876621e4ccd58bdfcc7a6f00b868867b8d330423b47a902205fe5b664cd76f270015238286ee3e6cf2345ad0cf37993e3b289a293d964512901)),UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(3729c0df339ab0b20444f367df9959467469a52f)), TransactionOutput(4775 sats,pkh(25753e8b8b6a874528fd8165cc0209e0ecfbd0af))),UInt32Impl(0))</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<pre><code class="hljs css language-scala">signedTx.inputs.length
|
<pre><code class="hljs css language-scala">signedTx.inputs.length
|
||||||
<span class="hljs-comment">// res2: Int = 1</span>
|
<span class="hljs-comment">// res2: Int = 1</span>
|
||||||
|
@ -207,7 +207,7 @@ signedTx.outputs.length
|
||||||
|
|
||||||
<span class="hljs-comment">//remember, you can call .hex on any bitcoin-s data structure to get the hex representation!</span>
|
<span class="hljs-comment">//remember, you can call .hex on any bitcoin-s data structure to get the hex representation!</span>
|
||||||
signedTx.hex
|
signedTx.hex
|
||||||
<span class="hljs-comment">// res4: String = 0200000001ee21039af2dae2ea3ec9d6312a96e90929fe5a81ebebb445dced96882217030d000000006a4730440220355f580c648363f59ebd3f6e3d0a160913487c0fc3da949b9aad6edb9dca8e0e022054afd7554c70557f14a3721af4fa69b79717dde2f140ea97fcb46a501cbb162a0121033c558fc36ad5dac217b9a45edcc585f2eaf7654bf76a05d6c63f30ac20d551fd000000000288130000000000001976a9141bb8f8ea5bc8ffd3355c9123a8a39dcd6213056f88aca7120000000000001976a91402a32dfb38db3e0314c47fc7dd5df73fc006813288ac00000000</span>
|
<span class="hljs-comment">// res4: String = 02000000010336e76ba19bb84ee20781c148cd0825dcdada864f4ed44aceef46b296f350c5000000006a47304402203a02202a1597d53934a876621e4ccd58bdfcc7a6f00b868867b8d330423b47a902205fe5b664cd76f270015238286ee3e6cf2345ad0cf37993e3b289a293d9645129012102a9c47995301ccdf8bc2adb840a7b53758d33e33b58a2ec544c7f33c7a4681fbe000000000288130000000000001976a9143729c0df339ab0b20444f367df9959467469a52f88aca7120000000000001976a91425753e8b8b6a874528fd8165cc0209e0ecfbd0af88ac00000000</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/core/dlc"><span class="arrow-prev">← </span><span>Discreet Log Contract Data Structures</span></a><a class="docs-next button" href="/docs/next/core/lightning-network"><span>Lightning Network Data Types</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & the bitcoin-s developers</section></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>
|
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/core/dlc"><span class="arrow-prev">← </span><span>Discreet Log Contract Data Structures</span></a><a class="docs-next button" href="/docs/next/core/lightning-network"><span>Lightning Network Data Types</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & 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) {
|
document.addEventListener('keyup', function(e) {
|
||||||
|
|
|
@ -96,13 +96,13 @@
|
||||||
<span class="hljs-comment">// extPrivKey: ExtPrivateKey = Masked(ExtPrivateKeyImpl)</span>
|
<span class="hljs-comment">// extPrivKey: ExtPrivateKey = Masked(ExtPrivateKeyImpl)</span>
|
||||||
|
|
||||||
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes)
|
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes)
|
||||||
<span class="hljs-comment">// res0: ECDigitalSignature = ECDigitalSignature(304402204b93345da97c910d014ff471e688e8fdfda148d9fe44ae73085e54cd5fac5fd402205aa38f4b79e8a90b74f839c7c253a3437cd8dfd69089b9045ae9eb9a8cf56289)</span>
|
<span class="hljs-comment">// res0: ECDigitalSignature = ECDigitalSignature(3045022100a2cb59819c9f9c44606786fc37f23226e828c9e16b4a81dc8bccc191ff2cb17a022071e8f36370caa3ec4eb511a4f201744de82c0a59fa75a84fb6d20e950f4139db)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> path = <span class="hljs-type">BIP32Path</span>(<span class="hljs-type">Vector</span>(<span class="hljs-type">BIP32Node</span>(<span class="hljs-number">0</span>,<span class="hljs-literal">false</span>)))
|
<span class="hljs-keyword">val</span> path = <span class="hljs-type">BIP32Path</span>(<span class="hljs-type">Vector</span>(<span class="hljs-type">BIP32Node</span>(<span class="hljs-number">0</span>,<span class="hljs-literal">false</span>)))
|
||||||
<span class="hljs-comment">// path: BIP32Path = m/0</span>
|
<span class="hljs-comment">// path: BIP32Path = m/0</span>
|
||||||
|
|
||||||
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes,path)
|
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes,path)
|
||||||
<span class="hljs-comment">// res1: ECDigitalSignature = ECDigitalSignature(3045022100e384b333beab5894bed912de481b7654122b6a73add6dbd072f547292218a61a0220736ee267a05d16ef07ad37757f1f834d7cc145d4c96f7f8c432594fff0fe3e6a)</span>
|
<span class="hljs-comment">// res1: ECDigitalSignature = ECDigitalSignature(30450221008ace57bc821398a8c5b8e979f724a1c9bc0135337bed287e9a85384e6e930c48022069e4cd07ff4460f34e46294972d10c6b5f868866a9dfa2e5c07d73e0c1477902)</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>With <code>ExtSign</code>, you can use <code>ExtPrivateKey</code> to sign transactions inside of <code>TxBuilder</code> since <code>UTXOSpendingInfo</code> takes in <code>Sign</code> as a parameter.</p>
|
<p>With <code>ExtSign</code>, you can use <code>ExtPrivateKey</code> to sign transactions inside of <code>TxBuilder</code> since <code>UTXOSpendingInfo</code> takes in <code>Sign</code> as a parameter.</p>
|
||||||
<p>You can also provide a <code>path</code> to use to derive a child <code>ExtPrivateKey</code>, and then sign with that child private key</p>
|
<p>You can also provide a <code>path</code> to use to derive a child <code>ExtPrivateKey</code>, and then sign with that child private key</p>
|
||||||
|
|
|
@ -96,13 +96,13 @@
|
||||||
<span class="hljs-comment">// extPrivKey: ExtPrivateKey = Masked(ExtPrivateKeyImpl)</span>
|
<span class="hljs-comment">// extPrivKey: ExtPrivateKey = Masked(ExtPrivateKeyImpl)</span>
|
||||||
|
|
||||||
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes)
|
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes)
|
||||||
<span class="hljs-comment">// res0: ECDigitalSignature = ECDigitalSignature(304402204b93345da97c910d014ff471e688e8fdfda148d9fe44ae73085e54cd5fac5fd402205aa38f4b79e8a90b74f839c7c253a3437cd8dfd69089b9045ae9eb9a8cf56289)</span>
|
<span class="hljs-comment">// res0: ECDigitalSignature = ECDigitalSignature(3045022100a2cb59819c9f9c44606786fc37f23226e828c9e16b4a81dc8bccc191ff2cb17a022071e8f36370caa3ec4eb511a4f201744de82c0a59fa75a84fb6d20e950f4139db)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> path = <span class="hljs-type">BIP32Path</span>(<span class="hljs-type">Vector</span>(<span class="hljs-type">BIP32Node</span>(<span class="hljs-number">0</span>,<span class="hljs-literal">false</span>)))
|
<span class="hljs-keyword">val</span> path = <span class="hljs-type">BIP32Path</span>(<span class="hljs-type">Vector</span>(<span class="hljs-type">BIP32Node</span>(<span class="hljs-number">0</span>,<span class="hljs-literal">false</span>)))
|
||||||
<span class="hljs-comment">// path: BIP32Path = m/0</span>
|
<span class="hljs-comment">// path: BIP32Path = m/0</span>
|
||||||
|
|
||||||
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes,path)
|
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes,path)
|
||||||
<span class="hljs-comment">// res1: ECDigitalSignature = ECDigitalSignature(3045022100e384b333beab5894bed912de481b7654122b6a73add6dbd072f547292218a61a0220736ee267a05d16ef07ad37757f1f834d7cc145d4c96f7f8c432594fff0fe3e6a)</span>
|
<span class="hljs-comment">// res1: ECDigitalSignature = ECDigitalSignature(30450221008ace57bc821398a8c5b8e979f724a1c9bc0135337bed287e9a85384e6e930c48022069e4cd07ff4460f34e46294972d10c6b5f868866a9dfa2e5c07d73e0c1477902)</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>With <code>ExtSign</code>, you can use <code>ExtPrivateKey</code> to sign transactions inside of <code>TxBuilder</code> since <code>UTXOSpendingInfo</code> takes in <code>Sign</code> as a parameter.</p>
|
<p>With <code>ExtSign</code>, you can use <code>ExtPrivateKey</code> to sign transactions inside of <code>TxBuilder</code> since <code>UTXOSpendingInfo</code> takes in <code>Sign</code> as a parameter.</p>
|
||||||
<p>You can also provide a <code>path</code> to use to derive a child <code>ExtPrivateKey</code>, and then sign with that child private key</p>
|
<p>You can also provide a <code>path</code> to use to derive a child <code>ExtPrivateKey</code>, and then sign with that child private key</p>
|
||||||
|
|
|
@ -72,20 +72,31 @@ see <a href="/docs/next/getting-started">getting-started</a></p>
|
||||||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||||||
<!-- END doctoc -->
|
<!-- END doctoc -->
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#step-1-java-and-scala">Step 1: Java and Scala</a></li>
|
<li><a href="#step-1-developer-runtimes">Step 1: Java and Scala</a></li>
|
||||||
<li><a href="#step-2-bitcoin-s-repository">Step 2: Bitcoin-S Repository</a></li>
|
<li><a href="#step-2-bitcoin-s-repository">Step 2: Bitcoin-S Repository</a></li>
|
||||||
<li><a href="#step-3-configuration">Step 3: Configuration</a></li>
|
<li><a href="#step-3-configuration">Step 3: Configuration</a></li>
|
||||||
<li><a href="#step-4-setting-up-a-bitcoin-s-node">Step 4: Setting Up A Bitcoin-S Node</a></li>
|
<li><a href="#step-4-setting-up-a-bitcoin-s-node">Step 4: Setting Up A Bitcoin-S Node</a></li>
|
||||||
<li><a href="#step-5-optional-moving-to-testnet">Step 5: (Optional): Moving To Testnet</a></li>
|
<li><a href="#step-5-optional-moving-to-testnet">Step 5: (Optional): Moving To Testnet</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
<h2><a class="anchor" aria-hidden="true" id="step-1-java-and-scala"></a><a href="#step-1-java-and-scala" 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>Step 1: Java and Scala</h2>
|
<h2><a class="anchor" aria-hidden="true" id="step-1-developer-runtimes"></a><a href="#step-1-developer-runtimes" 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>Step 1: Developer runtimes</h2>
|
||||||
|
<h3><a class="anchor" aria-hidden="true" id="scalajava"></a><a href="#scalajava" 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>Scala/Java</h3>
|
||||||
<p>To get started you will need Java, Scala, and some other nice tools installed, luckily the Scala team has an easy setup process!</p>
|
<p>To get started you will need Java, Scala, and some other nice tools installed, luckily the Scala team has an easy setup process!</p>
|
||||||
<p>Simply follow the instructions in <a href="https://www.scala-lang.org/2020/06/29/one-click-install.html">this short blog</a> to get started.</p>
|
<p>Simply follow the instructions in <a href="https://www.scala-lang.org/2020/06/29/one-click-install.html">this short blog</a> to get started.</p>
|
||||||
|
<p>If you don't like <code>curl</code>, you can use OS specific package managers to install coursier <a href="https://get-coursier.io/docs/2.0.0-RC2/cli-overview.html#installation">here</a></p>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>bitcoin-s requires java9+ for development environments. If you do not have java9+ installed, you will not be able to build bitcoin-s.
|
<p>bitcoin-s requires java9+ for development environments. If you do not have java9+ installed, you will not be able to build bitcoin-s.
|
||||||
<a href="https://github.com/bitcoin-s/bitcoin-s/issues/3298">You will run into this error if you are on java8 or lower</a></p>
|
<a href="https://github.com/bitcoin-s/bitcoin-s/issues/3298">You will run into this error if you are on java8 or lower</a></p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
<p>If you follow the coursier route, <a href="https://get-coursier.io/docs/2.0.0-RC6-15/cli-java.html">you can switch to a java11 version by running</a></p>
|
||||||
|
<blockquote>
|
||||||
|
<p>cs java --jvm adopt:11 --setup</p>
|
||||||
|
</blockquote>
|
||||||
|
<h3><a class="anchor" aria-hidden="true" id="scalajs"></a><a href="#scalajs" 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>Scala.js</h3>
|
||||||
|
<p>We support publishing of <a href="https://www.scala-js.org/">scala.js</a> artifacts.
|
||||||
|
This library will compile Scala source code into javascript artifacts.</p>
|
||||||
|
<p>To be able to run scala js tests, you need to have the Node.js installed.
|
||||||
|
You can install it from <a href="https://nodejs.org/en/">here</a></p>
|
||||||
<h2><a class="anchor" aria-hidden="true" id="step-2-bitcoin-s-repository"></a><a href="#step-2-bitcoin-s-repository" 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>Step 2: Bitcoin-S Repository</h2>
|
<h2><a class="anchor" aria-hidden="true" id="step-2-bitcoin-s-repository"></a><a href="#step-2-bitcoin-s-repository" 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>Step 2: Bitcoin-S Repository</h2>
|
||||||
<p>Now, it is time to clone the <a href="https://github.com/bitcoin-s/bitcoin-s/">Bitcoin-S repository</a> by running</p>
|
<p>Now, it is time to clone the <a href="https://github.com/bitcoin-s/bitcoin-s/">Bitcoin-S repository</a> by running</p>
|
||||||
<pre><code class="hljs css language-bashrc">git <span class="hljs-keyword">clone</span> <span class="hljs-title">--depth</span> <span class="hljs-number">500</span> --recursive git@github.com:bitcoin-s/bitcoin-s.git
|
<pre><code class="hljs css language-bashrc">git <span class="hljs-keyword">clone</span> <span class="hljs-title">--depth</span> <span class="hljs-number">500</span> --recursive git@github.com:bitcoin-s/bitcoin-s.git
|
||||||
|
@ -185,7 +196,7 @@ download <a href="https://s3-us-west-2.amazonaws.com/www.suredbits.com/chaindb-t
|
||||||
$ mv chaindb.sqlite ~/.bitcoin-s/testnet/
|
$ mv chaindb.sqlite ~/.bitcoin-s/testnet/
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>This should take a couple minutes to execute, but once it is done, you will only have a short while left to sync once you start your server.</p>
|
<p>This should take a couple minutes to execute, but once it is done, you will only have a short while left to sync once you start your server.</p>
|
||||||
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/bips"><span class="arrow-prev">← </span><span>Supported BIPs</span></a><a class="docs-next button" href="/docs/next/applications/cli"><span>CLI</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#getting-setup-with-bitcoin-s">Getting Setup With Bitcoin-S</a></li><li><a href="#step-1-java-and-scala">Step 1: Java and Scala</a></li><li><a href="#step-2-bitcoin-s-repository">Step 2: Bitcoin-S Repository</a></li><li><a href="#step-3-configuration">Step 3: Configuration</a></li><li><a href="#step-4-setting-up-a-bitcoin-s-node">Step 4: Setting Up A Bitcoin-S Node</a><ul class="toc-headings"><li><a href="#neutrino-node">Neutrino Node</a></li><li><a href="#bitcoind-backend">Bitcoind Backend</a></li></ul></li><li><a href="#step-5-optional-moving-to-testnet">Step 5 (Optional): Moving To Testnet</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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & the bitcoin-s developers</section></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>
|
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/bips"><span class="arrow-prev">← </span><span>Supported BIPs</span></a><a class="docs-next button" href="/docs/next/applications/cli"><span>CLI</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#getting-setup-with-bitcoin-s">Getting Setup With Bitcoin-S</a></li><li><a href="#step-1-developer-runtimes">Step 1: Developer runtimes</a><ul class="toc-headings"><li><a href="#scalajava">Scala/Java</a></li><li><a href="#scalajs">Scala.js</a></li></ul></li><li><a href="#step-2-bitcoin-s-repository">Step 2: Bitcoin-S Repository</a></li><li><a href="#step-3-configuration">Step 3: Configuration</a></li><li><a href="#step-4-setting-up-a-bitcoin-s-node">Step 4: Setting Up A Bitcoin-S Node</a><ul class="toc-headings"><li><a href="#neutrino-node">Neutrino Node</a></li><li><a href="#bitcoind-backend">Bitcoind Backend</a></li></ul></li><li><a href="#step-5-optional-moving-to-testnet">Step 5 (Optional): Moving To Testnet</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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & 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) {
|
document.addEventListener('keyup', function(e) {
|
||||||
if (e.target !== document.body) {
|
if (e.target !== document.body) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -72,20 +72,31 @@ see <a href="/docs/next/getting-started">getting-started</a></p>
|
||||||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||||||
<!-- END doctoc -->
|
<!-- END doctoc -->
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#step-1-java-and-scala">Step 1: Java and Scala</a></li>
|
<li><a href="#step-1-developer-runtimes">Step 1: Java and Scala</a></li>
|
||||||
<li><a href="#step-2-bitcoin-s-repository">Step 2: Bitcoin-S Repository</a></li>
|
<li><a href="#step-2-bitcoin-s-repository">Step 2: Bitcoin-S Repository</a></li>
|
||||||
<li><a href="#step-3-configuration">Step 3: Configuration</a></li>
|
<li><a href="#step-3-configuration">Step 3: Configuration</a></li>
|
||||||
<li><a href="#step-4-setting-up-a-bitcoin-s-node">Step 4: Setting Up A Bitcoin-S Node</a></li>
|
<li><a href="#step-4-setting-up-a-bitcoin-s-node">Step 4: Setting Up A Bitcoin-S Node</a></li>
|
||||||
<li><a href="#step-5-optional-moving-to-testnet">Step 5: (Optional): Moving To Testnet</a></li>
|
<li><a href="#step-5-optional-moving-to-testnet">Step 5: (Optional): Moving To Testnet</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
<h2><a class="anchor" aria-hidden="true" id="step-1-java-and-scala"></a><a href="#step-1-java-and-scala" 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>Step 1: Java and Scala</h2>
|
<h2><a class="anchor" aria-hidden="true" id="step-1-developer-runtimes"></a><a href="#step-1-developer-runtimes" 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>Step 1: Developer runtimes</h2>
|
||||||
|
<h3><a class="anchor" aria-hidden="true" id="scalajava"></a><a href="#scalajava" 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>Scala/Java</h3>
|
||||||
<p>To get started you will need Java, Scala, and some other nice tools installed, luckily the Scala team has an easy setup process!</p>
|
<p>To get started you will need Java, Scala, and some other nice tools installed, luckily the Scala team has an easy setup process!</p>
|
||||||
<p>Simply follow the instructions in <a href="https://www.scala-lang.org/2020/06/29/one-click-install.html">this short blog</a> to get started.</p>
|
<p>Simply follow the instructions in <a href="https://www.scala-lang.org/2020/06/29/one-click-install.html">this short blog</a> to get started.</p>
|
||||||
|
<p>If you don't like <code>curl</code>, you can use OS specific package managers to install coursier <a href="https://get-coursier.io/docs/2.0.0-RC2/cli-overview.html#installation">here</a></p>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>bitcoin-s requires java9+ for development environments. If you do not have java9+ installed, you will not be able to build bitcoin-s.
|
<p>bitcoin-s requires java9+ for development environments. If you do not have java9+ installed, you will not be able to build bitcoin-s.
|
||||||
<a href="https://github.com/bitcoin-s/bitcoin-s/issues/3298">You will run into this error if you are on java8 or lower</a></p>
|
<a href="https://github.com/bitcoin-s/bitcoin-s/issues/3298">You will run into this error if you are on java8 or lower</a></p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
<p>If you follow the coursier route, <a href="https://get-coursier.io/docs/2.0.0-RC6-15/cli-java.html">you can switch to a java11 version by running</a></p>
|
||||||
|
<blockquote>
|
||||||
|
<p>cs java --jvm adopt:11 --setup</p>
|
||||||
|
</blockquote>
|
||||||
|
<h3><a class="anchor" aria-hidden="true" id="scalajs"></a><a href="#scalajs" 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>Scala.js</h3>
|
||||||
|
<p>We support publishing of <a href="https://www.scala-js.org/">scala.js</a> artifacts.
|
||||||
|
This library will compile Scala source code into javascript artifacts.</p>
|
||||||
|
<p>To be able to run scala js tests, you need to have the Node.js installed.
|
||||||
|
You can install it from <a href="https://nodejs.org/en/">here</a></p>
|
||||||
<h2><a class="anchor" aria-hidden="true" id="step-2-bitcoin-s-repository"></a><a href="#step-2-bitcoin-s-repository" 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>Step 2: Bitcoin-S Repository</h2>
|
<h2><a class="anchor" aria-hidden="true" id="step-2-bitcoin-s-repository"></a><a href="#step-2-bitcoin-s-repository" 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>Step 2: Bitcoin-S Repository</h2>
|
||||||
<p>Now, it is time to clone the <a href="https://github.com/bitcoin-s/bitcoin-s/">Bitcoin-S repository</a> by running</p>
|
<p>Now, it is time to clone the <a href="https://github.com/bitcoin-s/bitcoin-s/">Bitcoin-S repository</a> by running</p>
|
||||||
<pre><code class="hljs css language-bashrc">git <span class="hljs-keyword">clone</span> <span class="hljs-title">--depth</span> <span class="hljs-number">500</span> --recursive git@github.com:bitcoin-s/bitcoin-s.git
|
<pre><code class="hljs css language-bashrc">git <span class="hljs-keyword">clone</span> <span class="hljs-title">--depth</span> <span class="hljs-number">500</span> --recursive git@github.com:bitcoin-s/bitcoin-s.git
|
||||||
|
@ -185,7 +196,7 @@ download <a href="https://s3-us-west-2.amazonaws.com/www.suredbits.com/chaindb-t
|
||||||
$ mv chaindb.sqlite ~/.bitcoin-s/testnet/
|
$ mv chaindb.sqlite ~/.bitcoin-s/testnet/
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>This should take a couple minutes to execute, but once it is done, you will only have a short while left to sync once you start your server.</p>
|
<p>This should take a couple minutes to execute, but once it is done, you will only have a short while left to sync once you start your server.</p>
|
||||||
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/bips"><span class="arrow-prev">← </span><span>Supported BIPs</span></a><a class="docs-next button" href="/docs/next/applications/cli"><span>CLI</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#getting-setup-with-bitcoin-s">Getting Setup With Bitcoin-S</a></li><li><a href="#step-1-java-and-scala">Step 1: Java and Scala</a></li><li><a href="#step-2-bitcoin-s-repository">Step 2: Bitcoin-S Repository</a></li><li><a href="#step-3-configuration">Step 3: Configuration</a></li><li><a href="#step-4-setting-up-a-bitcoin-s-node">Step 4: Setting Up A Bitcoin-S Node</a><ul class="toc-headings"><li><a href="#neutrino-node">Neutrino Node</a></li><li><a href="#bitcoind-backend">Bitcoind Backend</a></li></ul></li><li><a href="#step-5-optional-moving-to-testnet">Step 5 (Optional): Moving To Testnet</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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & the bitcoin-s developers</section></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>
|
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/next/bips"><span class="arrow-prev">← </span><span>Supported BIPs</span></a><a class="docs-next button" href="/docs/next/applications/cli"><span>CLI</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#getting-setup-with-bitcoin-s">Getting Setup With Bitcoin-S</a></li><li><a href="#step-1-developer-runtimes">Step 1: Developer runtimes</a><ul class="toc-headings"><li><a href="#scalajava">Scala/Java</a></li><li><a href="#scalajs">Scala.js</a></li></ul></li><li><a href="#step-2-bitcoin-s-repository">Step 2: Bitcoin-S Repository</a></li><li><a href="#step-3-configuration">Step 3: Configuration</a></li><li><a href="#step-4-setting-up-a-bitcoin-s-node">Step 4: Setting Up A Bitcoin-S Node</a><ul class="toc-headings"><li><a href="#neutrino-node">Neutrino Node</a></li><li><a href="#bitcoind-backend">Bitcoind Backend</a></li></ul></li><li><a href="#step-5-optional-moving-to-testnet">Step 5 (Optional): Moving To Testnet</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/zt-eavycu0x-WQL7XOakzQo8tAy7jHHZUw" 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 © 2021 Suredbits & 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) {
|
document.addEventListener('keyup', function(e) {
|
||||||
if (e.target !== document.body) {
|
if (e.target !== document.body) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -130,7 +130,7 @@ libraryDependencies += <span class="hljs-string">"org.bitcoin-s"</span> %% <span
|
||||||
<h3><a class="anchor" aria-hidden="true" id="nightly-builds"></a><a href="#nightly-builds" 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>Nightly builds</h3>
|
<h3><a class="anchor" aria-hidden="true" id="nightly-builds"></a><a href="#nightly-builds" 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>Nightly builds</h3>
|
||||||
<p>You can also run on the bleeding edge of Bitcoin-S, by
|
<p>You can also run on the bleeding edge of Bitcoin-S, by
|
||||||
adding a snapshot build to your <code>build.sbt</code>. The most
|
adding a snapshot build to your <code>build.sbt</code>. The most
|
||||||
recent snapshot published is <code>1.6.0-177-cada6fdc-SNAPSHOT</code>.</p>
|
recent snapshot published is <code>1.6.0-178-cc1cfe65-SNAPSHOT</code>.</p>
|
||||||
<p>To fetch snapshots, you will need to add the correct
|
<p>To fetch snapshots, you will need to add the correct
|
||||||
resolver in your <code>build.sbt</code>:</p>
|
resolver in your <code>build.sbt</code>:</p>
|
||||||
<pre><code class="hljs css language-sbt">resolvers += Resolver.sonatypeRepo(<span class="hljs-string">"snapshots"</span>)
|
<pre><code class="hljs css language-sbt">resolvers += Resolver.sonatypeRepo(<span class="hljs-string">"snapshots"</span>)
|
||||||
|
|
|
@ -130,7 +130,7 @@ libraryDependencies += <span class="hljs-string">"org.bitcoin-s"</span> %% <span
|
||||||
<h3><a class="anchor" aria-hidden="true" id="nightly-builds"></a><a href="#nightly-builds" 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>Nightly builds</h3>
|
<h3><a class="anchor" aria-hidden="true" id="nightly-builds"></a><a href="#nightly-builds" 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>Nightly builds</h3>
|
||||||
<p>You can also run on the bleeding edge of Bitcoin-S, by
|
<p>You can also run on the bleeding edge of Bitcoin-S, by
|
||||||
adding a snapshot build to your <code>build.sbt</code>. The most
|
adding a snapshot build to your <code>build.sbt</code>. The most
|
||||||
recent snapshot published is <code>1.6.0-177-cada6fdc-SNAPSHOT</code>.</p>
|
recent snapshot published is <code>1.6.0-178-cc1cfe65-SNAPSHOT</code>.</p>
|
||||||
<p>To fetch snapshots, you will need to add the correct
|
<p>To fetch snapshots, you will need to add the correct
|
||||||
resolver in your <code>build.sbt</code>:</p>
|
resolver in your <code>build.sbt</code>:</p>
|
||||||
<pre><code class="hljs css language-sbt">resolvers += Resolver.sonatypeRepo(<span class="hljs-string">"snapshots"</span>)
|
<pre><code class="hljs css language-sbt">resolvers += Resolver.sonatypeRepo(<span class="hljs-string">"snapshots"</span>)
|
||||||
|
|
|
@ -77,14 +77,14 @@
|
||||||
|
|
||||||
<span class="hljs-comment">//get 256 bits of random entropy</span>
|
<span class="hljs-comment">//get 256 bits of random entropy</span>
|
||||||
<span class="hljs-keyword">val</span> entropy = <span class="hljs-type">MnemonicCode</span>.getEntropy256Bits
|
<span class="hljs-keyword">val</span> entropy = <span class="hljs-type">MnemonicCode</span>.getEntropy256Bits
|
||||||
<span class="hljs-comment">// entropy: scodec.bits.BitVector = BitVector(256 bits, 0xf55528dbf442552cbf0a1ffe15f1ad93f28301abaf6ded921d538206349296e9)</span>
|
<span class="hljs-comment">// entropy: scodec.bits.BitVector = BitVector(256 bits, 0x0df7cb843e37bb9e38af60dc64ed6f4596e0cd823d940ebff0c0dd56264f6b94)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> mnemonic = <span class="hljs-type">MnemonicCode</span>.fromEntropy(entropy)
|
<span class="hljs-keyword">val</span> mnemonic = <span class="hljs-type">MnemonicCode</span>.fromEntropy(entropy)
|
||||||
<span class="hljs-comment">// mnemonic: MnemonicCode = Masked(MnemonicCodeImpl)</span>
|
<span class="hljs-comment">// mnemonic: MnemonicCode = Masked(MnemonicCodeImpl)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">//you can print that mnemonic seed with this</span>
|
<span class="hljs-comment">//you can print that mnemonic seed with this</span>
|
||||||
println(mnemonic.words)
|
println(mnemonic.words)
|
||||||
<span class="hljs-comment">// Vector(vocal, power, dad, trigger, census, north, wire, dumb, wrap, question, hidden, child, choice, liar, push, unit, unique, movie, female, advice, globe, enable, forum, citizen)</span>
|
<span class="hljs-comment">// Vector(assume, salad, three, ladder, knife, someone, tired, ugly, symbol, cherry, forward, menu, host, grocery, angry, raw, attitude, zebra, coral, rival, give, chicken, purity, panel)</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Now that we have a <code>MnemonicCode</code> that was securely generated, we need to now create <code>KeyManagerParams</code> which tells us how to generate
|
<p>Now that we have a <code>MnemonicCode</code> that was securely generated, we need to now create <code>KeyManagerParams</code> which tells us how to generate
|
||||||
generate specific kinds of addresses for wallets.</p>
|
generate specific kinds of addresses for wallets.</p>
|
||||||
|
@ -99,7 +99,7 @@ generate specific kinds of addresses for wallets.</p>
|
||||||
<pre><code class="hljs css language-scala"><span class="hljs-comment">//this will create a temp directory with the prefix 'key-manager-example` that will</span>
|
<pre><code class="hljs css language-scala"><span class="hljs-comment">//this will create a temp directory with the prefix 'key-manager-example` that will</span>
|
||||||
<span class="hljs-comment">//have a file in it called "encrypted-bitcoin-s-seed.json"</span>
|
<span class="hljs-comment">//have a file in it called "encrypted-bitcoin-s-seed.json"</span>
|
||||||
<span class="hljs-keyword">val</span> seedPath = <span class="hljs-type">Files</span>.createTempDirectory(<span class="hljs-string">"key-manager-example"</span>).resolve(<span class="hljs-type">WalletStorage</span>.<span class="hljs-type">ENCRYPTED_SEED_FILE_NAME</span>)
|
<span class="hljs-keyword">val</span> seedPath = <span class="hljs-type">Files</span>.createTempDirectory(<span class="hljs-string">"key-manager-example"</span>).resolve(<span class="hljs-type">WalletStorage</span>.<span class="hljs-type">ENCRYPTED_SEED_FILE_NAME</span>)
|
||||||
<span class="hljs-comment">// seedPath: Path = /tmp/key-manager-example5337683817818901628/encrypted-bitcoin-s-seed.json</span>
|
<span class="hljs-comment">// seedPath: Path = /tmp/key-manager-example5491934269688906291/encrypted-bitcoin-s-seed.json</span>
|
||||||
|
|
||||||
<span class="hljs-comment">//let's create a native segwit key manager</span>
|
<span class="hljs-comment">//let's create a native segwit key manager</span>
|
||||||
<span class="hljs-keyword">val</span> purpose = <span class="hljs-type">HDPurposes</span>.<span class="hljs-type">SegWit</span>
|
<span class="hljs-keyword">val</span> purpose = <span class="hljs-type">HDPurposes</span>.<span class="hljs-type">SegWit</span>
|
||||||
|
@ -110,19 +110,19 @@ generate specific kinds of addresses for wallets.</p>
|
||||||
<span class="hljs-comment">// network: RegTest.type = RegTest</span>
|
<span class="hljs-comment">// network: RegTest.type = RegTest</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> kmParams = <span class="hljs-type">KeyManagerParams</span>(seedPath, purpose, network)
|
<span class="hljs-keyword">val</span> kmParams = <span class="hljs-type">KeyManagerParams</span>(seedPath, purpose, network)
|
||||||
<span class="hljs-comment">// kmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5337683817818901628/encrypted-bitcoin-s-seed.json,m/84',RegTest)</span>
|
<span class="hljs-comment">// kmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5491934269688906291/encrypted-bitcoin-s-seed.json,m/84',RegTest)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> aesPasswordOpt = <span class="hljs-type">Some</span>(<span class="hljs-type">AesPassword</span>.fromString(<span class="hljs-string">"password"</span>))
|
<span class="hljs-keyword">val</span> aesPasswordOpt = <span class="hljs-type">Some</span>(<span class="hljs-type">AesPassword</span>.fromString(<span class="hljs-string">"password"</span>))
|
||||||
<span class="hljs-comment">// aesPasswordOpt: Some[AesPassword] = Some(Masked(AesPassword))</span>
|
<span class="hljs-comment">// aesPasswordOpt: Some[AesPassword] = Some(Masked(AesPassword))</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> km = <span class="hljs-type">BIP39KeyManager</span>.initializeWithMnemonic(aesPasswordOpt, mnemonic, <span class="hljs-type">None</span>, kmParams)
|
<span class="hljs-keyword">val</span> km = <span class="hljs-type">BIP39KeyManager</span>.initializeWithMnemonic(aesPasswordOpt, mnemonic, <span class="hljs-type">None</span>, kmParams)
|
||||||
<span class="hljs-comment">// km: Either[KeyManagerInitializeError, BIP39KeyManager] = Right(org.bitcoins.keymanager.bip39.BIP39KeyManager@21f8bea9)</span>
|
<span class="hljs-comment">// km: Either[KeyManagerInitializeError, BIP39KeyManager] = Right(org.bitcoins.keymanager.bip39.BIP39KeyManager@62043761)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> rootXPub = km.right.get.getRootXPub
|
<span class="hljs-keyword">val</span> rootXPub = km.right.get.getRootXPub
|
||||||
<span class="hljs-comment">// rootXPub: ExtPublicKey = vpub5SLqN2bLY4WeYwAYzNCdeAnPVzQLJJGKHmu7UCUJSpVv3nYVJbVPthRHqUBaXd4wZ83M2Cy63jAkCQnpfz1DU8SFnB1r8vFcsAfnKRAL9De</span>
|
<span class="hljs-comment">// rootXPub: ExtPublicKey = vpub5SLqN2bLY4WeYYBy8iYUBFgCU3y9bxhHYFSau7bXtx9TPKJTPtWeos7nPSPXdoNWAKfQcfB7Kcq8FQxZJ51nyh6VpbqsjbA3SzVvTY8x3vr</span>
|
||||||
|
|
||||||
println(rootXPub)
|
println(rootXPub)
|
||||||
<span class="hljs-comment">// vpub5SLqN2bLY4WeYwAYzNCdeAnPVzQLJJGKHmu7UCUJSpVv3nYVJbVPthRHqUBaXd4wZ83M2Cy63jAkCQnpfz1DU8SFnB1r8vFcsAfnKRAL9De</span>
|
<span class="hljs-comment">// vpub5SLqN2bLY4WeYYBy8iYUBFgCU3y9bxhHYFSau7bXtx9TPKJTPtWeos7nPSPXdoNWAKfQcfB7Kcq8FQxZJ51nyh6VpbqsjbA3SzVvTY8x3vr</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Which should print something that looks like this</p>
|
<p>Which should print something that looks like this</p>
|
||||||
<p><code>vpub5SLqN2bLY4WeXxMqwJHJFBEwxSscGB2uDUnsTS3edVjZEwTrQDFDNqoR2xLqARQPabGaXsHSTenTRcqm2EnB9MpuC4vSk3LqSgNmGGZtuq7</code></p>
|
<p><code>vpub5SLqN2bLY4WeXxMqwJHJFBEwxSscGB2uDUnsTS3edVjZEwTrQDFDNqoR2xLqARQPabGaXsHSTenTRcqm2EnB9MpuC4vSk3LqSgNmGGZtuq7</code></p>
|
||||||
|
@ -131,17 +131,17 @@ println(rootXPub)
|
||||||
again after initializing it once. You can use the same <code>mnemonic</code> for different networks, which you control <code>KeyManagerParams</code>.</p>
|
again after initializing it once. You can use the same <code>mnemonic</code> for different networks, which you control <code>KeyManagerParams</code>.</p>
|
||||||
<pre><code class="hljs css language-scala"><span class="hljs-comment">//let's create a nested segwit key manager for mainnet</span>
|
<pre><code class="hljs css language-scala"><span class="hljs-comment">//let's create a nested segwit key manager for mainnet</span>
|
||||||
<span class="hljs-keyword">val</span> mainnetKmParams = <span class="hljs-type">KeyManagerParams</span>(seedPath, <span class="hljs-type">HDPurposes</span>.<span class="hljs-type">SegWit</span>, <span class="hljs-type">MainNet</span>)
|
<span class="hljs-keyword">val</span> mainnetKmParams = <span class="hljs-type">KeyManagerParams</span>(seedPath, <span class="hljs-type">HDPurposes</span>.<span class="hljs-type">SegWit</span>, <span class="hljs-type">MainNet</span>)
|
||||||
<span class="hljs-comment">// mainnetKmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5337683817818901628/encrypted-bitcoin-s-seed.json,m/84',MainNet)</span>
|
<span class="hljs-comment">// mainnetKmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5491934269688906291/encrypted-bitcoin-s-seed.json,m/84',MainNet)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">//we do not need to all `initializeWithMnemonic()` again as we have saved the seed to dis</span>
|
<span class="hljs-comment">//we do not need to all `initializeWithMnemonic()` again as we have saved the seed to dis</span>
|
||||||
<span class="hljs-keyword">val</span> mainnetKeyManager = <span class="hljs-type">BIP39KeyManager</span>.fromMnemonic(mnemonic, mainnetKmParams, <span class="hljs-type">None</span>, <span class="hljs-type">Instant</span>.now)
|
<span class="hljs-keyword">val</span> mainnetKeyManager = <span class="hljs-type">BIP39KeyManager</span>.fromMnemonic(mnemonic, mainnetKmParams, <span class="hljs-type">None</span>, <span class="hljs-type">Instant</span>.now)
|
||||||
<span class="hljs-comment">// mainnetKeyManager: BIP39KeyManager = org.bitcoins.keymanager.bip39.BIP39KeyManager@4565f18d</span>
|
<span class="hljs-comment">// mainnetKeyManager: BIP39KeyManager = org.bitcoins.keymanager.bip39.BIP39KeyManager@2fe2cc19</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> mainnetXpub = mainnetKeyManager.getRootXPub
|
<span class="hljs-keyword">val</span> mainnetXpub = mainnetKeyManager.getRootXPub
|
||||||
<span class="hljs-comment">// mainnetXpub: ExtPublicKey = zpub6jftahH18ngZx7w2KoM8UXAQBrz84nEJxDyzbn3qxr1SGBoQKE9eNx3qvJ1vXFgdBgWa27MKtNawjZF5YmfGf5AfFXoYUZXZx4vMsipT7Gy</span>
|
<span class="hljs-comment">// mainnetXpub: ExtPublicKey = zpub6jftahH18ngZwixSU9gy1c4D9vYwNSfHChXU2hB5QyeybiZNQXAuJ7kLUGDsdRzBnt8dcZZMAGFKnZQpArfrAdpuHxda5ERzXtkW1qTz3q8</span>
|
||||||
|
|
||||||
println(mainnetXpub)
|
println(mainnetXpub)
|
||||||
<span class="hljs-comment">// zpub6jftahH18ngZx7w2KoM8UXAQBrz84nEJxDyzbn3qxr1SGBoQKE9eNx3qvJ1vXFgdBgWa27MKtNawjZF5YmfGf5AfFXoYUZXZx4vMsipT7Gy</span>
|
<span class="hljs-comment">// zpub6jftahH18ngZwixSU9gy1c4D9vYwNSfHChXU2hB5QyeybiZNQXAuJ7kLUGDsdRzBnt8dcZZMAGFKnZQpArfrAdpuHxda5ERzXtkW1qTz3q8</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Which gives us something that looks like this</p>
|
<p>Which gives us something that looks like this</p>
|
||||||
<p><code>zpub6jftahH18ngZw98KGjRo5XcxeKTQ2eztsvskb1dC9XF5TLimQquTs6Ry7nBBA425D9joXmfgJJCexmJ1u2SELJZJfRi95gcnXadLpZzYb5c</code></p>
|
<p><code>zpub6jftahH18ngZw98KGjRo5XcxeKTQ2eztsvskb1dC9XF5TLimQquTs6Ry7nBBA425D9joXmfgJJCexmJ1u2SELJZJfRi95gcnXadLpZzYb5c</code></p>
|
||||||
|
|
|
@ -77,14 +77,14 @@
|
||||||
|
|
||||||
<span class="hljs-comment">//get 256 bits of random entropy</span>
|
<span class="hljs-comment">//get 256 bits of random entropy</span>
|
||||||
<span class="hljs-keyword">val</span> entropy = <span class="hljs-type">MnemonicCode</span>.getEntropy256Bits
|
<span class="hljs-keyword">val</span> entropy = <span class="hljs-type">MnemonicCode</span>.getEntropy256Bits
|
||||||
<span class="hljs-comment">// entropy: scodec.bits.BitVector = BitVector(256 bits, 0xf55528dbf442552cbf0a1ffe15f1ad93f28301abaf6ded921d538206349296e9)</span>
|
<span class="hljs-comment">// entropy: scodec.bits.BitVector = BitVector(256 bits, 0x0df7cb843e37bb9e38af60dc64ed6f4596e0cd823d940ebff0c0dd56264f6b94)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> mnemonic = <span class="hljs-type">MnemonicCode</span>.fromEntropy(entropy)
|
<span class="hljs-keyword">val</span> mnemonic = <span class="hljs-type">MnemonicCode</span>.fromEntropy(entropy)
|
||||||
<span class="hljs-comment">// mnemonic: MnemonicCode = Masked(MnemonicCodeImpl)</span>
|
<span class="hljs-comment">// mnemonic: MnemonicCode = Masked(MnemonicCodeImpl)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">//you can print that mnemonic seed with this</span>
|
<span class="hljs-comment">//you can print that mnemonic seed with this</span>
|
||||||
println(mnemonic.words)
|
println(mnemonic.words)
|
||||||
<span class="hljs-comment">// Vector(vocal, power, dad, trigger, census, north, wire, dumb, wrap, question, hidden, child, choice, liar, push, unit, unique, movie, female, advice, globe, enable, forum, citizen)</span>
|
<span class="hljs-comment">// Vector(assume, salad, three, ladder, knife, someone, tired, ugly, symbol, cherry, forward, menu, host, grocery, angry, raw, attitude, zebra, coral, rival, give, chicken, purity, panel)</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Now that we have a <code>MnemonicCode</code> that was securely generated, we need to now create <code>KeyManagerParams</code> which tells us how to generate
|
<p>Now that we have a <code>MnemonicCode</code> that was securely generated, we need to now create <code>KeyManagerParams</code> which tells us how to generate
|
||||||
generate specific kinds of addresses for wallets.</p>
|
generate specific kinds of addresses for wallets.</p>
|
||||||
|
@ -99,7 +99,7 @@ generate specific kinds of addresses for wallets.</p>
|
||||||
<pre><code class="hljs css language-scala"><span class="hljs-comment">//this will create a temp directory with the prefix 'key-manager-example` that will</span>
|
<pre><code class="hljs css language-scala"><span class="hljs-comment">//this will create a temp directory with the prefix 'key-manager-example` that will</span>
|
||||||
<span class="hljs-comment">//have a file in it called "encrypted-bitcoin-s-seed.json"</span>
|
<span class="hljs-comment">//have a file in it called "encrypted-bitcoin-s-seed.json"</span>
|
||||||
<span class="hljs-keyword">val</span> seedPath = <span class="hljs-type">Files</span>.createTempDirectory(<span class="hljs-string">"key-manager-example"</span>).resolve(<span class="hljs-type">WalletStorage</span>.<span class="hljs-type">ENCRYPTED_SEED_FILE_NAME</span>)
|
<span class="hljs-keyword">val</span> seedPath = <span class="hljs-type">Files</span>.createTempDirectory(<span class="hljs-string">"key-manager-example"</span>).resolve(<span class="hljs-type">WalletStorage</span>.<span class="hljs-type">ENCRYPTED_SEED_FILE_NAME</span>)
|
||||||
<span class="hljs-comment">// seedPath: Path = /tmp/key-manager-example5337683817818901628/encrypted-bitcoin-s-seed.json</span>
|
<span class="hljs-comment">// seedPath: Path = /tmp/key-manager-example5491934269688906291/encrypted-bitcoin-s-seed.json</span>
|
||||||
|
|
||||||
<span class="hljs-comment">//let's create a native segwit key manager</span>
|
<span class="hljs-comment">//let's create a native segwit key manager</span>
|
||||||
<span class="hljs-keyword">val</span> purpose = <span class="hljs-type">HDPurposes</span>.<span class="hljs-type">SegWit</span>
|
<span class="hljs-keyword">val</span> purpose = <span class="hljs-type">HDPurposes</span>.<span class="hljs-type">SegWit</span>
|
||||||
|
@ -110,19 +110,19 @@ generate specific kinds of addresses for wallets.</p>
|
||||||
<span class="hljs-comment">// network: RegTest.type = RegTest</span>
|
<span class="hljs-comment">// network: RegTest.type = RegTest</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> kmParams = <span class="hljs-type">KeyManagerParams</span>(seedPath, purpose, network)
|
<span class="hljs-keyword">val</span> kmParams = <span class="hljs-type">KeyManagerParams</span>(seedPath, purpose, network)
|
||||||
<span class="hljs-comment">// kmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5337683817818901628/encrypted-bitcoin-s-seed.json,m/84',RegTest)</span>
|
<span class="hljs-comment">// kmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5491934269688906291/encrypted-bitcoin-s-seed.json,m/84',RegTest)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> aesPasswordOpt = <span class="hljs-type">Some</span>(<span class="hljs-type">AesPassword</span>.fromString(<span class="hljs-string">"password"</span>))
|
<span class="hljs-keyword">val</span> aesPasswordOpt = <span class="hljs-type">Some</span>(<span class="hljs-type">AesPassword</span>.fromString(<span class="hljs-string">"password"</span>))
|
||||||
<span class="hljs-comment">// aesPasswordOpt: Some[AesPassword] = Some(Masked(AesPassword))</span>
|
<span class="hljs-comment">// aesPasswordOpt: Some[AesPassword] = Some(Masked(AesPassword))</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> km = <span class="hljs-type">BIP39KeyManager</span>.initializeWithMnemonic(aesPasswordOpt, mnemonic, <span class="hljs-type">None</span>, kmParams)
|
<span class="hljs-keyword">val</span> km = <span class="hljs-type">BIP39KeyManager</span>.initializeWithMnemonic(aesPasswordOpt, mnemonic, <span class="hljs-type">None</span>, kmParams)
|
||||||
<span class="hljs-comment">// km: Either[KeyManagerInitializeError, BIP39KeyManager] = Right(org.bitcoins.keymanager.bip39.BIP39KeyManager@21f8bea9)</span>
|
<span class="hljs-comment">// km: Either[KeyManagerInitializeError, BIP39KeyManager] = Right(org.bitcoins.keymanager.bip39.BIP39KeyManager@62043761)</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> rootXPub = km.right.get.getRootXPub
|
<span class="hljs-keyword">val</span> rootXPub = km.right.get.getRootXPub
|
||||||
<span class="hljs-comment">// rootXPub: ExtPublicKey = vpub5SLqN2bLY4WeYwAYzNCdeAnPVzQLJJGKHmu7UCUJSpVv3nYVJbVPthRHqUBaXd4wZ83M2Cy63jAkCQnpfz1DU8SFnB1r8vFcsAfnKRAL9De</span>
|
<span class="hljs-comment">// rootXPub: ExtPublicKey = vpub5SLqN2bLY4WeYYBy8iYUBFgCU3y9bxhHYFSau7bXtx9TPKJTPtWeos7nPSPXdoNWAKfQcfB7Kcq8FQxZJ51nyh6VpbqsjbA3SzVvTY8x3vr</span>
|
||||||
|
|
||||||
println(rootXPub)
|
println(rootXPub)
|
||||||
<span class="hljs-comment">// vpub5SLqN2bLY4WeYwAYzNCdeAnPVzQLJJGKHmu7UCUJSpVv3nYVJbVPthRHqUBaXd4wZ83M2Cy63jAkCQnpfz1DU8SFnB1r8vFcsAfnKRAL9De</span>
|
<span class="hljs-comment">// vpub5SLqN2bLY4WeYYBy8iYUBFgCU3y9bxhHYFSau7bXtx9TPKJTPtWeos7nPSPXdoNWAKfQcfB7Kcq8FQxZJ51nyh6VpbqsjbA3SzVvTY8x3vr</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Which should print something that looks like this</p>
|
<p>Which should print something that looks like this</p>
|
||||||
<p><code>vpub5SLqN2bLY4WeXxMqwJHJFBEwxSscGB2uDUnsTS3edVjZEwTrQDFDNqoR2xLqARQPabGaXsHSTenTRcqm2EnB9MpuC4vSk3LqSgNmGGZtuq7</code></p>
|
<p><code>vpub5SLqN2bLY4WeXxMqwJHJFBEwxSscGB2uDUnsTS3edVjZEwTrQDFDNqoR2xLqARQPabGaXsHSTenTRcqm2EnB9MpuC4vSk3LqSgNmGGZtuq7</code></p>
|
||||||
|
@ -131,17 +131,17 @@ println(rootXPub)
|
||||||
again after initializing it once. You can use the same <code>mnemonic</code> for different networks, which you control <code>KeyManagerParams</code>.</p>
|
again after initializing it once. You can use the same <code>mnemonic</code> for different networks, which you control <code>KeyManagerParams</code>.</p>
|
||||||
<pre><code class="hljs css language-scala"><span class="hljs-comment">//let's create a nested segwit key manager for mainnet</span>
|
<pre><code class="hljs css language-scala"><span class="hljs-comment">//let's create a nested segwit key manager for mainnet</span>
|
||||||
<span class="hljs-keyword">val</span> mainnetKmParams = <span class="hljs-type">KeyManagerParams</span>(seedPath, <span class="hljs-type">HDPurposes</span>.<span class="hljs-type">SegWit</span>, <span class="hljs-type">MainNet</span>)
|
<span class="hljs-keyword">val</span> mainnetKmParams = <span class="hljs-type">KeyManagerParams</span>(seedPath, <span class="hljs-type">HDPurposes</span>.<span class="hljs-type">SegWit</span>, <span class="hljs-type">MainNet</span>)
|
||||||
<span class="hljs-comment">// mainnetKmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5337683817818901628/encrypted-bitcoin-s-seed.json,m/84',MainNet)</span>
|
<span class="hljs-comment">// mainnetKmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5491934269688906291/encrypted-bitcoin-s-seed.json,m/84',MainNet)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">//we do not need to all `initializeWithMnemonic()` again as we have saved the seed to dis</span>
|
<span class="hljs-comment">//we do not need to all `initializeWithMnemonic()` again as we have saved the seed to dis</span>
|
||||||
<span class="hljs-keyword">val</span> mainnetKeyManager = <span class="hljs-type">BIP39KeyManager</span>.fromMnemonic(mnemonic, mainnetKmParams, <span class="hljs-type">None</span>, <span class="hljs-type">Instant</span>.now)
|
<span class="hljs-keyword">val</span> mainnetKeyManager = <span class="hljs-type">BIP39KeyManager</span>.fromMnemonic(mnemonic, mainnetKmParams, <span class="hljs-type">None</span>, <span class="hljs-type">Instant</span>.now)
|
||||||
<span class="hljs-comment">// mainnetKeyManager: BIP39KeyManager = org.bitcoins.keymanager.bip39.BIP39KeyManager@4565f18d</span>
|
<span class="hljs-comment">// mainnetKeyManager: BIP39KeyManager = org.bitcoins.keymanager.bip39.BIP39KeyManager@2fe2cc19</span>
|
||||||
|
|
||||||
<span class="hljs-keyword">val</span> mainnetXpub = mainnetKeyManager.getRootXPub
|
<span class="hljs-keyword">val</span> mainnetXpub = mainnetKeyManager.getRootXPub
|
||||||
<span class="hljs-comment">// mainnetXpub: ExtPublicKey = zpub6jftahH18ngZx7w2KoM8UXAQBrz84nEJxDyzbn3qxr1SGBoQKE9eNx3qvJ1vXFgdBgWa27MKtNawjZF5YmfGf5AfFXoYUZXZx4vMsipT7Gy</span>
|
<span class="hljs-comment">// mainnetXpub: ExtPublicKey = zpub6jftahH18ngZwixSU9gy1c4D9vYwNSfHChXU2hB5QyeybiZNQXAuJ7kLUGDsdRzBnt8dcZZMAGFKnZQpArfrAdpuHxda5ERzXtkW1qTz3q8</span>
|
||||||
|
|
||||||
println(mainnetXpub)
|
println(mainnetXpub)
|
||||||
<span class="hljs-comment">// zpub6jftahH18ngZx7w2KoM8UXAQBrz84nEJxDyzbn3qxr1SGBoQKE9eNx3qvJ1vXFgdBgWa27MKtNawjZF5YmfGf5AfFXoYUZXZx4vMsipT7Gy</span>
|
<span class="hljs-comment">// zpub6jftahH18ngZwixSU9gy1c4D9vYwNSfHChXU2hB5QyeybiZNQXAuJ7kLUGDsdRzBnt8dcZZMAGFKnZQpArfrAdpuHxda5ERzXtkW1qTz3q8</span>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Which gives us something that looks like this</p>
|
<p>Which gives us something that looks like this</p>
|
||||||
<p><code>zpub6jftahH18ngZw98KGjRo5XcxeKTQ2eztsvskb1dC9XF5TLimQquTs6Ry7nBBA425D9joXmfgJJCexmJ1u2SELJZJfRi95gcnXadLpZzYb5c</code></p>
|
<p><code>zpub6jftahH18ngZw98KGjRo5XcxeKTQ2eztsvskb1dC9XF5TLimQquTs6Ry7nBBA425D9joXmfgJJCexmJ1u2SELJZJfRi95gcnXadLpZzYb5c</code></p>
|
||||||
|
|
|
@ -115,13 +115,13 @@ println(<span class="hljs-string">s"Verified with NativeSecp256k1 again=<span cl
|
||||||
<span class="hljs-comment">// privKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
<span class="hljs-comment">// privKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||||
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
||||||
<span class="hljs-keyword">val</span> publicKey = privKey.publicKey
|
<span class="hljs-keyword">val</span> publicKey = privKey.publicKey
|
||||||
<span class="hljs-comment">// publicKey: ECPublicKey = ECPublicKey(03a62526569e08ccf238d7b92612d91459324dd1807d43252bc10f6027f125aa3d)</span>
|
<span class="hljs-comment">// publicKey: ECPublicKey = ECPublicKey(037d7747bea9f05826ee635c99f8ed5cef40eac3f2c2fb35b02e3100ea209c7edf)</span>
|
||||||
<span class="hljs-keyword">val</span> dataToSign = <span class="hljs-type">DoubleSha256Digest</span>.empty
|
<span class="hljs-keyword">val</span> dataToSign = <span class="hljs-type">DoubleSha256Digest</span>.empty
|
||||||
<span class="hljs-comment">// dataToSign: DoubleSha256Digest = DoubleSha256Digest(0000000000000000000000000000000000000000000000000000000000000000)</span>
|
<span class="hljs-comment">// dataToSign: DoubleSha256Digest = DoubleSha256Digest(0000000000000000000000000000000000000000000000000000000000000000)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
||||||
<span class="hljs-keyword">val</span> signature = privKey.sign(dataToSign.bytes)
|
<span class="hljs-keyword">val</span> signature = privKey.sign(dataToSign.bytes)
|
||||||
<span class="hljs-comment">// signature: ECDigitalSignature = ECDigitalSignature(30450221008333591b730477af909579f2ab1fe9eedbe93093529ac4337ebaca3466a0697302200d50d3b2ec86ae1673d7cce6ecb90ca85261cec23455749f8f3a1c01a48057de)</span>
|
<span class="hljs-comment">// signature: ECDigitalSignature = ECDigitalSignature(304402204d48e192a206e040edce352b260d1f7b2252edd72c7c1840b611c6ee880a580e02203bb860d08e43f2a8d257589bc0a1242721489feb17619ffe2c5f67a3418d8f28)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
||||||
<span class="hljs-keyword">val</span> verified = publicKey.verify(dataToSign.bytes, signature)
|
<span class="hljs-keyword">val</span> verified = publicKey.verify(dataToSign.bytes, signature)
|
||||||
|
|
|
@ -115,13 +115,13 @@ println(<span class="hljs-string">s"Verified with NativeSecp256k1 again=<span cl
|
||||||
<span class="hljs-comment">// privKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
<span class="hljs-comment">// privKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||||
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
||||||
<span class="hljs-keyword">val</span> publicKey = privKey.publicKey
|
<span class="hljs-keyword">val</span> publicKey = privKey.publicKey
|
||||||
<span class="hljs-comment">// publicKey: ECPublicKey = ECPublicKey(03a62526569e08ccf238d7b92612d91459324dd1807d43252bc10f6027f125aa3d)</span>
|
<span class="hljs-comment">// publicKey: ECPublicKey = ECPublicKey(037d7747bea9f05826ee635c99f8ed5cef40eac3f2c2fb35b02e3100ea209c7edf)</span>
|
||||||
<span class="hljs-keyword">val</span> dataToSign = <span class="hljs-type">DoubleSha256Digest</span>.empty
|
<span class="hljs-keyword">val</span> dataToSign = <span class="hljs-type">DoubleSha256Digest</span>.empty
|
||||||
<span class="hljs-comment">// dataToSign: DoubleSha256Digest = DoubleSha256Digest(0000000000000000000000000000000000000000000000000000000000000000)</span>
|
<span class="hljs-comment">// dataToSign: DoubleSha256Digest = DoubleSha256Digest(0000000000000000000000000000000000000000000000000000000000000000)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
||||||
<span class="hljs-keyword">val</span> signature = privKey.sign(dataToSign.bytes)
|
<span class="hljs-keyword">val</span> signature = privKey.sign(dataToSign.bytes)
|
||||||
<span class="hljs-comment">// signature: ECDigitalSignature = ECDigitalSignature(30450221008333591b730477af909579f2ab1fe9eedbe93093529ac4337ebaca3466a0697302200d50d3b2ec86ae1673d7cce6ecb90ca85261cec23455749f8f3a1c01a48057de)</span>
|
<span class="hljs-comment">// signature: ECDigitalSignature = ECDigitalSignature(304402204d48e192a206e040edce352b260d1f7b2252edd72c7c1840b611c6ee880a580e02203bb860d08e43f2a8d257589bc0a1242721489feb17619ffe2c5f67a3418d8f28)</span>
|
||||||
|
|
||||||
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
||||||
<span class="hljs-keyword">val</span> verified = publicKey.verify(dataToSign.bytes, signature)
|
<span class="hljs-keyword">val</span> verified = publicKey.verify(dataToSign.bytes, signature)
|
||||||
|
|
Loading…
Add table
Reference in a new issue