mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-03-13 11:35:40 +01:00
parent
0f2ff18836
commit
8577f60e36
22 changed files with 117 additions and 113 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -18,7 +18,7 @@ input is signed for this tx
|
|||
purpose of this transaction is a base transaction that can be used to
|
||||
manipulate the scriptSignature to be whatever we need it to be</p><div class="fullcomment"><div class="comment cmt"><p>This transaction has one input which is set to EmptyTransactionInput The
|
||||
purpose of this transaction is a base transaction that can be used to
|
||||
manipulate the scriptSignature to be whatever we need it to be</p></div><dl class="attributes block"><dt>Definition Classes</dt><dd><a href="TransactionTestUtil.html" name="org.bitcoins.testkitcore.util.TransactionTestUtil" id="org.bitcoins.testkitcore.util.TransactionTestUtil" class="extype">TransactionTestUtil</a></dd></dl></div></li><li class="indented0 " name="scala.AnyRef#toString" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="toString():String" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil$.html#toString():String" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">toString</span><span class="params">()</span><span class="result">: <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#java.lang.String" name="java.lang.String" id="java.lang.String" class="extype">String</a></span></span><div class="fullcomment"><dl class="attributes block"><dt>Definition Classes</dt><dd>AnyRef → Any</dd></dl></div></li><li class="indented0 " name="org.bitcoins.testkitcore.util.TransactionTestUtil#transactionWithNonStrictDerSignature" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="transactionWithNonStrictDerSignature:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.number.UInt32)" class="anchorToMember"></a><a id="transactionWithNonStrictDerSignature:(Transaction,UInt32)" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil$.html#transactionWithNonStrictDerSignature:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.number.UInt32)" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">transactionWithNonStrictDerSignature</span><span class="result">: (<a href="../../core/protocol/transaction/Transaction.html" name="org.bitcoins.core.protocol.transaction.Transaction" id="org.bitcoins.core.protocol.transaction.Transaction" class="extype">Transaction</a>, <a href="../../core/number/UInt32.html" name="org.bitcoins.core.number.UInt32" id="org.bitcoins.core.number.UInt32" class="extype">UInt32</a>)</span></span><p class="shortcomment cmt">Builds a transaction with a non strict der encoded signature</p><div class="fullcomment"><div class="comment cmt"><p>Builds a transaction with a non strict der encoded signature</p></div><dl class="paramcmts block"><dt>returns</dt><dd class="cmt"><p>
|
||||
manipulate the scriptSignature to be whatever we need it to be</p></div><dl class="attributes block"><dt>Definition Classes</dt><dd><a href="TransactionTestUtil.html" name="org.bitcoins.testkitcore.util.TransactionTestUtil" id="org.bitcoins.testkitcore.util.TransactionTestUtil" class="extype">TransactionTestUtil</a></dd></dl></div></li><li class="indented0 " name="org.bitcoins.testkitcore.util.TransactionTestUtil#testWitnessTransaction" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="testWitnessTransaction:org.bitcoins.core.protocol.transaction.WitnessTransaction" class="anchorToMember"></a><a id="testWitnessTransaction:WitnessTransaction" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil$.html#testWitnessTransaction:org.bitcoins.core.protocol.transaction.WitnessTransaction" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">testWitnessTransaction</span><span class="result">: <a href="../../core/protocol/transaction/WitnessTransaction.html" name="org.bitcoins.core.protocol.transaction.WitnessTransaction" id="org.bitcoins.core.protocol.transaction.WitnessTransaction" class="extype">WitnessTransaction</a></span></span><div class="fullcomment"><dl class="attributes block"><dt>Definition Classes</dt><dd><a href="TransactionTestUtil.html" name="org.bitcoins.testkitcore.util.TransactionTestUtil" id="org.bitcoins.testkitcore.util.TransactionTestUtil" class="extype">TransactionTestUtil</a></dd></dl></div></li><li class="indented0 " name="scala.AnyRef#toString" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="toString():String" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil$.html#toString():String" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">toString</span><span class="params">()</span><span class="result">: <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#java.lang.String" name="java.lang.String" id="java.lang.String" class="extype">String</a></span></span><div class="fullcomment"><dl class="attributes block"><dt>Definition Classes</dt><dd>AnyRef → Any</dd></dl></div></li><li class="indented0 " name="org.bitcoins.testkitcore.util.TransactionTestUtil#transactionWithNonStrictDerSignature" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="transactionWithNonStrictDerSignature:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.number.UInt32)" class="anchorToMember"></a><a id="transactionWithNonStrictDerSignature:(Transaction,UInt32)" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil$.html#transactionWithNonStrictDerSignature:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.number.UInt32)" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">transactionWithNonStrictDerSignature</span><span class="result">: (<a href="../../core/protocol/transaction/Transaction.html" name="org.bitcoins.core.protocol.transaction.Transaction" id="org.bitcoins.core.protocol.transaction.Transaction" class="extype">Transaction</a>, <a href="../../core/number/UInt32.html" name="org.bitcoins.core.number.UInt32" id="org.bitcoins.core.number.UInt32" class="extype">UInt32</a>)</span></span><p class="shortcomment cmt">Builds a transaction with a non strict der encoded signature</p><div class="fullcomment"><div class="comment cmt"><p>Builds a transaction with a non strict der encoded signature</p></div><dl class="paramcmts block"><dt>returns</dt><dd class="cmt"><p>
|
||||
the transaction and the inputIndex of the non strict der encoded
|
||||
signature</p></dd></dl><dl class="attributes block"><dt>Definition Classes</dt><dd><a href="TransactionTestUtil.html" name="org.bitcoins.testkitcore.util.TransactionTestUtil" id="org.bitcoins.testkitcore.util.TransactionTestUtil" class="extype">TransactionTestUtil</a></dd></dl></div></li><li class="indented0 " name="org.bitcoins.testkitcore.util.TransactionTestUtil#transactionWithSpendingInputAndCreditingOutput" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="transactionWithSpendingInputAndCreditingOutput:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.protocol.transaction.TransactionInput,org.bitcoins.core.number.UInt32,org.bitcoins.core.protocol.transaction.TransactionOutput)" class="anchorToMember"></a><a id="transactionWithSpendingInputAndCreditingOutput:(Transaction,TransactionInput,UInt32,TransactionOutput)" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil$.html#transactionWithSpendingInputAndCreditingOutput:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.protocol.transaction.TransactionInput,org.bitcoins.core.number.UInt32,org.bitcoins.core.protocol.transaction.TransactionOutput)" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">transactionWithSpendingInputAndCreditingOutput</span><span class="result">: (<a href="../../core/protocol/transaction/Transaction.html" name="org.bitcoins.core.protocol.transaction.Transaction" id="org.bitcoins.core.protocol.transaction.Transaction" class="extype">Transaction</a>, <a href="../../core/protocol/transaction/TransactionInput.html" name="org.bitcoins.core.protocol.transaction.TransactionInput" id="org.bitcoins.core.protocol.transaction.TransactionInput" class="extype">TransactionInput</a>, <a href="../../core/number/UInt32.html" name="org.bitcoins.core.number.UInt32" id="org.bitcoins.core.number.UInt32" class="extype">UInt32</a>, <a href="../../core/protocol/transaction/TransactionOutput.html" name="org.bitcoins.core.protocol.transaction.TransactionOutput" id="org.bitcoins.core.protocol.transaction.TransactionOutput" class="extype">TransactionOutput</a>)</span></span><p class="shortcomment cmt">Returns a transaction, the input that is spending the output, and the
|
||||
inputIndex inside of the tx</p><div class="fullcomment"><div class="comment cmt"><p>Returns a transaction, the input that is spending the output, and the
|
||||
|
|
|
@ -12,7 +12,7 @@ input is signed for this tx
|
|||
input is signed for this tx
|
||||
</p></li><li class="indented0 " name="org.bitcoins.testkitcore.util.TransactionTestUtil#spendingInfoDb" group="Ungrouped" fullComment="no" data-isabs="false" visbl="pub"><a id="spendingInfoDb:org.bitcoins.core.api.wallet.db.SegwitV0SpendingInfo" class="anchorToMember"></a><a id="spendingInfoDb:SegwitV0SpendingInfo" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#spendingInfoDb:org.bitcoins.core.api.wallet.db.SegwitV0SpendingInfo" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">val</span></span> <span class="symbol"><span class="name">spendingInfoDb</span><span class="result">: <a href="../../core/api/wallet/db/SegwitV0SpendingInfo.html" name="org.bitcoins.core.api.wallet.db.SegwitV0SpendingInfo" id="org.bitcoins.core.api.wallet.db.SegwitV0SpendingInfo" class="extype">SegwitV0SpendingInfo</a></span></span></li><li class="indented0 " name="scala.AnyRef#synchronized" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="synchronized[T0](x$1:=>T0):T0" class="anchorToMember"></a><a id="synchronized[T0](=>T0):T0" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#synchronized[T0](x$1:=>T0):T0" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier">final </span> <span class="kind">def</span></span> <span class="symbol"><span class="name">synchronized</span><span class="tparams">[<span name="T0">T0</span>]</span><span class="params">(<span name="arg0">arg0: => <span name="java.lang.AnyRef.synchronized.T0" class="extype">T0</span></span>)</span><span class="result">: <span name="java.lang.AnyRef.synchronized.T0" class="extype">T0</span></span></span><div class="fullcomment"><dl class="attributes block"><dt>Definition Classes</dt><dd>AnyRef</dd></dl></div></li><li class="indented0 " name="org.bitcoins.testkitcore.util.TransactionTestUtil#testTransaction" group="Ungrouped" fullComment="no" data-isabs="false" visbl="pub"><a id="testTransaction:org.bitcoins.core.protocol.transaction.Transaction" class="anchorToMember"></a><a id="testTransaction:Transaction" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#testTransaction:org.bitcoins.core.protocol.transaction.Transaction" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">testTransaction</span><span class="result">: <a href="../../core/protocol/transaction/Transaction.html" name="org.bitcoins.core.protocol.transaction.Transaction" id="org.bitcoins.core.protocol.transaction.Transaction" class="extype">Transaction</a></span></span><p class="shortcomment cmt">This transaction has one input which is set to EmptyTransactionInput The
|
||||
purpose of this transaction is a base transaction that can be used to
|
||||
manipulate the scriptSignature to be whatever we need it to be</p></li><li class="indented0 " name="scala.AnyRef#toString" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="toString():String" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#toString():String" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">toString</span><span class="params">()</span><span class="result">: <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#java.lang.String" name="java.lang.String" id="java.lang.String" class="extype">String</a></span></span><div class="fullcomment"><dl class="attributes block"><dt>Definition Classes</dt><dd>AnyRef → Any</dd></dl></div></li><li class="indented0 " name="org.bitcoins.testkitcore.util.TransactionTestUtil#transactionWithNonStrictDerSignature" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="transactionWithNonStrictDerSignature:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.number.UInt32)" class="anchorToMember"></a><a id="transactionWithNonStrictDerSignature:(Transaction,UInt32)" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#transactionWithNonStrictDerSignature:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.number.UInt32)" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">transactionWithNonStrictDerSignature</span><span class="result">: (<a href="../../core/protocol/transaction/Transaction.html" name="org.bitcoins.core.protocol.transaction.Transaction" id="org.bitcoins.core.protocol.transaction.Transaction" class="extype">Transaction</a>, <a href="../../core/number/UInt32.html" name="org.bitcoins.core.number.UInt32" id="org.bitcoins.core.number.UInt32" class="extype">UInt32</a>)</span></span><p class="shortcomment cmt">Builds a transaction with a non strict der encoded signature</p><div class="fullcomment"><div class="comment cmt"><p>Builds a transaction with a non strict der encoded signature</p></div><dl class="paramcmts block"><dt>returns</dt><dd class="cmt"><p>
|
||||
manipulate the scriptSignature to be whatever we need it to be</p></li><li class="indented0 " name="org.bitcoins.testkitcore.util.TransactionTestUtil#testWitnessTransaction" group="Ungrouped" fullComment="no" data-isabs="false" visbl="pub"><a id="testWitnessTransaction:org.bitcoins.core.protocol.transaction.WitnessTransaction" class="anchorToMember"></a><a id="testWitnessTransaction:WitnessTransaction" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#testWitnessTransaction:org.bitcoins.core.protocol.transaction.WitnessTransaction" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">testWitnessTransaction</span><span class="result">: <a href="../../core/protocol/transaction/WitnessTransaction.html" name="org.bitcoins.core.protocol.transaction.WitnessTransaction" id="org.bitcoins.core.protocol.transaction.WitnessTransaction" class="extype">WitnessTransaction</a></span></span></li><li class="indented0 " name="scala.AnyRef#toString" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="toString():String" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#toString():String" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">toString</span><span class="params">()</span><span class="result">: <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#java.lang.String" name="java.lang.String" id="java.lang.String" class="extype">String</a></span></span><div class="fullcomment"><dl class="attributes block"><dt>Definition Classes</dt><dd>AnyRef → Any</dd></dl></div></li><li class="indented0 " name="org.bitcoins.testkitcore.util.TransactionTestUtil#transactionWithNonStrictDerSignature" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="transactionWithNonStrictDerSignature:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.number.UInt32)" class="anchorToMember"></a><a id="transactionWithNonStrictDerSignature:(Transaction,UInt32)" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#transactionWithNonStrictDerSignature:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.number.UInt32)" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">transactionWithNonStrictDerSignature</span><span class="result">: (<a href="../../core/protocol/transaction/Transaction.html" name="org.bitcoins.core.protocol.transaction.Transaction" id="org.bitcoins.core.protocol.transaction.Transaction" class="extype">Transaction</a>, <a href="../../core/number/UInt32.html" name="org.bitcoins.core.number.UInt32" id="org.bitcoins.core.number.UInt32" class="extype">UInt32</a>)</span></span><p class="shortcomment cmt">Builds a transaction with a non strict der encoded signature</p><div class="fullcomment"><div class="comment cmt"><p>Builds a transaction with a non strict der encoded signature</p></div><dl class="paramcmts block"><dt>returns</dt><dd class="cmt"><p>
|
||||
the transaction and the inputIndex of the non strict der encoded
|
||||
signature</p></dd></dl></div></li><li class="indented0 " name="org.bitcoins.testkitcore.util.TransactionTestUtil#transactionWithSpendingInputAndCreditingOutput" group="Ungrouped" fullComment="no" data-isabs="false" visbl="pub"><a id="transactionWithSpendingInputAndCreditingOutput:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.protocol.transaction.TransactionInput,org.bitcoins.core.number.UInt32,org.bitcoins.core.protocol.transaction.TransactionOutput)" class="anchorToMember"></a><a id="transactionWithSpendingInputAndCreditingOutput:(Transaction,TransactionInput,UInt32,TransactionOutput)" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#transactionWithSpendingInputAndCreditingOutput:(org.bitcoins.core.protocol.transaction.Transaction,org.bitcoins.core.protocol.transaction.TransactionInput,org.bitcoins.core.number.UInt32,org.bitcoins.core.protocol.transaction.TransactionOutput)" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier"></span> <span class="kind">def</span></span> <span class="symbol"><span class="name">transactionWithSpendingInputAndCreditingOutput</span><span class="result">: (<a href="../../core/protocol/transaction/Transaction.html" name="org.bitcoins.core.protocol.transaction.Transaction" id="org.bitcoins.core.protocol.transaction.Transaction" class="extype">Transaction</a>, <a href="../../core/protocol/transaction/TransactionInput.html" name="org.bitcoins.core.protocol.transaction.TransactionInput" id="org.bitcoins.core.protocol.transaction.TransactionInput" class="extype">TransactionInput</a>, <a href="../../core/number/UInt32.html" name="org.bitcoins.core.number.UInt32" id="org.bitcoins.core.number.UInt32" class="extype">UInt32</a>, <a href="../../core/protocol/transaction/TransactionOutput.html" name="org.bitcoins.core.protocol.transaction.TransactionOutput" id="org.bitcoins.core.protocol.transaction.TransactionOutput" class="extype">TransactionOutput</a>)</span></span><p class="shortcomment cmt">Returns a transaction, the input that is spending the output, and the
|
||||
inputIndex inside of the tx</p></li><li class="indented0 " name="scala.AnyRef#wait" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="wait():Unit" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#wait():Unit" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier">final </span> <span class="kind">def</span></span> <span class="symbol"><span class="name">wait</span><span class="params">()</span><span class="result">: <a href="https://www.scala-lang.org/api/2.13.16/scala/Unit.html#scala.Unit" name="scala.Unit" id="scala.Unit" class="extype">Unit</a></span></span><div class="fullcomment"><dl class="attributes block"><dt>Definition Classes</dt><dd>AnyRef</dd><dt>Annotations</dt><dd><span class="name">@throws</span><span class="args">(<span><span class="defval">classOf[java.lang.InterruptedException]</span></span>)</span> </dd></dl></div></li><li class="indented0 " name="scala.AnyRef#wait" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="wait(x$1:Long,x$2:Int):Unit" class="anchorToMember"></a><a id="wait(Long,Int):Unit" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#wait(x$1:Long,x$2:Int):Unit" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier">final </span> <span class="kind">def</span></span> <span class="symbol"><span class="name">wait</span><span class="params">(<span name="arg0">arg0: <a href="https://www.scala-lang.org/api/2.13.16/scala/Long.html#scala.Long" name="scala.Long" id="scala.Long" class="extype">Long</a></span>, <span name="arg1">arg1: <a href="https://www.scala-lang.org/api/2.13.16/scala/Int.html#scala.Int" name="scala.Int" id="scala.Int" class="extype">Int</a></span>)</span><span class="result">: <a href="https://www.scala-lang.org/api/2.13.16/scala/Unit.html#scala.Unit" name="scala.Unit" id="scala.Unit" class="extype">Unit</a></span></span><div class="fullcomment"><dl class="attributes block"><dt>Definition Classes</dt><dd>AnyRef</dd><dt>Annotations</dt><dd><span class="name">@throws</span><span class="args">(<span><span class="defval">classOf[java.lang.InterruptedException]</span></span>)</span> </dd></dl></div></li><li class="indented0 " name="scala.AnyRef#wait" group="Ungrouped" fullComment="yes" data-isabs="false" visbl="pub"><a id="wait(x$1:Long):Unit" class="anchorToMember"></a><a id="wait(Long):Unit" class="anchorToMember"></a> <span class="permalink"><a href="../../../../org/bitcoins/testkitcore/util/TransactionTestUtil.html#wait(x$1:Long):Unit" title="Permalink"><i class="material-icons"></i></a></span> <span class="modifier_kind"><span class="modifier">final </span> <span class="kind">def</span></span> <span class="symbol"><span class="name">wait</span><span class="params">(<span name="arg0">arg0: <a href="https://www.scala-lang.org/api/2.13.16/scala/Long.html#scala.Long" name="scala.Long" id="scala.Long" class="extype">Long</a></span>)</span><span class="result">: <a href="https://www.scala-lang.org/api/2.13.16/scala/Unit.html#scala.Unit" name="scala.Unit" id="scala.Unit" class="extype">Unit</a></span></span><div class="fullcomment"><dl class="attributes block"><dt>Definition Classes</dt><dd>AnyRef</dd><dt>Annotations</dt><dd><span class="name">@throws</span><span class="args">(<span><span class="defval">classOf[java.lang.InterruptedException]</span></span>)</span> <span class="name">@native</span><span class="args">()</span> </dd></dl></div></li></ol></div></div><div id="inheritedMembers"><div name="scala.AnyRef" class="parent"><h3>Inherited from <a href="../../../../scala/index.html#AnyRef=Object" name="scala.AnyRef" id="scala.AnyRef" class="extmbr">AnyRef</a></h3></div><div name="scala.Any" class="parent"><h3>Inherited from <a href="https://www.scala-lang.org/api/2.13.16/scala/Any.html#scala.Any" name="scala.Any" id="scala.Any" class="extype">Any</a></h3></div></div><div id="groupedMembers"><div name="Ungrouped" class="group"><h3>Ungrouped</h3></div></div></div><div id="tooltip"></div><div id="footer"></div></body></div></div></div></body></html>
|
||||
|
|
|
@ -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-comment">// privkey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||
<span class="hljs-keyword">val</span> pubkey = privkey.publicKey
|
||||
<span class="hljs-comment">// pubkey: org.bitcoins.crypto.ECPublicKey = ECPublicKey(0323506a12c98871cc78728674c039913addddd288875544ec1f4b97365ecd2e2d)</span>
|
||||
<span class="hljs-comment">// pubkey: org.bitcoins.crypto.ECPublicKey = ECPublicKey(02640cbbac6ddf5648a819561f7cbe61447d588d645ea6ef74b40f115880ec871c)</span>
|
||||
|
||||
<span class="hljs-keyword">val</span> segwitAddress = {
|
||||
<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-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
||||
}
|
||||
<span class="hljs-comment">// segwitAddress: Bech32Address = tb1qkmzug0r98qcey5r6c8wg2fvy2e8jftg2ne7wux</span>
|
||||
<span class="hljs-comment">// segwitAddress: Bech32Address = tb1qhzahakjacu4f7jpjdk7xtxfkkxca6nqdygf2ne</span>
|
||||
|
||||
println(segwitAddress.toString)
|
||||
<span class="hljs-comment">// tb1qkmzug0r98qcey5r6c8wg2fvy2e8jftg2ne7wux</span>
|
||||
<span class="hljs-comment">// tb1qhzahakjacu4f7jpjdk7xtxfkkxca6nqdygf2ne</span>
|
||||
</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>
|
||||
<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>
|
||||
<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-comment">// legacyAddress: P2PKHAddress = mxBNC2ZU6aJXwJ6R3n61jtoR5ckTAmMrFJ</span>
|
||||
<span class="hljs-comment">// legacyAddress: P2PKHAddress = mxMjEmVU4P9YkzWEMqqFcMkzaK1Epsnsb6</span>
|
||||
|
||||
println(legacyAddress.toString)
|
||||
<span class="hljs-comment">// mxBNC2ZU6aJXwJ6R3n61jtoR5ckTAmMrFJ</span>
|
||||
<span class="hljs-comment">// mxMjEmVU4P9YkzWEMqqFcMkzaK1Epsnsb6</span>
|
||||
</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 © 2025 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) {
|
||||
|
|
|
@ -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-comment">// privkey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||
<span class="hljs-keyword">val</span> pubkey = privkey.publicKey
|
||||
<span class="hljs-comment">// pubkey: org.bitcoins.crypto.ECPublicKey = ECPublicKey(0323506a12c98871cc78728674c039913addddd288875544ec1f4b97365ecd2e2d)</span>
|
||||
<span class="hljs-comment">// pubkey: org.bitcoins.crypto.ECPublicKey = ECPublicKey(02640cbbac6ddf5648a819561f7cbe61447d588d645ea6ef74b40f115880ec871c)</span>
|
||||
|
||||
<span class="hljs-keyword">val</span> segwitAddress = {
|
||||
<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-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
||||
}
|
||||
<span class="hljs-comment">// segwitAddress: Bech32Address = tb1qkmzug0r98qcey5r6c8wg2fvy2e8jftg2ne7wux</span>
|
||||
<span class="hljs-comment">// segwitAddress: Bech32Address = tb1qhzahakjacu4f7jpjdk7xtxfkkxca6nqdygf2ne</span>
|
||||
|
||||
println(segwitAddress.toString)
|
||||
<span class="hljs-comment">// tb1qkmzug0r98qcey5r6c8wg2fvy2e8jftg2ne7wux</span>
|
||||
<span class="hljs-comment">// tb1qhzahakjacu4f7jpjdk7xtxfkkxca6nqdygf2ne</span>
|
||||
</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>
|
||||
<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>
|
||||
<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-comment">// legacyAddress: P2PKHAddress = mxBNC2ZU6aJXwJ6R3n61jtoR5ckTAmMrFJ</span>
|
||||
<span class="hljs-comment">// legacyAddress: P2PKHAddress = mxMjEmVU4P9YkzWEMqqFcMkzaK1Epsnsb6</span>
|
||||
|
||||
println(legacyAddress.toString)
|
||||
<span class="hljs-comment">// mxBNC2ZU6aJXwJ6R3n61jtoR5ckTAmMrFJ</span>
|
||||
<span class="hljs-comment">// mxMjEmVU4P9YkzWEMqqFcMkzaK1Epsnsb6</span>
|
||||
</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 © 2025 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) {
|
||||
|
|
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">// 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-comment">// entropy: BitVector = BitVector(256 bits, 0x397437571f8c31b87ed98ca4476944688881533d534aa2ffb86e68cc430e2cd9)</span>
|
||||
<span class="hljs-comment">// entropy: BitVector = BitVector(256 bits, 0x943aeafb2080500250d5c192bc6326d8e5da89dc5ceaa03433735e58369bc8dc)</span>
|
||||
|
||||
<span class="hljs-keyword">val</span> mnemonicCode = <span class="hljs-type">MnemonicCode</span>.fromEntropy(entropy)
|
||||
<span class="hljs-comment">// mnemonicCode: MnemonicCode = Masked(MnemonicCodeImpl)</span>
|
||||
|
||||
mnemonicCode.words <span class="hljs-comment">// the phrase the user should write down</span>
|
||||
<span class="hljs-comment">// res0: Vector[String] = Vector(defense, payment, still, disease, seek, switch, window, cover, picture, deputy, extra, speed, marine, praise, vocal, harsh, pepper, worry, breeze, spice, service, mandate, recall, cube)</span>
|
||||
<span class="hljs-comment">// res0: Vector[String] = Vector(neither, struggle, salute, donate, agree, abuse, drive, return, naive, toast, situate, range, frozen, eager, imitate, outer, parent, pave, system, royal, lock, evil, casino, lizard)</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>
|
||||
|
@ -108,7 +108,7 @@ mnemonicCode.words <span class="hljs-comment">// the phrase the user should writ
|
|||
bip39Seed)
|
||||
<span class="hljs-comment">// xpriv: ExtPrivateKey = Masked(ExtPrivateKeyImpl)</span>
|
||||
<span class="hljs-keyword">val</span> xpub = xpriv.extPublicKey
|
||||
<span class="hljs-comment">// xpub: ExtPublicKey = zpub6jftahH18ngZyV6LQVzBcwoXTujvoQfFpV3dZPZEWrm7n3RyiZ4AvmMpUUfmJ8mHzNAbbEcu3FAu4mQEjNd55j5GBMBxjEgdnyiXVHRJqRu</span>
|
||||
<span class="hljs-comment">// xpub: ExtPublicKey = zpub6jftahH18ngZwFJban8MyVcwHqk3E1EJqYZKcJuVt92f96hEG6zxVAKyCChVWZ5a7jvSbTJJyn6ZZdhqAm9eB5JmAJN7fWviizdtihwoGXE</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>
|
||||
|
@ -158,7 +158,7 @@ spend or steal any of your money.</p>
|
|||
<span class="hljs-comment">// can generate addresses with it!</span>
|
||||
accountXpriv.extPublicKey
|
||||
}
|
||||
<span class="hljs-comment">// accountXpub: ExtPublicKey = zpub6qoFe1qb8tnooiMHocaCRZDKjpSPgK327fEW2YcSAPbk1TDagqsgok9oyH9cm9qVDNGjHsw9xiYd8AcwiTG1CitK1aHqULPhNbAEvMZgZmK</span>
|
||||
<span class="hljs-comment">// accountXpub: ExtPublicKey = zpub6rGUGaCpfb9SfVBkKDX8xyTtmmrUmdmNy6biz5C7ZPjpL4MBU8Trbnm4dE5CUANpRxWJJmwemPWRreWgHRKbnuvCqRAdgo7FeDdhbAjT7KW</span>
|
||||
|
||||
<span class="hljs-comment">// address no. 0 ---------------┐</span>
|
||||
<span class="hljs-comment">// external address ----------┐ |</span>
|
||||
|
@ -181,12 +181,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-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
||||
}
|
||||
<span class="hljs-comment">// firstAccountAddress: Bech32Address = tb1qnyes9wnwp2pwr8yx8exg4jhd83rd93rn4n4jny</span>
|
||||
<span class="hljs-comment">// firstAccountAddress: Bech32Address = tb1qg4tfp4z8k0qrv0nd6wvkjsnv9mxar3dq975r0q</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>
|
||||
firstAccountAddress.value
|
||||
<span class="hljs-comment">// res2: String = tb1qnyes9wnwp2pwr8yx8exg4jhd83rd93rn4n4jny</span>
|
||||
<span class="hljs-comment">// res2: String = tb1qg4tfp4z8k0qrv0nd6wvkjsnv9mxar3dq975r0q</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>
|
||||
|
|
|
@ -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">// 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-comment">// entropy: BitVector = BitVector(256 bits, 0x397437571f8c31b87ed98ca4476944688881533d534aa2ffb86e68cc430e2cd9)</span>
|
||||
<span class="hljs-comment">// entropy: BitVector = BitVector(256 bits, 0x943aeafb2080500250d5c192bc6326d8e5da89dc5ceaa03433735e58369bc8dc)</span>
|
||||
|
||||
<span class="hljs-keyword">val</span> mnemonicCode = <span class="hljs-type">MnemonicCode</span>.fromEntropy(entropy)
|
||||
<span class="hljs-comment">// mnemonicCode: MnemonicCode = Masked(MnemonicCodeImpl)</span>
|
||||
|
||||
mnemonicCode.words <span class="hljs-comment">// the phrase the user should write down</span>
|
||||
<span class="hljs-comment">// res0: Vector[String] = Vector(defense, payment, still, disease, seek, switch, window, cover, picture, deputy, extra, speed, marine, praise, vocal, harsh, pepper, worry, breeze, spice, service, mandate, recall, cube)</span>
|
||||
<span class="hljs-comment">// res0: Vector[String] = Vector(neither, struggle, salute, donate, agree, abuse, drive, return, naive, toast, situate, range, frozen, eager, imitate, outer, parent, pave, system, royal, lock, evil, casino, lizard)</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>
|
||||
|
@ -108,7 +108,7 @@ mnemonicCode.words <span class="hljs-comment">// the phrase the user should writ
|
|||
bip39Seed)
|
||||
<span class="hljs-comment">// xpriv: ExtPrivateKey = Masked(ExtPrivateKeyImpl)</span>
|
||||
<span class="hljs-keyword">val</span> xpub = xpriv.extPublicKey
|
||||
<span class="hljs-comment">// xpub: ExtPublicKey = zpub6jftahH18ngZyV6LQVzBcwoXTujvoQfFpV3dZPZEWrm7n3RyiZ4AvmMpUUfmJ8mHzNAbbEcu3FAu4mQEjNd55j5GBMBxjEgdnyiXVHRJqRu</span>
|
||||
<span class="hljs-comment">// xpub: ExtPublicKey = zpub6jftahH18ngZwFJban8MyVcwHqk3E1EJqYZKcJuVt92f96hEG6zxVAKyCChVWZ5a7jvSbTJJyn6ZZdhqAm9eB5JmAJN7fWviizdtihwoGXE</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>
|
||||
|
@ -158,7 +158,7 @@ spend or steal any of your money.</p>
|
|||
<span class="hljs-comment">// can generate addresses with it!</span>
|
||||
accountXpriv.extPublicKey
|
||||
}
|
||||
<span class="hljs-comment">// accountXpub: ExtPublicKey = zpub6qoFe1qb8tnooiMHocaCRZDKjpSPgK327fEW2YcSAPbk1TDagqsgok9oyH9cm9qVDNGjHsw9xiYd8AcwiTG1CitK1aHqULPhNbAEvMZgZmK</span>
|
||||
<span class="hljs-comment">// accountXpub: ExtPublicKey = zpub6rGUGaCpfb9SfVBkKDX8xyTtmmrUmdmNy6biz5C7ZPjpL4MBU8Trbnm4dE5CUANpRxWJJmwemPWRreWgHRKbnuvCqRAdgo7FeDdhbAjT7KW</span>
|
||||
|
||||
<span class="hljs-comment">// address no. 0 ---------------┐</span>
|
||||
<span class="hljs-comment">// external address ----------┐ |</span>
|
||||
|
@ -181,12 +181,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-type">Bech32Address</span>(scriptPubKey, <span class="hljs-type">TestNet3</span>)
|
||||
}
|
||||
<span class="hljs-comment">// firstAccountAddress: Bech32Address = tb1qnyes9wnwp2pwr8yx8exg4jhd83rd93rn4n4jny</span>
|
||||
<span class="hljs-comment">// firstAccountAddress: Bech32Address = tb1qg4tfp4z8k0qrv0nd6wvkjsnv9mxar3dq975r0q</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>
|
||||
firstAccountAddress.value
|
||||
<span class="hljs-comment">// res2: String = tb1qnyes9wnwp2pwr8yx8exg4jhd83rd93rn4n4jny</span>
|
||||
<span class="hljs-comment">// res2: String = tb1qg4tfp4z8k0qrv0nd6wvkjsnv9mxar3dq975r0q</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>
|
||||
|
|
|
@ -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>
|
||||
<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@5379c968[Running, parallelism = 4, 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@5467af1c[Running, parallelism = 4, 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-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-comment">// privKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||
<span class="hljs-keyword">val</span> pubKey = privKey.publicKey
|
||||
<span class="hljs-comment">// pubKey: ECPublicKey = ECPublicKey(02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd)</span>
|
||||
<span class="hljs-comment">// pubKey: ECPublicKey = ECPublicKey(022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed)</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-keyword">val</span> creditingSpk = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = privKey.publicKey)
|
||||
<span class="hljs-comment">// creditingSpk: P2PKHScriptPubKey = pkh(b7989942c4d28d5d157c31304765b7d5774c1788)</span>
|
||||
<span class="hljs-comment">// creditingSpk: P2PKHScriptPubKey = pkh(eeba2cbd2eb4d4cac2aef40a50ce65057278ca21)</span>
|
||||
<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">// this is the UTXO we are going to be spending</span>
|
||||
<span class="hljs-keyword">val</span> utxo =
|
||||
<span class="hljs-type">TransactionOutput</span>(value = amount, scriptPubKey = creditingSpk)
|
||||
<span class="hljs-comment">// utxo: TransactionOutput = TransactionOutput(10000 sats,pkh(b7989942c4d28d5d157c31304765b7d5774c1788))</span>
|
||||
<span class="hljs-comment">// utxo: TransactionOutput = TransactionOutput(10000 sats,pkh(eeba2cbd2eb4d4cac2aef40a50ce65057278ca21))</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
|
||||
|
@ -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-keyword">val</span> destinationSPK =
|
||||
<span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = destinationPrivKey.publicKey)
|
||||
<span class="hljs-comment">// destinationSPK: P2PKHScriptPubKey = pkh(9f49811cc39de04afc1402648a5cc2c09b6c150e)</span>
|
||||
<span class="hljs-comment">// destinationSPK: P2PKHScriptPubKey = pkh(47292e3b8acd9c36d7520602474dea519d11f4c6)</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>
|
||||
|
@ -110,7 +110,7 @@
|
|||
|
||||
<span class="hljs-type">Vector</span>(destination0)
|
||||
}
|
||||
<span class="hljs-comment">// destinations: Vector[TransactionOutput] = Vector(TransactionOutput(5000 sats,pkh(9f49811cc39de04afc1402648a5cc2c09b6c150e)))</span>
|
||||
<span class="hljs-comment">// destinations: Vector[TransactionOutput] = Vector(TransactionOutput(5000 sats,pkh(47292e3b8acd9c36d7520602474dea519d11f4c6)))</span>
|
||||
|
||||
<span class="hljs-comment">// Add the destinations to the tx builder</span>
|
||||
builder ++= destinations
|
||||
|
@ -123,17 +123,17 @@ builder ++= destinations
|
|||
inputs = <span class="hljs-type">Vector</span>.empty,
|
||||
outputs = <span class="hljs-type">Vector</span>(utxo),
|
||||
lockTime = <span class="hljs-type">UInt32</span>.zero)
|
||||
<span class="hljs-comment">// creditingTx: BaseTransaction = BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(b7989942c4d28d5d157c31304765b7d5774c1788))),UInt32Impl(0))</span>
|
||||
<span class="hljs-comment">// creditingTx: BaseTransaction = BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(eeba2cbd2eb4d4cac2aef40a50ce65057278ca21))),UInt32Impl(0))</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-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(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0)</span>
|
||||
<span class="hljs-comment">// outPoint: TransactionOutPoint = TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0)</span>
|
||||
<span class="hljs-keyword">val</span> input = <span class="hljs-type">TransactionInput</span>(
|
||||
outPoint,
|
||||
<span class="hljs-type">EmptyScriptSignature</span>,
|
||||
sequenceNumber = <span class="hljs-type">UInt32</span>.zero)
|
||||
<span class="hljs-comment">// input: TransactionInput = TransactionInputImpl(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),EmptyScriptSignature,UInt32Impl(0))</span>
|
||||
<span class="hljs-comment">// input: TransactionInput = TransactionInputImpl(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),EmptyScriptSignature,UInt32Impl(0))</span>
|
||||
|
||||
<span class="hljs-comment">// Add a new input to our builder</span>
|
||||
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-keyword">val</span> builderResult = builder.result()
|
||||
<span class="hljs-comment">// builderResult: RawTxBuilderResult = RawTxBuilderResult(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(9f49811cc39de04afc1402648a5cc2c09b6c150e))),UInt32Impl(0))</span>
|
||||
<span class="hljs-comment">// builderResult: RawTxBuilderResult = RawTxBuilderResult(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(47292e3b8acd9c36d7520602474dea519d11f4c6))),UInt32Impl(0))</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-comment">// inputInfo: P2PKHInputInfo = P2PKHInputInfo(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),10000 sats,ECPublicKey(02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd))</span>
|
||||
<span class="hljs-comment">// inputInfo: P2PKHInputInfo = P2PKHInputInfo(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),10000 sats,ECPublicKey(022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed))</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>
|
||||
|
@ -155,18 +155,18 @@ builder += input
|
|||
<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-keyword">val</span> changeSPK = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = changePrivKey.publicKey)
|
||||
<span class="hljs-comment">// changeSPK: P2PKHScriptPubKey = pkh(38a41fac59af1375f78102048d4ba0e3644739ee)</span>
|
||||
<span class="hljs-comment">// changeSPK: P2PKHScriptPubKey = pkh(c0439dfe4e5867d820746dcea5bd19d1479f3ef7)</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-type">Vector</span>(inputInfo),
|
||||
feeRate,
|
||||
changeSPK)
|
||||
<span class="hljs-comment">// finalizer: StandardNonInteractiveFinalizer = StandardNonInteractiveFinalizer(Vector(P2PKHInputInfo(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),10000 sats,ECPublicKey(02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd))),1 sats/byte,pkh(38a41fac59af1375f78102048d4ba0e3644739ee))</span>
|
||||
<span class="hljs-comment">// finalizer: StandardNonInteractiveFinalizer = StandardNonInteractiveFinalizer(Vector(P2PKHInputInfo(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),10000 sats,ECPublicKey(022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed))),1 sats/byte,pkh(c0439dfe4e5867d820746dcea5bd19d1479f3ef7))</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-comment">// unsignedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(9f49811cc39de04afc1402648a5cc2c09b6c150e)), TransactionOutput(4775 sats,pkh(38a41fac59af1375f78102048d4ba0e3644739ee))),UInt32Impl(0))</span>
|
||||
<span class="hljs-comment">// unsignedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(47292e3b8acd9c36d7520602474dea519d11f4c6)), TransactionOutput(4775 sats,pkh(c0439dfe4e5867d820746dcea5bd19d1479f3ef7))),UInt32Impl(0))</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>
|
||||
|
@ -176,12 +176,12 @@ builder += input
|
|||
signers = <span class="hljs-type">Vector</span>(privKey),
|
||||
hashType =
|
||||
<span class="hljs-type">HashType</span>.sigHashAll)
|
||||
<span class="hljs-comment">// utxoInfo: ScriptSignatureParams[P2PKHInputInfo] = ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),10000 sats,ECPublicKey(02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(b7989942c4d28d5d157c31304765b7d5774c1788))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(1))</span>
|
||||
<span class="hljs-comment">// utxoInfo: ScriptSignatureParams[P2PKHInputInfo] = ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),10000 sats,ECPublicKey(022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(eeba2cbd2eb4d4cac2aef40a50ce65057278ca21))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(1))</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-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(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),10000 sats,ECPublicKey(02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(b7989942c4d28d5d157c31304765b7d5774c1788))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(1)))</span>
|
||||
<span class="hljs-comment">// utxoInfos: Vector[ScriptSignatureParams[InputInfo]] = Vector(ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),10000 sats,ECPublicKey(022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(eeba2cbd2eb4d4cac2aef40a50ce65057278ca21))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(1)))</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>
|
||||
|
@ -197,7 +197,7 @@ builder += input
|
|||
utxoInfos = utxoInfos,
|
||||
expectedFeeRate = feeRate
|
||||
)
|
||||
<span class="hljs-comment">// signedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),P2PKHScriptSignature(ECPublicKeyBytes(ByteVector(33 bytes, 0x02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd)), ECDigitalSignature(304402201aa48e34351baa388338b0c586326a23dacb14bcdc540c97077a200961a4a971022024a66b4f915b7602013e9ac058d25465da12a33498be1f251b47a49d949eb70901)),UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(9f49811cc39de04afc1402648a5cc2c09b6c150e)), TransactionOutput(4775 sats,pkh(38a41fac59af1375f78102048d4ba0e3644739ee))),UInt32Impl(0))</span>
|
||||
<span class="hljs-comment">// signedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),P2PKHScriptSignature(ECPublicKeyBytes(ByteVector(33 bytes, 0x022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed)), ECDigitalSignature(304402202f9566cd7c981f157704e2cf2f7c21f24768244977a2ffd94caeff18284f10e7022019c500e3f2f1169b9d744f07fd16fd8144213d335cd6f20aed49fb26a7427f3b01)),UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(47292e3b8acd9c36d7520602474dea519d11f4c6)), TransactionOutput(4775 sats,pkh(c0439dfe4e5867d820746dcea5bd19d1479f3ef7))),UInt32Impl(0))</span>
|
||||
</code></pre>
|
||||
<pre><code class="hljs css language-scala">signedTx.inputs.length
|
||||
<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>
|
||||
signedTx.hex
|
||||
<span class="hljs-comment">// res4: String = 02000000019a444319d84bd78f98b3db0535efbbce2783bb897d2aea990bafb470b12cf0bb000000006a47304402201aa48e34351baa388338b0c586326a23dacb14bcdc540c97077a200961a4a971022024a66b4f915b7602013e9ac058d25465da12a33498be1f251b47a49d949eb709012102aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd000000000288130000000000001976a9149f49811cc39de04afc1402648a5cc2c09b6c150e88aca7120000000000001976a91438a41fac59af1375f78102048d4ba0e3644739ee88ac00000000</span>
|
||||
<span class="hljs-comment">// res4: String = 0200000001f5db77f898067c98ae61bdc2f292d5db242832a56fed17650efbf4c3fe465aba000000006a47304402202f9566cd7c981f157704e2cf2f7c21f24768244977a2ffd94caeff18284f10e7022019c500e3f2f1169b9d744f07fd16fd8144213d335cd6f20aed49fb26a7427f3b0121022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed000000000288130000000000001976a91447292e3b8acd9c36d7520602474dea519d11f4c688aca7120000000000001976a914c0439dfe4e5867d820746dcea5bd19d1479f3ef788ac00000000</span>
|
||||
</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 © 2025 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) {
|
||||
|
|
|
@ -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>
|
||||
<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@5379c968[Running, parallelism = 4, 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@5467af1c[Running, parallelism = 4, 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-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-comment">// privKey: ECPrivateKey = Masked(ECPrivateKey)</span>
|
||||
<span class="hljs-keyword">val</span> pubKey = privKey.publicKey
|
||||
<span class="hljs-comment">// pubKey: ECPublicKey = ECPublicKey(02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd)</span>
|
||||
<span class="hljs-comment">// pubKey: ECPublicKey = ECPublicKey(022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed)</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-keyword">val</span> creditingSpk = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = privKey.publicKey)
|
||||
<span class="hljs-comment">// creditingSpk: P2PKHScriptPubKey = pkh(b7989942c4d28d5d157c31304765b7d5774c1788)</span>
|
||||
<span class="hljs-comment">// creditingSpk: P2PKHScriptPubKey = pkh(eeba2cbd2eb4d4cac2aef40a50ce65057278ca21)</span>
|
||||
<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">// this is the UTXO we are going to be spending</span>
|
||||
<span class="hljs-keyword">val</span> utxo =
|
||||
<span class="hljs-type">TransactionOutput</span>(value = amount, scriptPubKey = creditingSpk)
|
||||
<span class="hljs-comment">// utxo: TransactionOutput = TransactionOutput(10000 sats,pkh(b7989942c4d28d5d157c31304765b7d5774c1788))</span>
|
||||
<span class="hljs-comment">// utxo: TransactionOutput = TransactionOutput(10000 sats,pkh(eeba2cbd2eb4d4cac2aef40a50ce65057278ca21))</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
|
||||
|
@ -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-keyword">val</span> destinationSPK =
|
||||
<span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = destinationPrivKey.publicKey)
|
||||
<span class="hljs-comment">// destinationSPK: P2PKHScriptPubKey = pkh(9f49811cc39de04afc1402648a5cc2c09b6c150e)</span>
|
||||
<span class="hljs-comment">// destinationSPK: P2PKHScriptPubKey = pkh(47292e3b8acd9c36d7520602474dea519d11f4c6)</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>
|
||||
|
@ -110,7 +110,7 @@
|
|||
|
||||
<span class="hljs-type">Vector</span>(destination0)
|
||||
}
|
||||
<span class="hljs-comment">// destinations: Vector[TransactionOutput] = Vector(TransactionOutput(5000 sats,pkh(9f49811cc39de04afc1402648a5cc2c09b6c150e)))</span>
|
||||
<span class="hljs-comment">// destinations: Vector[TransactionOutput] = Vector(TransactionOutput(5000 sats,pkh(47292e3b8acd9c36d7520602474dea519d11f4c6)))</span>
|
||||
|
||||
<span class="hljs-comment">// Add the destinations to the tx builder</span>
|
||||
builder ++= destinations
|
||||
|
@ -123,17 +123,17 @@ builder ++= destinations
|
|||
inputs = <span class="hljs-type">Vector</span>.empty,
|
||||
outputs = <span class="hljs-type">Vector</span>(utxo),
|
||||
lockTime = <span class="hljs-type">UInt32</span>.zero)
|
||||
<span class="hljs-comment">// creditingTx: BaseTransaction = BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(b7989942c4d28d5d157c31304765b7d5774c1788))),UInt32Impl(0))</span>
|
||||
<span class="hljs-comment">// creditingTx: BaseTransaction = BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(eeba2cbd2eb4d4cac2aef40a50ce65057278ca21))),UInt32Impl(0))</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-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(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0)</span>
|
||||
<span class="hljs-comment">// outPoint: TransactionOutPoint = TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0)</span>
|
||||
<span class="hljs-keyword">val</span> input = <span class="hljs-type">TransactionInput</span>(
|
||||
outPoint,
|
||||
<span class="hljs-type">EmptyScriptSignature</span>,
|
||||
sequenceNumber = <span class="hljs-type">UInt32</span>.zero)
|
||||
<span class="hljs-comment">// input: TransactionInput = TransactionInputImpl(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),EmptyScriptSignature,UInt32Impl(0))</span>
|
||||
<span class="hljs-comment">// input: TransactionInput = TransactionInputImpl(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),EmptyScriptSignature,UInt32Impl(0))</span>
|
||||
|
||||
<span class="hljs-comment">// Add a new input to our builder</span>
|
||||
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-keyword">val</span> builderResult = builder.result()
|
||||
<span class="hljs-comment">// builderResult: RawTxBuilderResult = RawTxBuilderResult(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(9f49811cc39de04afc1402648a5cc2c09b6c150e))),UInt32Impl(0))</span>
|
||||
<span class="hljs-comment">// builderResult: RawTxBuilderResult = RawTxBuilderResult(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(47292e3b8acd9c36d7520602474dea519d11f4c6))),UInt32Impl(0))</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-comment">// inputInfo: P2PKHInputInfo = P2PKHInputInfo(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),10000 sats,ECPublicKey(02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd))</span>
|
||||
<span class="hljs-comment">// inputInfo: P2PKHInputInfo = P2PKHInputInfo(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),10000 sats,ECPublicKey(022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed))</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>
|
||||
|
@ -155,18 +155,18 @@ builder += input
|
|||
<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-keyword">val</span> changeSPK = <span class="hljs-type">P2PKHScriptPubKey</span>(pubKey = changePrivKey.publicKey)
|
||||
<span class="hljs-comment">// changeSPK: P2PKHScriptPubKey = pkh(38a41fac59af1375f78102048d4ba0e3644739ee)</span>
|
||||
<span class="hljs-comment">// changeSPK: P2PKHScriptPubKey = pkh(c0439dfe4e5867d820746dcea5bd19d1479f3ef7)</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-type">Vector</span>(inputInfo),
|
||||
feeRate,
|
||||
changeSPK)
|
||||
<span class="hljs-comment">// finalizer: StandardNonInteractiveFinalizer = StandardNonInteractiveFinalizer(Vector(P2PKHInputInfo(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),10000 sats,ECPublicKey(02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd))),1 sats/byte,pkh(38a41fac59af1375f78102048d4ba0e3644739ee))</span>
|
||||
<span class="hljs-comment">// finalizer: StandardNonInteractiveFinalizer = StandardNonInteractiveFinalizer(Vector(P2PKHInputInfo(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),10000 sats,ECPublicKey(022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed))),1 sats/byte,pkh(c0439dfe4e5867d820746dcea5bd19d1479f3ef7))</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-comment">// unsignedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(9f49811cc39de04afc1402648a5cc2c09b6c150e)), TransactionOutput(4775 sats,pkh(38a41fac59af1375f78102048d4ba0e3644739ee))),UInt32Impl(0))</span>
|
||||
<span class="hljs-comment">// unsignedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),EmptyScriptSignature,UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(47292e3b8acd9c36d7520602474dea519d11f4c6)), TransactionOutput(4775 sats,pkh(c0439dfe4e5867d820746dcea5bd19d1479f3ef7))),UInt32Impl(0))</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>
|
||||
|
@ -176,12 +176,12 @@ builder += input
|
|||
signers = <span class="hljs-type">Vector</span>(privKey),
|
||||
hashType =
|
||||
<span class="hljs-type">HashType</span>.sigHashAll)
|
||||
<span class="hljs-comment">// utxoInfo: ScriptSignatureParams[P2PKHInputInfo] = ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),10000 sats,ECPublicKey(02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(b7989942c4d28d5d157c31304765b7d5774c1788))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(1))</span>
|
||||
<span class="hljs-comment">// utxoInfo: ScriptSignatureParams[P2PKHInputInfo] = ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),10000 sats,ECPublicKey(022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(eeba2cbd2eb4d4cac2aef40a50ce65057278ca21))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(1))</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-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(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),10000 sats,ECPublicKey(02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(b7989942c4d28d5d157c31304765b7d5774c1788))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(1)))</span>
|
||||
<span class="hljs-comment">// utxoInfos: Vector[ScriptSignatureParams[InputInfo]] = Vector(ScriptSignatureParams(P2PKHInputInfo(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),10000 sats,ECPublicKey(022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed)),BaseTransaction(Int32Impl(1),Vector(),Vector(TransactionOutput(10000 sats,pkh(eeba2cbd2eb4d4cac2aef40a50ce65057278ca21))),UInt32Impl(0)),Vector(Masked(ECPrivateKey)),SIGHASH_ALL(1)))</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>
|
||||
|
@ -197,7 +197,7 @@ builder += input
|
|||
utxoInfos = utxoInfos,
|
||||
expectedFeeRate = feeRate
|
||||
)
|
||||
<span class="hljs-comment">// signedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(bbf02cb170b4af0b99ea2a7d89bb8327cebbef3505dbb3988fd74bd81943449a:0),P2PKHScriptSignature(ECPublicKeyBytes(ByteVector(33 bytes, 0x02aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd)), ECDigitalSignature(304402201aa48e34351baa388338b0c586326a23dacb14bcdc540c97077a200961a4a971022024a66b4f915b7602013e9ac058d25465da12a33498be1f251b47a49d949eb70901)),UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(9f49811cc39de04afc1402648a5cc2c09b6c150e)), TransactionOutput(4775 sats,pkh(38a41fac59af1375f78102048d4ba0e3644739ee))),UInt32Impl(0))</span>
|
||||
<span class="hljs-comment">// signedTx: Transaction = BaseTransaction(Int32Impl(2),Vector(TransactionInputImpl(TransactionOutPoint(ba5a46fec3f4fb0e6517ed6fa5322824dbd592f2c2bd61ae987c0698f877dbf5:0),P2PKHScriptSignature(ECPublicKeyBytes(ByteVector(33 bytes, 0x022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed)), ECDigitalSignature(304402202f9566cd7c981f157704e2cf2f7c21f24768244977a2ffd94caeff18284f10e7022019c500e3f2f1169b9d744f07fd16fd8144213d335cd6f20aed49fb26a7427f3b01)),UInt32Impl(0))),Vector(TransactionOutput(5000 sats,pkh(47292e3b8acd9c36d7520602474dea519d11f4c6)), TransactionOutput(4775 sats,pkh(c0439dfe4e5867d820746dcea5bd19d1479f3ef7))),UInt32Impl(0))</span>
|
||||
</code></pre>
|
||||
<pre><code class="hljs css language-scala">signedTx.inputs.length
|
||||
<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>
|
||||
signedTx.hex
|
||||
<span class="hljs-comment">// res4: String = 02000000019a444319d84bd78f98b3db0535efbbce2783bb897d2aea990bafb470b12cf0bb000000006a47304402201aa48e34351baa388338b0c586326a23dacb14bcdc540c97077a200961a4a971022024a66b4f915b7602013e9ac058d25465da12a33498be1f251b47a49d949eb709012102aeb542c570a6ce34a471cb90f110ee2d7ba375116103a6df74d20bab3ca75cdd000000000288130000000000001976a9149f49811cc39de04afc1402648a5cc2c09b6c150e88aca7120000000000001976a91438a41fac59af1375f78102048d4ba0e3644739ee88ac00000000</span>
|
||||
<span class="hljs-comment">// res4: String = 0200000001f5db77f898067c98ae61bdc2f292d5db242832a56fed17650efbf4c3fe465aba000000006a47304402202f9566cd7c981f157704e2cf2f7c21f24768244977a2ffd94caeff18284f10e7022019c500e3f2f1169b9d744f07fd16fd8144213d335cd6f20aed49fb26a7427f3b0121022e844ef714c5e8b9d8ee19b527aede3763585009d4db38c5b01fc82bfea010ed000000000288130000000000001976a91447292e3b8acd9c36d7520602474dea519d11f4c688aca7120000000000001976a914c0439dfe4e5867d820746dcea5bd19d1479f3ef788ac00000000</span>
|
||||
</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 © 2025 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) {
|
||||
|
|
|
@ -96,13 +96,13 @@
|
|||
<span class="hljs-comment">// extPrivKey: ExtPrivateKey = Masked(ExtPrivateKeyImpl)</span>
|
||||
|
||||
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes)
|
||||
<span class="hljs-comment">// res0: ECDigitalSignature = ECDigitalSignature(304402207983d9ad554a175bf5549b87c38c3daf320ef8ffd7a2f7d0148f58dbb397a3ad02200c8306f90c233bb400f543a8379bf49850b0f3395e3f5dd37bd751aa0dc5416a)</span>
|
||||
<span class="hljs-comment">// res0: ECDigitalSignature = ECDigitalSignature(3045022100b0b91f3d573046e5cada0425b2b83a256a9cd4edce3d1fa81bda900f54a082b502203b51603e56f5992c8b08778390a4c53fec936724aeb3f4f909f23ffdb92ae36f)</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-type">HardenedType</span>.defaultOpt)))
|
||||
<span class="hljs-comment">// path: BIP32Path = m/0'</span>
|
||||
|
||||
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes,path)
|
||||
<span class="hljs-comment">// res1: ECDigitalSignature = ECDigitalSignature(304402200c32b93a95f57ae2af2e1ccf84b2b18ee51c03cc48f36810ab4ecde105088ccd0220745f443487621d2c350a2ef26913d2b218a761a5d2f3d256d3284d063f23a128)</span>
|
||||
<span class="hljs-comment">// res1: ECDigitalSignature = ECDigitalSignature(3045022100ca3673c67eb6311398d97156690d8aa49df00514a8945a4f8bd751c8e610255f02204e8194e784eeafc9b15f01865aadc0313aacb3a24be29fe9f1a9f56f13735358)</span>
|
||||
</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>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>
|
||||
|
||||
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes)
|
||||
<span class="hljs-comment">// res0: ECDigitalSignature = ECDigitalSignature(304402207983d9ad554a175bf5549b87c38c3daf320ef8ffd7a2f7d0148f58dbb397a3ad02200c8306f90c233bb400f543a8379bf49850b0f3395e3f5dd37bd751aa0dc5416a)</span>
|
||||
<span class="hljs-comment">// res0: ECDigitalSignature = ECDigitalSignature(3045022100b0b91f3d573046e5cada0425b2b83a256a9cd4edce3d1fa81bda900f54a082b502203b51603e56f5992c8b08778390a4c53fec936724aeb3f4f909f23ffdb92ae36f)</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-type">HardenedType</span>.defaultOpt)))
|
||||
<span class="hljs-comment">// path: BIP32Path = m/0'</span>
|
||||
|
||||
extPrivKey.sign(<span class="hljs-type">DoubleSha256Digest</span>.empty.bytes,path)
|
||||
<span class="hljs-comment">// res1: ECDigitalSignature = ECDigitalSignature(304402200c32b93a95f57ae2af2e1ccf84b2b18ee51c03cc48f36810ab4ecde105088ccd0220745f443487621d2c350a2ef26913d2b218a761a5d2f3d256d3284d063f23a128)</span>
|
||||
<span class="hljs-comment">// res1: ECDigitalSignature = ECDigitalSignature(3045022100ca3673c67eb6311398d97156690d8aa49df00514a8945a4f8bd751c8e610255f02204e8194e784eeafc9b15f01865aadc0313aacb3a24be29fe9f1a9f56f13735358)</span>
|
||||
</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>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>
|
||||
|
|
|
@ -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>
|
||||
<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
|
||||
recent snapshot published is <code>1.9.10-56-6d240d5c-SNAPSHOT</code>.</p>
|
||||
recent snapshot published is <code>1.9.10-57-fb49548e-SNAPSHOT</code>.</p>
|
||||
<p>To fetch snapshots, you will need to add the correct
|
||||
resolver in your <code>build.sbt</code>:</p>
|
||||
<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>
|
||||
<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
|
||||
recent snapshot published is <code>1.9.10-56-6d240d5c-SNAPSHOT</code>.</p>
|
||||
recent snapshot published is <code>1.9.10-57-fb49548e-SNAPSHOT</code>.</p>
|
||||
<p>To fetch snapshots, you will need to add the correct
|
||||
resolver in your <code>build.sbt</code>:</p>
|
||||
<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-keyword">val</span> entropy = <span class="hljs-type">MnemonicCode</span>.getEntropy256Bits
|
||||
<span class="hljs-comment">// entropy: scodec.bits.BitVector = BitVector(256 bits, 0x6d60089cf9a38bff432a34b00b1843a5385eefa707b55927a0323d5572e5cf7a)</span>
|
||||
<span class="hljs-comment">// entropy: scodec.bits.BitVector = BitVector(256 bits, 0x50102607f8819ad492b92201724a0367dc6da69f033b823b38b082c608f5188a)</span>
|
||||
|
||||
<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">//you can print that mnemonic seed with this</span>
|
||||
println(mnemonic.words)
|
||||
<span class="hljs-comment">// Vector(hope, able, cheese, viable, december, zero, arrow, educate, quote, flee, axis, engine, magnet, jelly, orchard, wall, float, dial, arrive, kingdom, fire, indicate, digital, fade)</span>
|
||||
<span class="hljs-comment">// Vector(exotic, license, limit, valve, boost, heart, enough, cattle, accident, myself, liar, soul, short, spy, lab, guess, lion, supply, club, airport, gauge, kind, giraffe, frame)</span>
|
||||
</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
|
||||
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>
|
||||
<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-comment">// seedPath: Path = /tmp/key-manager-example14203864488944048901/encrypted-bitcoin-s-seed.json</span>
|
||||
<span class="hljs-comment">// seedPath: Path = /tmp/key-manager-example5476949175836984680/encrypted-bitcoin-s-seed.json</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">HDPurpose</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-keyword">val</span> kmParams = <span class="hljs-type">KeyManagerParams</span>(seedPath, purpose, network)
|
||||
<span class="hljs-comment">// kmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example14203864488944048901/encrypted-bitcoin-s-seed.json,m/84',RegTest)</span>
|
||||
<span class="hljs-comment">// kmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5476949175836984680/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-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-comment">// km: Either[KeyManagerInitializeError, BIP39KeyManager] = Right(org.bitcoins.keymanager.bip39.BIP39KeyManager@c0c3d16)</span>
|
||||
<span class="hljs-comment">// km: Either[KeyManagerInitializeError, BIP39KeyManager] = Right(org.bitcoins.keymanager.bip39.BIP39KeyManager@41359916)</span>
|
||||
|
||||
<span class="hljs-keyword">val</span> rootXPub = km.right.get.getRootXPub
|
||||
<span class="hljs-comment">// rootXPub: ExtPublicKey = vpub5SLqN2bLY4WeYm8L9hpNUfxxR3KimdmyQj2Vsy6BLjnUKJPUk7EP6LDVn1FYjFqAdaGUAWWQVLABM5GQhitZ1EtTdVkEdKAPCQTH6P98SuD</span>
|
||||
<span class="hljs-comment">// rootXPub: ExtPublicKey = vpub5SLqN2bLY4WeYMUdqfin89s7jVAGXqcnq45TCFybVWzfC2wYVy729A8kfRZtuYmLCrRiB6ZeM4WGF9Um9ssZ79FyUSLvLQpD8rxqBnddkg2</span>
|
||||
|
||||
println(rootXPub)
|
||||
<span class="hljs-comment">// vpub5SLqN2bLY4WeYm8L9hpNUfxxR3KimdmyQj2Vsy6BLjnUKJPUk7EP6LDVn1FYjFqAdaGUAWWQVLABM5GQhitZ1EtTdVkEdKAPCQTH6P98SuD</span>
|
||||
<span class="hljs-comment">// vpub5SLqN2bLY4WeYMUdqfin89s7jVAGXqcnq45TCFybVWzfC2wYVy729A8kfRZtuYmLCrRiB6ZeM4WGF9Um9ssZ79FyUSLvLQpD8rxqBnddkg2</span>
|
||||
</code></pre>
|
||||
<p>Which should print something that looks like this</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>
|
||||
<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">HDPurpose</span>.<span class="hljs-type">SegWit</span>, <span class="hljs-type">MainNet</span>)
|
||||
<span class="hljs-comment">// mainnetKmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example14203864488944048901/encrypted-bitcoin-s-seed.json,m/84',MainNet)</span>
|
||||
<span class="hljs-comment">// mainnetKmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5476949175836984680/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-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-literal">false</span>)
|
||||
<span class="hljs-comment">// mainnetKeyManager: BIP39KeyManager = org.bitcoins.keymanager.bip39.BIP39KeyManager@1b743bed</span>
|
||||
<span class="hljs-comment">// mainnetKeyManager: BIP39KeyManager = org.bitcoins.keymanager.bip39.BIP39KeyManager@39d7f10e</span>
|
||||
|
||||
<span class="hljs-keyword">val</span> mainnetXpub = mainnetKeyManager.getRootXPub
|
||||
<span class="hljs-comment">// mainnetXpub: ExtPublicKey = zpub6jftahH18ngZwwtoV8xsK2Ly6uuWY7jy5B7P1YfirmHzXhePkjtdaar3rq5titSrG8jhAQteKyaNtDifaWYcCBcs6rXvxxSLHJhrejX7eUH</span>
|
||||
<span class="hljs-comment">// mainnetXpub: ExtPublicKey = zpub6jftahH18ngZwYF7B6sGxWF8RMk4JKanVWALKqZ91YWBQSCTWbmGdQmJkFQEuBP1qQtwAzwtBhvTnHw22fXcJ5zNwo8cg46ADmDQk93gmea</span>
|
||||
|
||||
println(mainnetXpub)
|
||||
<span class="hljs-comment">// zpub6jftahH18ngZwwtoV8xsK2Ly6uuWY7jy5B7P1YfirmHzXhePkjtdaar3rq5titSrG8jhAQteKyaNtDifaWYcCBcs6rXvxxSLHJhrejX7eUH</span>
|
||||
<span class="hljs-comment">// zpub6jftahH18ngZwYF7B6sGxWF8RMk4JKanVWALKqZ91YWBQSCTWbmGdQmJkFQEuBP1qQtwAzwtBhvTnHw22fXcJ5zNwo8cg46ADmDQk93gmea</span>
|
||||
</code></pre>
|
||||
<p>Which gives us something that looks like this</p>
|
||||
<p><code>zpub6jftahH18ngZw98KGjRo5XcxeKTQ2eztsvskb1dC9XF5TLimQquTs6Ry7nBBA425D9joXmfgJJCexmJ1u2SELJZJfRi95gcnXadLpZzYb5c</code></p>
|
||||
|
|
|
@ -77,14 +77,14 @@
|
|||
|
||||
<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-comment">// entropy: scodec.bits.BitVector = BitVector(256 bits, 0x6d60089cf9a38bff432a34b00b1843a5385eefa707b55927a0323d5572e5cf7a)</span>
|
||||
<span class="hljs-comment">// entropy: scodec.bits.BitVector = BitVector(256 bits, 0x50102607f8819ad492b92201724a0367dc6da69f033b823b38b082c608f5188a)</span>
|
||||
|
||||
<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">//you can print that mnemonic seed with this</span>
|
||||
println(mnemonic.words)
|
||||
<span class="hljs-comment">// Vector(hope, able, cheese, viable, december, zero, arrow, educate, quote, flee, axis, engine, magnet, jelly, orchard, wall, float, dial, arrive, kingdom, fire, indicate, digital, fade)</span>
|
||||
<span class="hljs-comment">// Vector(exotic, license, limit, valve, boost, heart, enough, cattle, accident, myself, liar, soul, short, spy, lab, guess, lion, supply, club, airport, gauge, kind, giraffe, frame)</span>
|
||||
</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
|
||||
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>
|
||||
<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-comment">// seedPath: Path = /tmp/key-manager-example14203864488944048901/encrypted-bitcoin-s-seed.json</span>
|
||||
<span class="hljs-comment">// seedPath: Path = /tmp/key-manager-example5476949175836984680/encrypted-bitcoin-s-seed.json</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">HDPurpose</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-keyword">val</span> kmParams = <span class="hljs-type">KeyManagerParams</span>(seedPath, purpose, network)
|
||||
<span class="hljs-comment">// kmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example14203864488944048901/encrypted-bitcoin-s-seed.json,m/84',RegTest)</span>
|
||||
<span class="hljs-comment">// kmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5476949175836984680/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-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-comment">// km: Either[KeyManagerInitializeError, BIP39KeyManager] = Right(org.bitcoins.keymanager.bip39.BIP39KeyManager@c0c3d16)</span>
|
||||
<span class="hljs-comment">// km: Either[KeyManagerInitializeError, BIP39KeyManager] = Right(org.bitcoins.keymanager.bip39.BIP39KeyManager@41359916)</span>
|
||||
|
||||
<span class="hljs-keyword">val</span> rootXPub = km.right.get.getRootXPub
|
||||
<span class="hljs-comment">// rootXPub: ExtPublicKey = vpub5SLqN2bLY4WeYm8L9hpNUfxxR3KimdmyQj2Vsy6BLjnUKJPUk7EP6LDVn1FYjFqAdaGUAWWQVLABM5GQhitZ1EtTdVkEdKAPCQTH6P98SuD</span>
|
||||
<span class="hljs-comment">// rootXPub: ExtPublicKey = vpub5SLqN2bLY4WeYMUdqfin89s7jVAGXqcnq45TCFybVWzfC2wYVy729A8kfRZtuYmLCrRiB6ZeM4WGF9Um9ssZ79FyUSLvLQpD8rxqBnddkg2</span>
|
||||
|
||||
println(rootXPub)
|
||||
<span class="hljs-comment">// vpub5SLqN2bLY4WeYm8L9hpNUfxxR3KimdmyQj2Vsy6BLjnUKJPUk7EP6LDVn1FYjFqAdaGUAWWQVLABM5GQhitZ1EtTdVkEdKAPCQTH6P98SuD</span>
|
||||
<span class="hljs-comment">// vpub5SLqN2bLY4WeYMUdqfin89s7jVAGXqcnq45TCFybVWzfC2wYVy729A8kfRZtuYmLCrRiB6ZeM4WGF9Um9ssZ79FyUSLvLQpD8rxqBnddkg2</span>
|
||||
</code></pre>
|
||||
<p>Which should print something that looks like this</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>
|
||||
<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">HDPurpose</span>.<span class="hljs-type">SegWit</span>, <span class="hljs-type">MainNet</span>)
|
||||
<span class="hljs-comment">// mainnetKmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example14203864488944048901/encrypted-bitcoin-s-seed.json,m/84',MainNet)</span>
|
||||
<span class="hljs-comment">// mainnetKmParams: KeyManagerParams = KeyManagerParams(/tmp/key-manager-example5476949175836984680/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-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-literal">false</span>)
|
||||
<span class="hljs-comment">// mainnetKeyManager: BIP39KeyManager = org.bitcoins.keymanager.bip39.BIP39KeyManager@1b743bed</span>
|
||||
<span class="hljs-comment">// mainnetKeyManager: BIP39KeyManager = org.bitcoins.keymanager.bip39.BIP39KeyManager@39d7f10e</span>
|
||||
|
||||
<span class="hljs-keyword">val</span> mainnetXpub = mainnetKeyManager.getRootXPub
|
||||
<span class="hljs-comment">// mainnetXpub: ExtPublicKey = zpub6jftahH18ngZwwtoV8xsK2Ly6uuWY7jy5B7P1YfirmHzXhePkjtdaar3rq5titSrG8jhAQteKyaNtDifaWYcCBcs6rXvxxSLHJhrejX7eUH</span>
|
||||
<span class="hljs-comment">// mainnetXpub: ExtPublicKey = zpub6jftahH18ngZwYF7B6sGxWF8RMk4JKanVWALKqZ91YWBQSCTWbmGdQmJkFQEuBP1qQtwAzwtBhvTnHw22fXcJ5zNwo8cg46ADmDQk93gmea</span>
|
||||
|
||||
println(mainnetXpub)
|
||||
<span class="hljs-comment">// zpub6jftahH18ngZwwtoV8xsK2Ly6uuWY7jy5B7P1YfirmHzXhePkjtdaar3rq5titSrG8jhAQteKyaNtDifaWYcCBcs6rXvxxSLHJhrejX7eUH</span>
|
||||
<span class="hljs-comment">// zpub6jftahH18ngZwYF7B6sGxWF8RMk4JKanVWALKqZ91YWBQSCTWbmGdQmJkFQEuBP1qQtwAzwtBhvTnHw22fXcJ5zNwo8cg46ADmDQk93gmea</span>
|
||||
</code></pre>
|
||||
<p>Which gives us something that looks like this</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">// calls bouncy castle indirectly via CryptoContext</span>
|
||||
<span class="hljs-keyword">val</span> publicKey = privKey.publicKey
|
||||
<span class="hljs-comment">// publicKey: ECPublicKey = ECPublicKey(02389dfa17385dea5844ec22b41a2a0eedc40fe5be2f4f2a28ac58be9f9d12b1f2)</span>
|
||||
<span class="hljs-comment">// publicKey: ECPublicKey = ECPublicKey(02db54dbfa32d969b5c2a68dbb36f136b26df7fa00f32464fe16d35ba7c7ed5428)</span>
|
||||
<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">// calls bouncy castle indirectly via CryptoContext</span>
|
||||
<span class="hljs-keyword">val</span> signature = privKey.sign(dataToSign.bytes)
|
||||
<span class="hljs-comment">// signature: ECDigitalSignature = ECDigitalSignature(30450221008c9032c1c85a7bf3144526f4c232a2f50e6882ece7182c97f1440e4a0410ef3a02207ee1c87660982f667ddf983933ecb61363e8c3c6cb6e37388683b5eb8b720669)</span>
|
||||
<span class="hljs-comment">// signature: ECDigitalSignature = ECDigitalSignature(3045022100805fbc42df0b0302f4f87549717b3278663f5927cb8c82e2a3cb1b324a5c508b022047cdba67dad845d61457f66258e8ff4374a5c2375df1050402c9c30caf0dcd90)</span>
|
||||
|
||||
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
||||
<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">// calls bouncy castle indirectly via CryptoContext</span>
|
||||
<span class="hljs-keyword">val</span> publicKey = privKey.publicKey
|
||||
<span class="hljs-comment">// publicKey: ECPublicKey = ECPublicKey(02389dfa17385dea5844ec22b41a2a0eedc40fe5be2f4f2a28ac58be9f9d12b1f2)</span>
|
||||
<span class="hljs-comment">// publicKey: ECPublicKey = ECPublicKey(02db54dbfa32d969b5c2a68dbb36f136b26df7fa00f32464fe16d35ba7c7ed5428)</span>
|
||||
<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">// calls bouncy castle indirectly via CryptoContext</span>
|
||||
<span class="hljs-keyword">val</span> signature = privKey.sign(dataToSign.bytes)
|
||||
<span class="hljs-comment">// signature: ECDigitalSignature = ECDigitalSignature(30450221008c9032c1c85a7bf3144526f4c232a2f50e6882ece7182c97f1440e4a0410ef3a02207ee1c87660982f667ddf983933ecb61363e8c3c6cb6e37388683b5eb8b720669)</span>
|
||||
<span class="hljs-comment">// signature: ECDigitalSignature = ECDigitalSignature(3045022100805fbc42df0b0302f4f87549717b3278663f5927cb8c82e2a3cb1b324a5c508b022047cdba67dad845d61457f66258e8ff4374a5c2375df1050402c9c30caf0dcd90)</span>
|
||||
|
||||
<span class="hljs-comment">// calls bouncy castle indirectly via CryptoContext</span>
|
||||
<span class="hljs-keyword">val</span> verified = publicKey.verify(dataToSign.bytes, signature)
|
||||
|
|
Loading…
Add table
Reference in a new issue