Coineva - Cryptocurrency Code Factoryhttps://coineva.com/2022-10-07T09:32:00+02:00Cryptocurrency Code FactoryCryptocurrency Code FactorySend and Receive Bitcoin from Commandline2022-10-07T08:48:00+02:002022-10-07T09:32:00+02:00Lennart Jongeneeltag:coineva.com,2022-10-07:/send-receive-bitcoin-from-commandline.html<p class="first last">Send and Receive Bitcoin from Python Commandline with Bitcoinlib in a few easy steps</p>
<!-- :slug: send-receive-bitcoin-from-commandline: -->
<img alt="Python commandline wallet" class="align-right" src="/images/commandline-wallet.png" style="width: 800px;" />
<p>Sometimes you just need a simple or temporary wallet to send and receive crypto. In the example below we create a wallet and send bitcoiins with single line python commands. No need for complex software installation or time consuming backup procedures.</p>
<p>Make sure <a class="reference external" href="https://bitcoinlib.readthedocs.io/en/latest/source/_static/manuals.install.html">Python BitcoinLib</a> is installed before you start.</p>
<div class="highlight"><pre><span></span>pip install bitcoinlib
</pre></div>
<div class="section" id="create-wallet">
<h2>Create Wallet</h2>
<p>Now lets create a wallet and get an address to receive Bitcoin Testnet coins.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">bitcoinlib.wallets</span> <span class="kn">import</span> <span class="n">Wallet</span>
<span class="o">>>></span> <span class="n">w</span> <span class="o">=</span> <span class="n">Wallet</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="s2">"My Testnet Wallet"</span><span class="p">,</span> <span class="n">network</span><span class="o">=</span><span class="s2">"testnet"</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
<span class="o">===</span> <span class="n">WALLET</span> <span class="o">===</span>
<span class="n">ID</span> <span class="mi">3</span>
<span class="n">Name</span> <span class="n">My</span> <span class="n">Testnet</span> <span class="n">Wallet</span>
<span class="n">Owner</span>
<span class="n">Scheme</span> <span class="n">bip32</span>
<span class="n">Multisig</span> <span class="kc">False</span>
<span class="n">Witness</span> <span class="nb">type</span> <span class="n">legacy</span>
<span class="n">Main</span> <span class="n">network</span> <span class="n">testnet</span>
<span class="n">Latest</span> <span class="n">update</span> <span class="kc">None</span>
<span class="o">=</span> <span class="n">Wallet</span> <span class="n">Master</span> <span class="n">Key</span> <span class="o">=</span>
<span class="n">ID</span> <span class="mi">21</span>
<span class="n">Private</span> <span class="kc">True</span>
<span class="n">Depth</span> <span class="mi">0</span>
<span class="o">-</span> <span class="n">NETWORK</span><span class="p">:</span> <span class="n">testnet</span> <span class="o">-</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Keys</span>
<span class="mi">26</span> <span class="n">m</span><span class="o">/</span><span class="mi">44</span><span class="s1">'/1'</span><span class="o">/</span><span class="mi">0</span><span class="s1">'/0/0 mvrtuQvMhP79x4p4fPNChGopWoUvVttjUP address index 0 0.00000000 TBTC</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Transactions</span> <span class="n">Account</span> <span class="mi">0</span> <span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="o">=</span> <span class="n">Balance</span> <span class="n">Totals</span> <span class="p">(</span><span class="n">includes</span> <span class="n">unconfirmed</span><span class="p">)</span> <span class="o">=</span>
</pre></div>
<p>Make a copy of the wallet private key in case anything goes wrong.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">main_key</span><span class="o">.</span><span class="n">wif</span>
<span class="s1">'tprv8ZgxMBicQKsPeTWfDcHDjngYVa8LR4VQnn4GtoJLXEtQYpRRkRt6TsqKp2nBRfnJt9vjUTREV8YpjPr8jecxNh1USymackFnAHnD7MEQo7r'</span>
</pre></div>
</div>
<div class="section" id="receive-bitcoins">
<h2>Receive Bitcoins</h2>
<p>We have an address (mvrtuQvMhP79x4p4fPNChGopWoUvVttjUP) and we can receive bitcoins, so lets find a bitcoin faucet and
see if we can get some testnet coins. Just Google for 'bitcoin testnet faucet' and see what you find. I used <a class="reference external" href="https://bitcoinfaucet.uo1.net/">https://bitcoinfaucet.uo1.net/</a></p>
<p>The faucet will give you a transaction id, in this case <a class="reference external" href="https://blocksmurfer.io/tbtc/transaction/99f9a76d7b05c409ff4955ba7d91ee83a8835a9f9821c32ff2e987ab8a3fba85">99f9a76d7b05c409ff4955ba7d91ee83a8835a9f9821c32ff2e987ab8a3fba85</a>
Open any block explorer and you can see if the transaction is received by the network and wait until it confirms.</p>
<p>Let the wallet scan for transactions and see if you have received the testnet coins.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">scan</span><span class="p">(</span><span class="n">scan_gap_limit</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
<span class="o">===</span> <span class="n">WALLET</span> <span class="o">===</span>
<span class="n">ID</span> <span class="mi">3</span>
<span class="n">Name</span> <span class="n">My</span> <span class="n">Testnet</span> <span class="n">Wallet</span>
<span class="n">Owner</span>
<span class="n">Scheme</span> <span class="n">bip32</span>
<span class="n">Multisig</span> <span class="kc">False</span>
<span class="n">Witness</span> <span class="nb">type</span> <span class="n">legacy</span>
<span class="n">Main</span> <span class="n">network</span> <span class="n">testnet</span>
<span class="n">Latest</span> <span class="n">update</span> <span class="mi">2022</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">07</span> <span class="mi">09</span><span class="p">:</span><span class="mi">52</span><span class="p">:</span><span class="mf">56.606693</span>
<span class="o">=</span> <span class="n">Wallet</span> <span class="n">Master</span> <span class="n">Key</span> <span class="o">=</span>
<span class="n">ID</span> <span class="mi">21</span>
<span class="n">Private</span> <span class="kc">True</span>
<span class="n">Depth</span> <span class="mi">0</span>
<span class="o">-</span> <span class="n">NETWORK</span><span class="p">:</span> <span class="n">testnet</span> <span class="o">-</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Keys</span>
<span class="mi">26</span> <span class="n">m</span><span class="o">/</span><span class="mi">44</span><span class="s1">'/1'</span><span class="o">/</span><span class="mi">0</span><span class="s1">'/0/0 mvrtuQvMhP79x4p4fPNChGopWoUvVttjUP address index 0 0.00010000 TBTC</span>
<span class="mi">28</span> <span class="n">m</span><span class="o">/</span><span class="mi">44</span><span class="s1">'/1'</span><span class="o">/</span><span class="mi">0</span><span class="s1">'/1/0 mtGdVm451fQYh4wQEoMWYAUm6JocHK9LZs address index 0 0.00000000 TBTC</span>
<span class="mi">29</span> <span class="n">m</span><span class="o">/</span><span class="mi">44</span><span class="s1">'/1'</span><span class="o">/</span><span class="mi">0</span><span class="s1">'/0/1 n1UDMjicDJ6c2Kuv8eHLcYrZUmGGXfH2Nu address index 1 0.00000000 TBTC</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Transactions</span> <span class="n">Account</span> <span class="mi">0</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="mi">99</span><span class="n">f9a76d7b05c409ff4955ba7d91ee83a8835a9f9821c32ff2e987ab8a3fba85</span> <span class="n">mvrtuQvMhP79x4p4fPNChGopWoUvVttjUP</span> <span class="mi">1</span> <span class="mf">0.00010000</span> <span class="n">TBTC</span> <span class="n">U</span>
<span class="o">=</span> <span class="n">Balance</span> <span class="n">Totals</span> <span class="p">(</span><span class="n">includes</span> <span class="n">unconfirmed</span><span class="p">)</span> <span class="o">=</span>
<span class="n">testnet</span> <span class="p">(</span><span class="n">Account</span> <span class="mi">0</span><span class="p">)</span> <span class="mf">0.00010000</span> <span class="n">TBTC</span>
</pre></div>
</div>
<div class="section" id="send-bitcoins">
<h2>Send Bitcoins</h2>
<p>With a single line command we can send some bitcoins back to the faucet address:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">send_to</span><span class="p">(</span><span class="s1">'tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt'</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="n">offline</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="o"><</span><span class="n">WalletTransaction</span><span class="p">(</span><span class="n">input_count</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">output_count</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">unconfirmed</span><span class="p">,</span> <span class="n">network</span><span class="o">=</span><span class="n">testnet</span><span class="p">)</span><span class="o">></span>
</pre></div>
<p>This creates a <a class="reference external" href="https://blocksmurfer.io/tbtc/transaction/4c0807e0630b772b59db68d9d2b172e415cbdde0a0ea9180f40cbaacfbf34081">transaction</a> and pushes it to the testnet network.</p>
<p>However in a normal situation we would like to check the transaction first before sending it.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">t</span> <span class="o">=</span> <span class="n">w</span><span class="o">.</span><span class="n">send_to</span><span class="p">(</span><span class="s1">'tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt'</span><span class="p">,</span> <span class="mi">1000</span><span class="p">)</span>
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
<span class="n">File</span> <span class="s2">"<stdin>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span> <span class="o"><</span><span class="n">module</span><span class="o">></span>
<span class="n">File</span> <span class="s2">"/home/lennart/.virtualenvs/bitcoinlib/lib/python3.8/site-packages/bitcoinlib/wallets.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">3928</span><span class="p">,</span> <span class="ow">in</span> <span class="n">send_to</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">outputs</span><span class="p">,</span> <span class="n">input_key_id</span><span class="o">=</span><span class="n">input_key_id</span><span class="p">,</span> <span class="n">account_id</span><span class="o">=</span><span class="n">account_id</span><span class="p">,</span> <span class="n">network</span><span class="o">=</span><span class="n">network</span><span class="p">,</span> <span class="n">fee</span><span class="o">=</span><span class="n">fee</span><span class="p">,</span>
<span class="n">File</span> <span class="s2">"/home/lennart/.virtualenvs/bitcoinlib/lib/python3.8/site-packages/bitcoinlib/wallets.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">3863</span><span class="p">,</span> <span class="ow">in</span> <span class="n">send</span>
<span class="n">transaction</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">transaction_create</span><span class="p">(</span><span class="n">output_arr</span><span class="p">,</span> <span class="n">input_arr</span><span class="p">,</span> <span class="n">input_key_id</span><span class="p">,</span> <span class="n">account_id</span><span class="p">,</span> <span class="n">network</span><span class="p">,</span> <span class="n">fee</span><span class="p">,</span>
<span class="n">File</span> <span class="s2">"/home/lennart/.virtualenvs/bitcoinlib/lib/python3.8/site-packages/bitcoinlib/wallets.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">3528</span><span class="p">,</span> <span class="ow">in</span> <span class="n">transaction_create</span>
<span class="n">selected_utxos</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">select_inputs</span><span class="p">(</span><span class="n">amount_total_output</span> <span class="o">+</span> <span class="n">fee_estimate</span><span class="p">,</span> <span class="n">transaction</span><span class="o">.</span><span class="n">network</span><span class="o">.</span><span class="n">dust_amount</span><span class="p">,</span>
<span class="n">File</span> <span class="s2">"/home/lennart/.virtualenvs/bitcoinlib/lib/python3.8/site-packages/bitcoinlib/wallets.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">3381</span><span class="p">,</span> <span class="ow">in</span> <span class="n">select_inputs</span>
<span class="k">raise</span> <span class="n">WalletError</span><span class="p">(</span><span class="s2">"Create transaction: No unspent transaction outputs found or no key available for UTXO's"</span><span class="p">)</span>
<span class="n">bitcoinlib</span><span class="o">.</span><span class="n">wallets</span><span class="o">.</span><span class="n">WalletError</span><span class="p">:</span> <span class="n">Create</span> <span class="n">transaction</span><span class="p">:</span> <span class="n">No</span> <span class="n">unspent</span> <span class="n">transaction</span> <span class="n">outputs</span> <span class="n">found</span> <span class="ow">or</span> <span class="n">no</span> <span class="n">key</span> <span class="n">available</span> <span class="k">for</span> <span class="n">UTXO</span><span class="s1">'s</span>
</pre></div>
<p>Ah, nasty errors... This means the previous transaction is not confirmed yet.</p>
<p>Normally we would wait a little, but we are in a hurry, so we include the min_confirms=0 to be able to spent unconfirmed outputs.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">t</span> <span class="o">=</span> <span class="n">w</span><span class="o">.</span><span class="n">send_to</span><span class="p">(</span><span class="s1">'tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt'</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="n">min_confirms</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">t</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
<span class="n">Transaction</span> <span class="mi">24</span><span class="n">f28bd6be541b61ff1b07b18b35dbc194c466d8671e86678ef812802170c4b1</span>
<span class="n">Date</span><span class="p">:</span> <span class="kc">None</span>
<span class="n">Network</span><span class="p">:</span> <span class="n">testnet</span>
<span class="n">Version</span><span class="p">:</span> <span class="mi">1</span>
<span class="n">Witness</span> <span class="nb">type</span><span class="p">:</span> <span class="n">legacy</span>
<span class="n">Status</span><span class="p">:</span> <span class="n">new</span>
<span class="n">Verified</span><span class="p">:</span> <span class="kc">True</span>
<span class="n">Inputs</span>
<span class="o">-</span> <span class="n">mtGdVm451fQYh4wQEoMWYAUm6JocHK9LZs</span> <span class="mf">0.00008773</span> <span class="n">tBTC</span> <span class="mi">4</span><span class="n">c0807e0630b772b59db68d9d2b172e415cbdde0a0ea9180f40cbaacfbf34081</span> <span class="mi">0</span>
<span class="n">legacy</span> <span class="n">sig_pubkey</span><span class="p">;</span> <span class="n">sigs</span><span class="p">:</span> <span class="mi">1</span> <span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">of</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">valid</span>
<span class="n">Outputs</span>
<span class="o">-</span> <span class="n">tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt</span> <span class="mf">0.00001000</span> <span class="n">tBTC</span> <span class="n">p2wpkh</span> <span class="n">U</span>
<span class="o">-</span> <span class="n">mhBuzpdhpnb3uf8ZUSPHHsNxiLp1QJvQGs</span> <span class="mf">0.00007546</span> <span class="n">tBTC</span> <span class="n">p2pkh</span> <span class="n">U</span>
<span class="n">Size</span><span class="p">:</span> <span class="mi">222</span>
<span class="n">Vsize</span><span class="p">:</span> <span class="mi">222</span>
<span class="n">Fee</span><span class="p">:</span> <span class="mi">227</span>
<span class="n">Confirmations</span><span class="p">:</span> <span class="kc">None</span>
<span class="n">Block</span><span class="p">:</span> <span class="kc">None</span>
<span class="n">Pushed</span> <span class="n">to</span> <span class="n">network</span><span class="p">:</span> <span class="kc">False</span>
<span class="n">Wallet</span><span class="p">:</span> <span class="n">My</span> <span class="n">Testnet</span> <span class="n">Wallet</span>
<span class="o">>>></span> <span class="n">t</span><span class="o">.</span><span class="n">send</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">t</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
<span class="n">Transaction</span> <span class="mi">24</span><span class="n">f28bd6be541b61ff1b07b18b35dbc194c466d8671e86678ef812802170c4b1</span>
<span class="n">Date</span><span class="p">:</span> <span class="kc">None</span>
<span class="n">Network</span><span class="p">:</span> <span class="n">testnet</span>
<span class="n">Version</span><span class="p">:</span> <span class="mi">1</span>
<span class="n">Witness</span> <span class="nb">type</span><span class="p">:</span> <span class="n">legacy</span>
<span class="n">Status</span><span class="p">:</span> <span class="n">unconfirmed</span>
<span class="n">Verified</span><span class="p">:</span> <span class="kc">True</span>
<span class="n">Inputs</span>
<span class="o">-</span> <span class="n">mtGdVm451fQYh4wQEoMWYAUm6JocHK9LZs</span> <span class="mf">0.00008773</span> <span class="n">tBTC</span> <span class="mi">4</span><span class="n">c0807e0630b772b59db68d9d2b172e415cbdde0a0ea9180f40cbaacfbf34081</span> <span class="mi">0</span>
<span class="n">legacy</span> <span class="n">sig_pubkey</span><span class="p">;</span> <span class="n">sigs</span><span class="p">:</span> <span class="mi">1</span> <span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">of</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">valid</span>
<span class="n">Outputs</span>
<span class="o">-</span> <span class="n">tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt</span> <span class="mf">0.00001000</span> <span class="n">tBTC</span> <span class="n">p2wpkh</span> <span class="n">U</span>
<span class="o">-</span> <span class="n">mhBuzpdhpnb3uf8ZUSPHHsNxiLp1QJvQGs</span> <span class="mf">0.00007546</span> <span class="n">tBTC</span> <span class="n">p2pkh</span> <span class="n">U</span>
<span class="n">Size</span><span class="p">:</span> <span class="mi">222</span>
<span class="n">Vsize</span><span class="p">:</span> <span class="mi">222</span>
<span class="n">Fee</span><span class="p">:</span> <span class="mi">227</span>
<span class="n">Confirmations</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">Block</span><span class="p">:</span> <span class="kc">None</span>
<span class="n">Pushed</span> <span class="n">to</span> <span class="n">network</span><span class="p">:</span> <span class="kc">True</span>
<span class="n">Wallet</span><span class="p">:</span> <span class="n">My</span> <span class="n">Testnet</span> <span class="n">Wallet</span>
</pre></div>
<p>So we created a transaction object, checked it and then send it with the Transaction.send() command. As you can see the transaction is pushed to the network and we received a transaction ID.</p>
<p>When the transactions are done and we are finished we can empty the wallet and sweep it to another wallet with a single command.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">sweep</span><span class="p">(</span><span class="s1">'tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt'</span><span class="p">,</span> <span class="n">offline</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">min_confirms</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="o"><</span><span class="n">WalletTransaction</span><span class="p">(</span><span class="n">input_count</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">output_count</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="n">unconfirmed</span><span class="p">,</span> <span class="n">network</span><span class="o">=</span><span class="n">testnet</span><span class="p">)</span><span class="o">></span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
<span class="o">===</span> <span class="n">WALLET</span> <span class="o">===</span>
<span class="n">ID</span> <span class="mi">3</span>
<span class="n">Name</span> <span class="n">My</span> <span class="n">Testnet</span> <span class="n">Wallet</span>
<span class="n">Owner</span>
<span class="n">Scheme</span> <span class="n">bip32</span>
<span class="n">Multisig</span> <span class="kc">False</span>
<span class="n">Witness</span> <span class="nb">type</span> <span class="n">legacy</span>
<span class="n">Main</span> <span class="n">network</span> <span class="n">testnet</span>
<span class="n">Latest</span> <span class="n">update</span> <span class="mi">2022</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">07</span> <span class="mi">09</span><span class="p">:</span><span class="mi">52</span><span class="p">:</span><span class="mf">56.606693</span>
<span class="o">=</span> <span class="n">Wallet</span> <span class="n">Master</span> <span class="n">Key</span> <span class="o">=</span>
<span class="n">ID</span> <span class="mi">21</span>
<span class="n">Private</span> <span class="kc">True</span>
<span class="n">Depth</span> <span class="mi">0</span>
<span class="o">-</span> <span class="n">NETWORK</span><span class="p">:</span> <span class="n">testnet</span> <span class="o">-</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Keys</span>
<span class="mi">29</span> <span class="n">m</span><span class="o">/</span><span class="mi">44</span><span class="s1">'/1'</span><span class="o">/</span><span class="mi">0</span><span class="s1">'/0/1 n1UDMjicDJ6c2Kuv8eHLcYrZUmGGXfH2Nu address index 1 0.00000000 TBTC</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Transactions</span> <span class="n">Account</span> <span class="mi">0</span> <span class="p">(</span><span class="mi">6</span><span class="p">)</span>
<span class="mi">99</span><span class="n">f9a76d7b05c409ff4955ba7d91ee83a8835a9f9821c32ff2e987ab8a3fba85</span> <span class="n">mvrtuQvMhP79x4p4fPNChGopWoUvVttjUP</span> <span class="mi">2</span> <span class="mf">0.00010000</span> <span class="n">TBTC</span>
<span class="mi">4</span><span class="n">c0807e0630b772b59db68d9d2b172e415cbdde0a0ea9180f40cbaacfbf34081</span> <span class="n">mvrtuQvMhP79x4p4fPNChGopWoUvVttjUP</span> <span class="mi">0</span> <span class="o">-</span><span class="mf">0.00010000</span> <span class="n">TBTC</span>
<span class="mi">4</span><span class="n">c0807e0630b772b59db68d9d2b172e415cbdde0a0ea9180f40cbaacfbf34081</span> <span class="n">mtGdVm451fQYh4wQEoMWYAUm6JocHK9LZs</span> <span class="mi">0</span> <span class="mf">0.00008773</span> <span class="n">TBTC</span>
<span class="mi">24</span><span class="n">f28bd6be541b61ff1b07b18b35dbc194c466d8671e86678ef812802170c4b1</span> <span class="n">mtGdVm451fQYh4wQEoMWYAUm6JocHK9LZs</span> <span class="mi">0</span> <span class="o">-</span><span class="mf">0.00008773</span> <span class="n">TBTC</span>
<span class="mi">24</span><span class="n">f28bd6be541b61ff1b07b18b35dbc194c466d8671e86678ef812802170c4b1</span> <span class="n">mhBuzpdhpnb3uf8ZUSPHHsNxiLp1QJvQGs</span> <span class="mi">0</span> <span class="mf">0.00007546</span> <span class="n">TBTC</span>
<span class="mi">97647</span><span class="n">f0530f810aa5eea5d1062f570f7ee581908c54b61ffb34de3595c49c2ee</span> <span class="n">mhBuzpdhpnb3uf8ZUSPHHsNxiLp1QJvQGs</span> <span class="mi">0</span> <span class="o">-</span><span class="mf">0.00007546</span> <span class="n">TBTC</span>
<span class="o">=</span> <span class="n">Balance</span> <span class="n">Totals</span> <span class="p">(</span><span class="n">includes</span> <span class="n">unconfirmed</span><span class="p">)</span> <span class="o">=</span>
<span class="n">testnet</span> <span class="p">(</span><span class="n">Account</span> <span class="mi">0</span><span class="p">)</span> <span class="mf">0.00000000</span> <span class="n">TBTC</span>
</pre></div>
<p>And it is empty!</p>
</div>
Bitvavo Review2022-03-11T09:52:00+01:002022-03-11T10:31:00+01:00Lennart Jongeneeltag:coineva.com,2022-03-11:/bitvavo-exchange-review.html<p class="first last">A review of the Bitvavo Bitcoin Exchange</p>
<!-- :slug: bitvavo-exchange-review: -->
<img alt="Bitvavo logo" class="align-right" src="/images/bitvavo-logo.png" style="width: 167px;" />
<p>Bitvavo is one of the largest Dutch bitcoin exchanges. The company is based in Amsterdam and founded in 2017.</p>
<p>They offer storage, staking and trading of Bitcoin any many other cryptocurrencies.</p>
<div class="section" id="review">
<h2>Review</h2>
<p>Unfortunately the first impression wasn't very good. It took me over a month to open an account.</p>
<p>I assume no one likes the awkward KYC procedures when opening a new exchange account, but Bitvavo really took it to
the next level. They ask for a lot of information which in my opinion was not legally required and asked repeatedly for
the same documents. Also it took weeks before receiving an answer sometimes.</p>
<p>Bitvavo support does not have a phone number or other contact options and is only reachable by email.</p>
<p>When logging in you have to enter your logging details twice, you have to enter them again after you verified a new
device. This probably has to do something with my cookie settings. Not a huge problem, but a little bit annoying.</p>
<p>The website itself is nice and professional. You can easily manage and trade your assets on the website and for more
advanced trading they have a professional trading environment. The trading volume is large enough so you can trade
quickly for normal market rates.</p>
<img alt="Bitvavo logo" class="align-center" src="/images/bitvavo-advanced-trading.png" style="width: 800px;" />
<p>Bitvavo pays out daily staking rewards, at this moment around 0.77% for Bitcoin, which is really nice.</p>
<p>To transfer bitcoins from Bitvavo to your own wallet, they require you to make a movie from your full screen showing
your wallet addresses. This is not only very insecure for obvious reasons, it is also not legally required anymore
as pointed out by one of their <a class="reference external" href="https://bl3p.eu/nl/news/69/BL3P+vernietigt+onrechtmatig+verzamelde+screenshots">colleagues</a></p>
<p>Bitvavo trading fees are lower than average and decrease for larger volumes. However the Bitcoin withdrawal
fees are pretty high with around 8 euros at this moment. Also I noticed Bitvavo payed a bitcoin transaction fee of 63 times
the market rate, which seems to be an error in their software that could easily be fixed.</p>
</div>
<div class="section" id="pros">
<h2>Pros</h2>
<ul class="simple">
<li>Professional website and trading engine</li>
<li>Based in Netherlands and licensed by De Nederlandse Bank (The Dutch Bank)</li>
<li>Low fees</li>
<li>Staking of Bitcoin and other cryptocurrency</li>
<li>Fair amount of trading volume</li>
</ul>
</div>
<div class="section" id="cons">
<h2>Cons</h2>
<ul class="simple">
<li>Support is limited and unresponsive.</li>
<li>Onboarding is complicated and time consuming</li>
<li>No Lightning support</li>
<li>Insecure address verification</li>
<li>Clumsy login procedure</li>
</ul>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>On <a class="reference external" href="https://bitvavo.com">Bitvavo</a> you can trade Bitcoin and many other cryptocurrencies in a professional trading
environment with a fair amount of volume for relative low fees. Also it is nice to receive staking rewards.</p>
<p>However because of the current problems with support, onboarding and security I would not advise this exchange at the
moment, but if you are looking for a Dutch exchange and not planning to trade large amounts this exchange could be
an option for you.</p>
</div>
Using Bcoin node with BitcoinLib2020-10-16T10:53:00+02:002020-10-16T10:55:00+02:00Lennart Jongeneeltag:coineva.com,2020-10-16:/using-bcoin-node-with-bitcoinlib.html<p class="first last">How to use your Bcoin node in BitcoinLib as service provider</p>
<!-- :slug: using-bcoin-node-with-bitcoinlib: -->
<p>With Python <a class="reference external" href="https://coineva.com/category/bitcoinlib.html">BitcoinLib</a> you can manage wallets and create
and receive transactions. BitcoinLib depends on external service providers such as blockchair.com or
blocksmurfer.io to communicate with the Blockchain. But too be more efficient and increase privacy you can
also setup your local Bcoin node and use this in BitcoinLib.</p>
<p>Bcoin is a full bitcoin node implementation used to parse the blockchain and verify blocks and transactions.
In my previous article you can read how to <a class="reference external" href="https://coineva.com/install-bcoin-node-ubuntu.html">install a Bcoin node</a>.</p>
<div class="section" id="setup-bitcoinlib-to-use-bcoin-node">
<h2>Setup BitcoinLib to use Bcoin node</h2>
<p>First login to your server with the running Bcoin node and check if everything is running as it should.</p>
<div class="highlight"><pre><span></span>$ sudo su - bcoin
$ <span class="nb">cd</span> bcoin/bin
$ ./bcoin-cli block <span class="m">101010</span>
</pre></div>
<p>This should return block 101010 as dictionary.</p>
<p>Checkout the Bcoin config file in .bcoin/bcoin.conf and look for the API key. The API key should be a long
random list of characters. You could use a bitcoin private key for this.</p>
<div class="highlight"><pre><span></span>>>> from bitcoinlib.keys import Key
>>> Key().private_hex
'13729c7f87c56628eb8070214f3bdc62f6904c70c71c465bfffee36e6aa09b39'
</pre></div>
<p>Now go to the Bitcoinlib directory and edit the .bitcoinlib/providers.json file to add an extra service provider.
Add the following json to the provider.json file, make sure to use the correct API key and fill in your server address.</p>
<div class="highlight"><pre><span></span><span class="nt">"bcoin"</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">"provider"</span><span class="p">:</span> <span class="s2">"bcoin"</span><span class="p">,</span>
<span class="nt">"network"</span><span class="p">:</span> <span class="s2">"bitcoin"</span><span class="p">,</span>
<span class="nt">"client_class"</span><span class="p">:</span> <span class="s2">"BcoinClient"</span><span class="p">,</span>
<span class="nt">"provider_coin_id"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span>
<span class="nt">"url"</span><span class="p">:</span> <span class="s2">"https://x:13729c7f87c56628eb8070214f3bdc62f6904c70c71c465bfffee36e6aa09b39@<your_server_ip>:28332/"</span><span class="p">,</span>
<span class="nt">"api_key"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span>
<span class="nt">"priority"</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span>
<span class="nt">"denominator"</span><span class="p">:</span> <span class="mi">100000000</span><span class="p">,</span>
<span class="nt">"network_overrides"</span><span class="p">:</span> <span class="kc">null</span>
<span class="p">},</span>
</pre></div>
<p>The priority is set to 20, which is higher then the default priority of 10. This means the Bcoin provider is tried first
and if this fails another provider will be used.</p>
<p>Let's test if the Bcoin provider is used by Bitcoinlib.</p>
<div class="highlight"><pre><span></span>>>> from bitcoinlib.services.services import Service
>>> srv = Service(providers=['bcoin'])
>>> srv.getblock(101010)
<Block(000000000001af33247fff33aae7c31baee4148d5a189e7353bf13bcee618202, 101010, transactions: 4)>
</pre></div>
<p>It's works! Bitcoinlib will now use your local Bcoin node whenever possible to retrieve and send information
to the blockchain.</p>
<p>If you still encounter problems please check:</p>
<ul class="simple">
<li>Is port 28332 open on your server and local machine? Does it need to be forwarded?</li>
<li>Is SSL correctly setup on the Bcoin server machine, see <a class="reference external" href="https://coineva.com/install-bcoin-node-ubuntu.html">install Bcoin node</a>.</li>
<li>Check the logs in .bitcoinlib/bitcoinlib.log and on the server in .bcoin/debug.log</li>
<li>Check the documentation on <a class="reference external" href="https://github.com/bcoin-org/bcoin/blob/master/docs/README.md">Github Bcoin Docs</a> or <a class="reference external" href="https://bitcoinlib.readthedocs.io/en/latest/">BitcoinLib ReadTheDocs</a></li>
</ul>
<img alt="Bcoin bitcoin node logo" class="align-right" src="/images/bcoin_logo.png" style="width: 451px;" />
</div>
Install Bcoin node on Ubuntu 20.042020-09-17T09:11:00+02:002020-10-16T11:46:00+02:00Lennart Jongeneeltag:coineva.com,2020-09-17:/install-bcoin-node-ubuntu.html<p class="first last">How to install a Bcoin full node on Ubuntu 20.04. Bcoin is an alternative Bitcoin node.</p>
<!-- :slug: install-bcoin-node-ubuntu: -->
<p>Bcoin is a full bitcoin node implementation used to parse the blockchain and verify blocks and transactions.
Besides the standard bitcoin node it has some extra features such as an index on address and transactions.</p>
<p>This makes it possible to query the node for transactions or UTXO's of a specific address. The library Bitcoinlib
can make use of the Bcoin node so it can run locally and doesn't need external blockchain services. The
<a class="reference external" href="https://blocksmurfer.io">Blocksmurfer explorer</a> uses a Bcoin node to query for blocks, transactions and
address data.</p>
<div class="section" id="install-and-build-bcoin">
<h2>Install and build Bcoin</h2>
<img alt="Bcoin bitcoin node logo" class="align-right" src="/images/bcoin_logo.png" style="width: 451px;" />
<p>Make sure you have at least 500GB disk space available for the blockchain database.</p>
<p>Update packages and install required repositories, Node.js and the Node.js package manager npm.</p>
<div class="highlight"><pre><span></span>$ sudo apt update
$ sudo apt upgrade
$ sudo apt install build-essential
$ sudo apt install nodejs
$ sudo apt install npm
</pre></div>
<p>Add a new user, specify a password and login as that user.</p>
<div class="highlight"><pre><span></span>$ sudo adduser bcoin
$ sudo su - bcoin
</pre></div>
<p>Check the latest version of bcoin on <a class="reference external" href="https://github.com/bcoin-org/bcoin/tags">https://github.com/bcoin-org/bcoin/tags</a> and download the code.</p>
<div class="highlight"><pre><span></span>$ git clone --depth <span class="m">1</span> --branch v2.1.2 https://github.com/bcoin-org/bcoin.git
$ <span class="nb">cd</span> bcoin
</pre></div>
<p>Then rebuild the bcoin package. This can take a pretty long time.</p>
<div class="highlight"><pre><span></span>$ npm rebuild
</pre></div>
<p>Let's test it!</p>
<div class="highlight"><pre><span></span>$ ./bin/bcoin
</pre></div>
<p>It should now start downloading and parsing blocks. Press Ctrl-C to stop downloading so we can change some settings
first.</p>
</div>
<div class="section" id="bcoin-setup">
<h2>Bcoin Setup</h2>
<p>[OPTIONAL] Setup SSL and create private key and certificate.</p>
<div class="highlight"><pre><span></span>$ <span class="nb">cd</span>
$ <span class="nb">cd</span> .bcoin
$ mkdir ssl
$ <span class="nb">cd</span> ssl
$ openssl req -newkey rsa:2048 -new -nodes -x509 -days <span class="m">3650</span> -keyout privkey.pem -out cert.pem
</pre></div>
<p>[OPTIONAL] Setup firewall. Depends of course on the system and firewall you are using.</p>
<div class="highlight"><pre><span></span>$ sudo ufw allow <span class="m">28332</span>
</pre></div>
<p>Go to the newly create .bcoin directory in the home folder and create a bcoin.conf file.</p>
<div class="highlight"><pre><span></span>$ <span class="nb">cd</span>
$ <span class="nb">cd</span> .bcoin
$ nano bcoin.conf
</pre></div>
<p>Add the following contents to the bcoin.conf file. The main settings are put there as an example. Update to your
own needs and make sure to create your own secure API key. For more configuration settings see
<a class="reference external" href="https://github.com/bcoin-org/bcoin/blob/master/docs/configuration.md">https://github.com/bcoin-org/bcoin/blob/master/docs/configuration.md</a></p>
<div class="highlight"><pre><span></span># Bcoin.conf configuration example by Coineva
#
# HTTP host to listen on (default: 127.0.0.1). Use 0.0.0.0 to listen to all
http-host: 0.0.0.0
# HTTP port to listen on (default: 8332 for mainnet). Use another port if a bitcoind node is already running
#http-port: 28332
# Port to listen on (default: 8333)
#port: 28333
# Index transactions (enables transaction endpoints in REST api)
index-tx: true
# Index transactions and utxos by address
index-address: true
# Public host and port to advertise on network
#public-host: 0.0.0.0
#public-port: 8444
# API key - Please enter your own secure (hexadecimal) key!
api-key: replace-with-long-and-random-api-key
# Use SSL
ssl: true
ssl-cert: @/ssl/cert.pem
ssl-key: @/ssl/privkey.pem
</pre></div>
<p>Now test again and see if 'txindexer' and 'addrindexer' show up in the logs. Abort with Ctrl-C</p>
<div class="highlight"><pre><span></span>$ ~/bcoin/bin/bcoin
</pre></div>
</div>
<div class="section" id="create-a-service-and-download-blockchain">
<h2>Create a service and download blockchain</h2>
<p>Create a service to manage the bcoin process.</p>
<div class="highlight"><pre><span></span>$ <span class="nb">logout</span>
$ sudo nano /lib/systemd/system/bcoin.service
</pre></div>
<div class="highlight"><pre><span></span>[Unit]
Description=Bcoin daemon
After=network.target
[Service]
ExecStart=/home/bcoin/bcoin/bin/bcoin --daemon
# Process management
####################
Type=forking
Restart=on-failure
TimeoutStopSec=600
# Directory creation and permissions
####################################
User=bcoin
Group=bcoin
[Install]
WantedBy=multi-user.target
</pre></div>
<p>Start service and check status.</p>
<div class="highlight"><pre><span></span>$ sudo systemctl start bcoin
$ sudo systemctl status bcoin
</pre></div>
<p>Enable at startup.</p>
<div class="highlight"><pre><span></span>$ sudo systemctl <span class="nb">enable</span> bcoin
</pre></div>
<p>Some command to check the progress of your download and logs.</p>
<div class="highlight"><pre><span></span>$ sudo su - bcoin
$ ./bcoin/bin/bcoin-cli info
$ ./bcoin/bin/bcoin-cli --help
$ tail -f .bcoin/debug.log
</pre></div>
<p>Your full Bcoin node is now up and running! Downloading and parsing the blockchain can hours or days, depending on
the system.</p>
<p>You can run some tests to see if everything is working.</p>
<div class="highlight"><pre><span></span>$ sudo su - bcoin
$ <span class="nb">cd</span> bcoin/bin
$ ./bcoin-cli block <span class="m">0</span>
$ ./bcoin-cli tx 1HLoD9E4SDFFPDiYfNYnkBLQ85Y51J3Zb1
$ ./bcoin-cli rpc getrawtransaction 9b0fc92260312ce44e74ef369f5c66bbb85848f2eddd5a7a1cde251e54ccfdd5
</pre></div>
<p>For a full list of commands run 'bcoin-cli help' or 'bcoin-cli rpc help'. All documentation of Bcoin can be found
at <a class="reference external" href="https://github.com/bcoin-org/bcoin/tree/master/docs">https://github.com/bcoin-org/bcoin/tree/master/docs</a></p>
</div>
History of Block versions2020-07-08T11:54:00+02:002020-07-10T10:21:00+02:00Lennart Jongeneeltag:coineva.com,2020-07-08:/block-version-history.html<p class="first last">An overview of the use of the version attribute in Bitcoin blocks. Protocol signaling from the genesis block to Bitcoin Civil war and beyond.</p>
<!-- :slug: block-version-history: -->
<p>For my new <a class="reference external" href="https://blocksmurfer.io">Blocksmurfer explorer</a> I needed to investigate the block versions used in
the history of Bitcoin to be able to analyse and parse those blocks. Every block on the Bitcoin Blockchain starts
with a 4 byte version number, indicating which software is used to create the block and which BIPs
(Bitcoin Improvement Proposals) it supports.</p>
<p>By looking at the block version we will get an overview of the main protocol changes in Bitcoin in the past.</p>
<p>To create the graphs Matplotlib is used, a local bitcoin node provided the blockchain and Bitcoinlib parsed the blocks.
All blocks from the genesis block 0 to block 635000 from June 2020 are taken into account.</p>
<div class="section" id="the-first-era-block-versions-as-integers">
<h2>The first era - Block versions as integers</h2>
<p>In the first 400000 blocks or so, the version bytes represented a simple integer. And in this first era 3 new
protocol changes are adopted with the version numbers 2, 3 and 4.</p>
<p>As you can see in the graph below the first version change was a bit after block 200000 in the year 2012. The block
version changed from version 1 to 2. The graphs show which percent of the blocks was using a specific version
number per 1000 blocks.</p>
<p>This change was passed in a relatively short time and introduced <a class="reference external" href="https://en.bitcoin.it/wiki/BIP_0034">BIP0034</a>.
In this protocol change the block height was added to the locking script (scripSig) of the coinbase transaction.
By adding the height to the coinbase transaction duplicate transaction IDs are avoided and it also creates a way
to extract block height from a block without other knowledge.</p>
<img alt="Block version history block 0 to 630000" class="align-center" src="/images/block_version_history_0_630000.png" style="width: 1600px;" />
<p>Then around block 370000 in 2015 <a class="reference external" href="https://en.bitcoin.it/wiki/BIP_0066">BIP0066</a> was adopted. This protocol
enforced strict DER encoding for signatures. Previously DER signatures which did not follow the standard would
be marked as valid by a bitcoin node, causing problems if the underlying software (i.e. OpenSSL) of a
bitcoin node changes.</p>
<p>Then shortly after this a new protocol change <a class="reference external" href="https://en.bitcoin.it/wiki/BIP_0065">BIP0065</a> was accepted by
the network. This allowed to create transactions which are only spendable after a certain date or block height using the
CHECKLOCKTIMEVERIFY opcode.</p>
</div>
<div class="section" id="the-second-era-introduction-of-a-new-versioning-system">
<h2>The Second era - Introduction of a new versioning system</h2>
<p>The integer based versioning system had as disadvantage that only one protocol change can be signaled at once.
The versioning system described in proposal <a class="reference external" href="https://en.bitcoin.it/wiki/BIP_0009">BIP0009</a> uses the 4 byte version
as 32 individual bits. The first 3 bits are used to indicate which versioning system is used, currently '001' and the
other 29 bits can be used to signal a specific protocol change.</p>
<p>So if you look at <a class="reference external" href="https://blocksmurfer.io/btc/block/416000">block 416000</a> for instance you see the block version in
bytes is 0b00100000000000000000000000000001. So the versioning system is 001 and the last bit is set to 1 to signal a
new protocol, BIP0068 in this case.</p>
<p>As you can see in the graph below BIP0009 was accepted shortly after block 415000 in 2016. And at the same time
<a class="reference external" href="https://en.bitcoin.it/wiki/BIP_0068">BIP0068</a> was accepted including the related BIP0112 and BIP0113. This was
an important update allowing to create payment channels and paved the way for the lightning network. The sequence part
of a transaction input is used as locktime, allowing to lock the input until a certain block or timestamp using
the CHECKSEQUENCEVERIFY opcode.</p>
<img alt="BIP9 and BIP68 - Block version history" class="align-center" src="/images/block_version_history_400000_430000.png" style="width: 1600px;" />
<p>In the graph above, you also see the BIP0109 proposal in the 5% region, it was a more controversial proposal
to increase to block size to 2Mb. It was never accepted but more proposals would follow starting a fierce debate.</p>
</div>
<div class="section" id="the-third-era-block-size-segwit-and-the-bitcoin-civil-war">
<h2>The Third era - Block size, Segwit and the Bitcoin Civil war</h2>
<p>At the end of 2015 Segregated Witness or Segwit was presented in <a class="reference external" href="https://en.bitcoin.it/wiki/BIP_0141">BIP0141</a>,
BIP0143, BIP0147. With segwit the signatures (witnesses) are separated from the inputs.
Segwit was one of the biggest changes to the bitcoin protocol so far, it fixed transaction
malleability, increased block capacity, incentives to reduce the number of unspent outputs (utxo pool),
reduces network traffic for SPV client and increased multisig safety among other benefits.</p>
<p>It took a long time and lot of discussions before Segwit got adopted as you can see below. For some reason
the discussion got really political and a lot of virtual mud was slinging around. Some even called it
<a class="reference external" href="https://www.google.com/search?q=bitcoin+civil+war">Bitcoin civil war</a>. The block size debate was roughly between
people who oppose Segwit and wanted to increase the block size and people who want Segwit without block size increase.</p>
<img alt="Segwit adoption - Block version history" class="align-center" src="/images/block_version_history_430000_500000.png" style="width: 1600px;" />
<p>After a while as a compromise <a class="reference external" href="https://en.bitcoin.it/wiki/BIP_0091">BIP0091</a> or Reduced threshold Segwit MASF was
created in which miners and Bitcoin companies declared to activate Segwit and increase the block size to 2Mb. As you
can see in the graph below Segwit was activated shortly BIP91 was accepted. The hard-fork block size increase was
never adopted.</p>
<img alt="BIP91 Segwit2Mb - Block version history" class="align-center" src="/images/block_version_history_475000_478000.png" style="width: 1600px;" />
</div>
<div class="section" id="recent-history">
<h2>Recent History</h2>
<p>After Segwit no changes to the Bitcoin protocol have been introduced. You can see BIP0310 in the top graph, but
this isn't a protocol change. It is version rolling system used by the miners. Basically they add some extra data
in the first two bytes of the version number of a block.</p>
</div>
Crypto Administration 2 - Recreate old wallets2020-05-11T09:20:00+02:002020-06-11T09:48:00+02:00Lennart Jongeneeltag:coineva.com,2020-05-11:/crypto-tax-administration-2-recreate-old-wallets.html<p class="first last">Recreate old wallets for your tax administration with Bitcoinlib</p>
<!-- :slug: crypto-tax-administration-2-recreate-old-wallets: -->
<p>It's much easier to create a new cryptocurrency wallet than opening a bank account, so it can happen, you have
created a lot of wallets during your bitcoin career. And as a logical result, you might miss some information
from old wallets.</p>
<p>But if you still remember a couple of addresses you can recreate the wallet and all of its transactions with
<a class="reference external" href="https://coineva.com/python-bitcoin-library.html">Python Bitcoin library</a> by creating a new readonly wallet.</p>
<img alt="Ancient wallet - source Wikipedia" class="align-center" src="/images/Aleutianwallet.gif" style="width: 824px;" />
<div class="section" id="cryptalyse">
<h2>Cryptalyse</h2>
<p>Install Cryptalyse to allow to analyse, reconstruct and export wallets with Bitcoinlib more easily.</p>
<div class="highlight"><pre><span></span>$ git clone https://github.com/1200wd/cryptalyse.git
</pre></div>
<p>Cryptalyse contains a class CryptalyseWallet based on the HDWallet class from Bitcoinlib with some extra helper methods.
This class adds a clusters() and inputs_correlated() method which looks for correlated inputs. For instance, if
a transaction contains 2 or more inputs, you can assume those inputs are created by the same person and the used
addresses belong to the same wallet.</p>
<p>You can check out the source code at <a class="reference external" href="https://github.com/1200wd/cryptalyse">https://github.com/1200wd/cryptalyse</a>.</p>
<div class="section" id="recreate-wallet">
<h3>Recreate Wallet</h3>
<p>Assume you want to recover transactions in an old wallet of which you only know 2 addresses. First create a wallet
with the first address.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">cryptalyse.cryptalyse</span> <span class="kn">import</span> <span class="n">CryptalyseWallet</span>
<span class="o">>>></span> <span class="n">w</span> <span class="o">=</span> <span class="n">CryptalyseWallet</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="s1">'reconstructed'</span><span class="p">,</span> <span class="s1">'tb1qe7h6l8sg7nf8z0rz6a4kfgavatjjac5qardt5z'</span><span class="p">)</span>
</pre></div>
<p>If you now update the wallet, you can see it found 2 transactions with this address.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">scan</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
<span class="o">===</span> <span class="n">WALLET</span> <span class="o">===</span>
<span class="n">ID</span> <span class="mi">2</span>
<span class="n">Name</span> <span class="n">reconstructed</span>
<span class="n">Owner</span>
<span class="n">Scheme</span> <span class="n">single</span>
<span class="n">Multisig</span> <span class="kc">False</span>
<span class="n">Witness</span> <span class="nb">type</span> <span class="n">segwit</span>
<span class="n">Main</span> <span class="n">network</span> <span class="n">testnet</span>
<span class="n">Latest</span> <span class="n">update</span> <span class="mi">2020</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">11</span> <span class="mi">10</span><span class="p">:</span><span class="mi">59</span><span class="p">:</span><span class="mf">30.056860</span>
<span class="o">=</span> <span class="n">Wallet</span> <span class="n">Master</span> <span class="n">Key</span> <span class="o">=</span>
<span class="n">ID</span> <span class="mi">11</span>
<span class="n">Private</span> <span class="kc">False</span>
<span class="n">Depth</span> <span class="mi">0</span>
<span class="o">-</span> <span class="n">NETWORK</span><span class="p">:</span> <span class="n">testnet</span> <span class="o">-</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Keys</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Transactions</span> <span class="n">Account</span> <span class="mi">0</span> <span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="mi">356</span><span class="n">d8aa5dbf816e499cae8329811d9baa7aa46d1dfd68d33d7819c78f64206ff</span> <span class="n">tb1qe7h6l8sg7nf8z0rz6a4kfgavatjjac5qardt5z</span> <span class="mi">110982</span> <span class="mi">9000</span>
<span class="n">ab4f559c4d1ed91f20089b124009597f281f54bbcaa8ae96d1779f97856722f6</span> <span class="n">tb1qe7h6l8sg7nf8z0rz6a4kfgavatjjac5qardt5z</span> <span class="mi">110972</span> <span class="o">-</span><span class="mi">9000</span>
<span class="o">=</span> <span class="n">Balance</span> <span class="n">Totals</span> <span class="p">(</span><span class="n">includes</span> <span class="n">unconfirmed</span><span class="p">)</span> <span class="o">=</span>
</pre></div>
<p>When you use the extra methods from Cryptalyse you can see 1 correlated address is found, and the wallet consists of
1 cluster with 2 addresses.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">inputs_correlated</span>
<span class="p">[</span><span class="s1">'tb1qvlnztnn6eqr02c7gte2gmnda3x7js5jcws2gh4'</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">clusters</span><span class="p">()</span>
<span class="p">[{</span><span class="s1">'tb1qvlnztnn6eqr02c7gte2gmnda3x7js5jcws2gh4'</span><span class="p">,</span> <span class="s1">'tb1qe7h6l8sg7nf8z0rz6a4kfgavatjjac5qardt5z'</span><span class="p">}]</span>
</pre></div>
<p>If you look at the second transaction, you can see why the addresses are correlated. They are both used as input in the
same transaction.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">transactions</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
<span class="n">Transaction</span> <span class="n">ab4f559c4d1ed91f20089b124009597f281f54bbcaa8ae96d1779f97856722f6</span>
<span class="n">Date</span><span class="p">:</span> <span class="mi">2019</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">16</span> <span class="mi">19</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">50</span>
<span class="n">Network</span><span class="p">:</span> <span class="n">testnet</span>
<span class="n">Version</span><span class="p">:</span> <span class="mi">1</span>
<span class="n">Witness</span> <span class="nb">type</span><span class="p">:</span> <span class="n">segwit</span>
<span class="n">Status</span><span class="p">:</span> <span class="n">confirmed</span>
<span class="n">Verified</span><span class="p">:</span> <span class="kc">False</span>
<span class="n">Inputs</span>
<span class="o">-</span> <span class="n">tb1qe7h6l8sg7nf8z0rz6a4kfgavatjjac5qardt5z</span> <span class="mi">9000</span> <span class="mi">356</span><span class="n">d8aa5dbf816e499cae8329811d9baa7aa46d1dfd68d33d7819c78f64206ff</span> <span class="mi">1</span>
<span class="n">segwit</span> <span class="n">sig_pubkey</span><span class="p">;</span> <span class="n">sigs</span><span class="p">:</span> <span class="mi">0</span> <span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">of</span><span class="o">-</span><span class="mi">0</span><span class="p">)</span> <span class="ow">not</span> <span class="n">validated</span>
<span class="o">-</span> <span class="n">tb1qvlnztnn6eqr02c7gte2gmnda3x7js5jcws2gh4</span> <span class="mi">8000</span> <span class="n">b11291114358ba84e4e9e644ef5e1e92d240f7c04c55a0fe34050a97d7336d41</span> <span class="mi">0</span>
<span class="n">segwit</span> <span class="n">sig_pubkey</span><span class="p">;</span> <span class="n">sigs</span><span class="p">:</span> <span class="mi">0</span> <span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">of</span><span class="o">-</span><span class="mi">0</span><span class="p">)</span> <span class="ow">not</span> <span class="n">validated</span>
<span class="n">Outputs</span>
<span class="o">-</span> <span class="mi">2</span><span class="n">NGZrVvZG92qGYqzTLjCAewvPZ7JE8S8VxE</span> <span class="mi">9000</span> <span class="n">p2sh</span> <span class="n">S</span>
<span class="o">-</span> <span class="n">tb1qq0k9jh4npm5y7dgy5uj759ysgq6uzv7sp857np</span> <span class="mi">6346</span> <span class="n">p2wpkh</span> <span class="n">S</span>
<span class="n">Size</span><span class="p">:</span> <span class="mi">372</span>
<span class="n">Vsize</span><span class="p">:</span> <span class="mi">372</span>
<span class="n">Fee</span><span class="p">:</span> <span class="mi">1654</span>
<span class="n">Confirmations</span><span class="p">:</span> <span class="mi">110972</span>
<span class="n">Pushed</span> <span class="n">to</span> <span class="n">network</span><span class="p">:</span> <span class="kc">False</span>
<span class="n">Wallet</span><span class="p">:</span> <span class="n">reconstructed</span>
</pre></div>
</div>
<div class="section" id="import-addresses">
<h3>Import addresses</h3>
<p>We can now import the correlated address we found and add the other address we know to the wallet.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">bitcoinlib.keys</span> <span class="kn">import</span> <span class="n">Address</span>
<span class="o">>>></span> <span class="n">key</span> <span class="o">=</span> <span class="n">Address</span><span class="o">.</span><span class="n">import_address</span><span class="p">(</span><span class="s1">'tb1qvlnztnn6eqr02c7gte2gmnda3x7js5jcws2gh4'</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">import_key</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="o"><</span><span class="n">HDWalletKey</span><span class="p">(</span><span class="n">key_id</span><span class="o">=</span><span class="mi">12</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">import_key_00001</span><span class="p">,</span> <span class="n">wif</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">import_key_00001</span><span class="p">)</span><span class="o">></span>
<span class="o">>>></span> <span class="n">key</span> <span class="o">=</span> <span class="n">Address</span><span class="o">.</span><span class="n">import_address</span><span class="p">(</span><span class="s1">'tb1q35cc0y9tfp0mswskpkka7cxqpap4st4wpzkewv'</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">import_key</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="o"><</span><span class="n">HDWalletKey</span><span class="p">(</span><span class="n">key_id</span><span class="o">=</span><span class="mi">13</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">import_key_00002</span><span class="p">,</span> <span class="n">wif</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">import_key_00002</span><span class="p">)</span><span class="o">></span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">scan</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
<span class="o">===</span> <span class="n">WALLET</span> <span class="o">===</span>
<span class="n">ID</span> <span class="mi">2</span>
<span class="n">Name</span> <span class="n">reconstructed</span>
<span class="n">Owner</span>
<span class="n">Scheme</span> <span class="n">single</span>
<span class="n">Multisig</span> <span class="kc">False</span>
<span class="n">Witness</span> <span class="nb">type</span> <span class="n">segwit</span>
<span class="n">Main</span> <span class="n">network</span> <span class="n">testnet</span>
<span class="n">Latest</span> <span class="n">update</span> <span class="mi">2020</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">11</span> <span class="mi">11</span><span class="p">:</span><span class="mi">23</span><span class="p">:</span><span class="mf">20.486931</span>
<span class="o">=</span> <span class="n">Wallet</span> <span class="n">Master</span> <span class="n">Key</span> <span class="o">=</span>
<span class="n">ID</span> <span class="mi">11</span>
<span class="n">Private</span> <span class="kc">False</span>
<span class="n">Depth</span> <span class="mi">0</span>
<span class="o">-</span> <span class="n">NETWORK</span><span class="p">:</span> <span class="n">testnet</span> <span class="o">-</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Keys</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Transactions</span> <span class="n">Account</span> <span class="mi">0</span> <span class="p">(</span><span class="mi">6</span><span class="p">)</span>
<span class="mi">356</span><span class="n">d8aa5dbf816e499cae8329811d9baa7aa46d1dfd68d33d7819c78f64206ff</span> <span class="n">tb1qe7h6l8sg7nf8z0rz6a4kfgavatjjac5qardt5z</span> <span class="mi">110983</span> <span class="mi">9000</span>
<span class="mi">82</span><span class="n">a3ee8315bad3e188a49b95e62442acf315615a1da7d4e6eaef05f259145897</span> <span class="n">tb1q35cc0y9tfp0mswskpkka7cxqpap4st4wpzkewv</span> <span class="mi">110983</span> <span class="mi">5000</span>
<span class="n">b11291114358ba84e4e9e644ef5e1e92d240f7c04c55a0fe34050a97d7336d41</span> <span class="n">tb1qvlnztnn6eqr02c7gte2gmnda3x7js5jcws2gh4</span> <span class="mi">110982</span> <span class="mi">8000</span>
<span class="n">ab4f559c4d1ed91f20089b124009597f281f54bbcaa8ae96d1779f97856722f6</span> <span class="n">tb1qe7h6l8sg7nf8z0rz6a4kfgavatjjac5qardt5z</span> <span class="mi">110973</span> <span class="o">-</span><span class="mi">9000</span>
<span class="n">ab4f559c4d1ed91f20089b124009597f281f54bbcaa8ae96d1779f97856722f6</span> <span class="n">tb1qvlnztnn6eqr02c7gte2gmnda3x7js5jcws2gh4</span> <span class="mi">110973</span> <span class="o">-</span><span class="mi">8000</span>
<span class="n">dc4a01d552631920475940135459592629c72c0f3b8fa2a77e025ed6fbb6317c</span> <span class="n">tb1q35cc0y9tfp0mswskpkka7cxqpap4st4wpzkewv</span> <span class="mi">110972</span> <span class="o">-</span><span class="mi">5000</span>
<span class="o">=</span> <span class="n">Balance</span> <span class="n">Totals</span> <span class="p">(</span><span class="n">includes</span> <span class="n">unconfirmed</span><span class="p">)</span> <span class="o">=</span>
</pre></div>
<p>Some new transactions are found. And if we look the correlated addresses and clusters, we see 2 clusters of addresses
and a new correlated address. Which we can also add to the wallet.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">inputs_correlated</span>
<span class="p">[</span><span class="s1">'tb1qq0k9jh4npm5y7dgy5uj759ysgq6uzv7sp857np'</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">clusters</span><span class="p">()</span>
<span class="p">[{</span><span class="s1">'tb1qvlnztnn6eqr02c7gte2gmnda3x7js5jcws2gh4'</span><span class="p">,</span> <span class="s1">'tb1qe7h6l8sg7nf8z0rz6a4kfgavatjjac5qardt5z'</span><span class="p">},</span> <span class="p">{</span><span class="s1">'tb1qq0k9jh4npm5y7dgy5uj759ysgq6uzv7sp857np'</span><span class="p">,</span> <span class="s1">'tb1q35cc0y9tfp0mswskpkka7cxqpap4st4wpzkewv'</span><span class="p">}]</span>
<span class="o">>>></span> <span class="n">key</span> <span class="o">=</span> <span class="n">Address</span><span class="o">.</span><span class="n">import_address</span><span class="p">(</span><span class="s1">'tb1qq0k9jh4npm5y7dgy5uj759ysgq6uzv7sp857np'</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">import_key</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="o"><</span><span class="n">HDWalletKey</span><span class="p">(</span><span class="n">key_id</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">import_key_00003</span><span class="p">,</span> <span class="n">wif</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">import_key_00003</span><span class="p">)</span><span class="o">></span>
</pre></div>
<p>After a rescan, we see no correlated inputs are found. So we now we have reconstructed the wallet.</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">scan</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">inputs_correlated</span>
<span class="p">[]</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
<span class="o">===</span> <span class="n">WALLET</span> <span class="o">===</span>
<span class="n">ID</span> <span class="mi">2</span>
<span class="n">Name</span> <span class="n">reconstructed</span>
<span class="n">Owner</span>
<span class="n">Scheme</span> <span class="n">single</span>
<span class="n">Multisig</span> <span class="kc">False</span>
<span class="n">Witness</span> <span class="nb">type</span> <span class="n">segwit</span>
<span class="n">Main</span> <span class="n">network</span> <span class="n">testnet</span>
<span class="n">Latest</span> <span class="n">update</span> <span class="mi">2020</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">11</span> <span class="mi">11</span><span class="p">:</span><span class="mi">39</span><span class="p">:</span><span class="mf">37.420613</span>
<span class="o">=</span> <span class="n">Wallet</span> <span class="n">Master</span> <span class="n">Key</span> <span class="o">=</span>
<span class="n">ID</span> <span class="mi">11</span>
<span class="n">Private</span> <span class="kc">False</span>
<span class="n">Depth</span> <span class="mi">0</span>
<span class="o">-</span> <span class="n">NETWORK</span><span class="p">:</span> <span class="n">testnet</span> <span class="o">-</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Keys</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Transactions</span> <span class="n">Account</span> <span class="mi">0</span> <span class="p">(</span><span class="mi">8</span><span class="p">)</span>
<span class="mi">356</span><span class="n">d8aa5dbf816e499cae8329811d9baa7aa46d1dfd68d33d7819c78f64206ff</span> <span class="n">tb1qe7h6l8sg7nf8z0rz6a4kfgavatjjac5qardt5z</span> <span class="mi">110985</span> <span class="mi">9000</span>
<span class="mi">82</span><span class="n">a3ee8315bad3e188a49b95e62442acf315615a1da7d4e6eaef05f259145897</span> <span class="n">tb1q35cc0y9tfp0mswskpkka7cxqpap4st4wpzkewv</span> <span class="mi">110984</span> <span class="mi">5000</span>
<span class="n">b11291114358ba84e4e9e644ef5e1e92d240f7c04c55a0fe34050a97d7336d41</span> <span class="n">tb1qvlnztnn6eqr02c7gte2gmnda3x7js5jcws2gh4</span> <span class="mi">110983</span> <span class="mi">8000</span>
<span class="n">ab4f559c4d1ed91f20089b124009597f281f54bbcaa8ae96d1779f97856722f6</span> <span class="n">tb1qe7h6l8sg7nf8z0rz6a4kfgavatjjac5qardt5z</span> <span class="mi">110975</span> <span class="o">-</span><span class="mi">9000</span>
<span class="n">ab4f559c4d1ed91f20089b124009597f281f54bbcaa8ae96d1779f97856722f6</span> <span class="n">tb1qvlnztnn6eqr02c7gte2gmnda3x7js5jcws2gh4</span> <span class="mi">110975</span> <span class="o">-</span><span class="mi">8000</span>
<span class="n">ab4f559c4d1ed91f20089b124009597f281f54bbcaa8ae96d1779f97856722f6</span> <span class="n">tb1qq0k9jh4npm5y7dgy5uj759ysgq6uzv7sp857np</span> <span class="mi">110975</span> <span class="mi">6346</span>
<span class="n">dc4a01d552631920475940135459592629c72c0f3b8fa2a77e025ed6fbb6317c</span> <span class="n">tb1q35cc0y9tfp0mswskpkka7cxqpap4st4wpzkewv</span> <span class="mi">110974</span> <span class="o">-</span><span class="mi">5000</span>
<span class="n">dc4a01d552631920475940135459592629c72c0f3b8fa2a77e025ed6fbb6317c</span> <span class="n">tb1qq0k9jh4npm5y7dgy5uj759ysgq6uzv7sp857np</span> <span class="mi">110974</span> <span class="o">-</span><span class="mi">6346</span>
<span class="o">=</span> <span class="n">Balance</span> <span class="n">Totals</span> <span class="p">(</span><span class="n">includes</span> <span class="n">unconfirmed</span><span class="p">)</span> <span class="o">=</span>
</pre></div>
<p>The code this example is based on can be found on
<a class="reference external" href="https://github.com/1200wd/cryptalyse/blob/master/example_wallet_reconstruction.py">Github</a>.</p>
</div>
</div>
Crypto Administration Part 12019-11-19T21:16:00+01:002020-06-11T09:49:00+02:00Lennart Jongeneeltag:coineva.com,2019-11-19:/crypto-tax-administration-1.html<p class="first last">Setting up a basic cryptocurrency administration with python Bitcoinlib</p>
<!-- :slug: crypto-tax-administration-1: -->
<p>When you are using cryptocurrency, no matter in what jurisdiction you're in, sooner or later you will have to set up
a decent administration to comply with your tax obligations. Unfortunately, not a lot of accounting software supports crypto.
And furthermore, most exchanges and wallets miss basic overviews and export functionality.</p>
<p>With some help of the <a class="reference external" href="https://coineva.com/python-bitcoin-library.html">Python Bitcoin library</a> I will show some tricks
to help you set up a crypto administration. In this article we write some code to export wallets and transactions.</p>
<img alt="Pay bitcoin taxes!" class="align-center" src="/images/bitcoin-tax.png" style="width: 824px;" />
<div class="section" id="setup-readonly-wallet">
<h2>Setup readonly wallet</h2>
<p>If you have the public master key or public account key, you can use that key to setup a readonly wallet with
bitcoinlib. The wallet below uses the bitcoin testnet3 network, but you can also specify the bitcoin, litecoin or dash
network.</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">bitcoinlib.wallets</span> <span class="kn">import</span> <span class="n">wallet_create_or_open</span>
<span class="n">wif_pub</span> <span class="o">=</span> \
<span class="s1">'vpub5YZfEsEFSSDQ9tujabYZoEcwpiFhx7Yzeto99E8sy4F2j6tw9zMnJU6F3grzxKDeEJ6MsKHeoMkxB6hUBnWJKhGy7ZVcT3ZmjjRfDv4hNwe'</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">wallet_create_or_open</span><span class="p">(</span><span class="s1">'Shopping Wallet'</span><span class="p">,</span> <span class="n">wif_pub</span><span class="p">)</span>
<span class="n">w</span><span class="o">.</span><span class="n">scan</span><span class="p">(</span><span class="n">scan_gap_limit</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">w</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
</pre></div>
<p>This will set up the wallet, generate keys and download transactions from various bitcoin service providers. The
wallet's info() method shows the addresses and transactions.</p>
<div class="highlight"><pre><span></span><span class="o">===</span> <span class="n">WALLET</span> <span class="o">===</span>
<span class="n">ID</span> <span class="mi">1</span>
<span class="n">Name</span> <span class="n">Shopping</span> <span class="n">Wallet</span>
<span class="n">Owner</span>
<span class="n">Scheme</span> <span class="n">bip32</span>
<span class="n">Multisig</span> <span class="kc">False</span>
<span class="n">Witness</span> <span class="nb">type</span> <span class="n">segwit</span>
<span class="n">Main</span> <span class="n">network</span> <span class="n">testnet</span>
<span class="n">Latest</span> <span class="n">update</span> <span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">22</span><span class="p">:</span><span class="mi">18</span><span class="p">:</span><span class="mf">43.260711</span>
<span class="o">=</span> <span class="n">Wallet</span> <span class="n">Master</span> <span class="n">Key</span> <span class="o">=</span>
<span class="n">ID</span> <span class="mi">1</span>
<span class="n">Private</span> <span class="kc">False</span>
<span class="n">Depth</span> <span class="mi">3</span>
<span class="o">-</span> <span class="n">NETWORK</span><span class="p">:</span> <span class="n">testnet</span> <span class="o">-</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Keys</span>
<span class="mi">5</span> <span class="n">M</span><span class="o">/</span><span class="mi">0</span><span class="o">/</span><span class="mi">2</span> <span class="n">tb1q4f479gwsp900wl9l8g2tf5007x2xz9qdn7mtjw</span> <span class="n">address</span> <span class="n">index</span> <span class="mi">2</span> <span class="mf">0.00010000</span> <span class="n">TBTC</span>
<span class="mi">6</span> <span class="n">M</span><span class="o">/</span><span class="mi">0</span><span class="o">/</span><span class="mi">3</span> <span class="n">tb1q8ltg9f73tm26w7fz7l3qsujlhktnjancpxkffd</span> <span class="n">address</span> <span class="n">index</span> <span class="mi">3</span> <span class="mf">0.00011700</span> <span class="n">TBTC</span>
<span class="mi">7</span> <span class="n">M</span><span class="o">/</span><span class="mi">0</span><span class="o">/</span><span class="mi">4</span> <span class="n">tb1qsqhgtwrju08gglmf6gvajvffwxhjh8vzvnykqx</span> <span class="n">address</span> <span class="n">index</span> <span class="mi">4</span> <span class="mf">0.00000000</span> <span class="n">TBTC</span>
<span class="mi">18</span> <span class="n">M</span><span class="o">/</span><span class="mi">1</span><span class="o">/</span><span class="mi">9</span> <span class="n">tb1qsjddg0rd54z450kz00xm0nfl44qvewfqa82xsl</span> <span class="n">address</span> <span class="n">index</span> <span class="mi">9</span> <span class="mf">0.00287950</span> <span class="n">TBTC</span>
<span class="mi">19</span> <span class="n">M</span><span class="o">/</span><span class="mi">1</span><span class="o">/</span><span class="mi">10</span> <span class="n">tb1qjazjs9tm7xvckmhdn65fcy2dtsjh89cceer7hq</span> <span class="n">address</span> <span class="n">index</span> <span class="mi">10</span> <span class="mf">0.00105173</span> <span class="n">TBTC</span>
<span class="mi">20</span> <span class="n">M</span><span class="o">/</span><span class="mi">1</span><span class="o">/</span><span class="mi">11</span> <span class="n">tb1qda0nxl7sgyrwrje9lvkqh30zfs9uudnwnlrsdk</span> <span class="n">address</span> <span class="n">index</span> <span class="mi">11</span> <span class="mf">0.00000000</span> <span class="n">TBTC</span>
<span class="o">-</span> <span class="o">-</span> <span class="n">Transactions</span> <span class="n">Account</span> <span class="mi">0</span> <span class="p">(</span><span class="mi">27</span><span class="p">)</span>
<span class="mi">7722</span><span class="n">a3c7bd0934522767564943e92a22caaca69e05eec9fbce23fe0a98f044f0</span> <span class="n">tb1qn36t5vw5ddr7mqukhgvem2wkj9hwjlymtw8j5g</span> <span class="mi">40</span> <span class="mi">1000000</span>
<span class="mi">00</span><span class="n">c76570c0eb91dfd3c644f6321db4de8e0983d2d0528276abeb08aaae9979a8</span> <span class="n">tb1q7fm9fvs62q76vgk5q998a35jyhpusprvm6j3w4</span> <span class="mi">39</span> <span class="mi">1000000</span>
<span class="mi">9</span><span class="n">fbc417ea3bcd8bd076bbac7a481dc7852c8e168173c70955a97e830cd93fab4</span> <span class="n">tb1q4f479gwsp900wl9l8g2tf5007x2xz9qdn7mtjw</span> <span class="mi">37</span> <span class="mi">10000</span> <span class="n">U</span>
<span class="n">eff479895812039b2f4bcea508989bd3498df1595afc028570323a79f21d8693</span> <span class="n">tb1q8ltg9f73tm26w7fz7l3qsujlhktnjancpxkffd</span> <span class="mi">37</span> <span class="mi">7700</span> <span class="n">U</span>
<span class="mi">7</span><span class="n">af39e591a11962cedf6f433f657670d5f0335663788035d9dbe8c0cb7209fb4</span> <span class="n">tb1q8ltg9f73tm26w7fz7l3qsujlhktnjancpxkffd</span> <span class="mi">37</span> <span class="mi">4000</span> <span class="n">U</span>
<span class="mi">913011</span><span class="n">f2fab73c230131501570a9f9d2ada5569fe79c9af0268947c9ddf0c2d2</span> <span class="n">tb1qn36t5vw5ddr7mqukhgvem2wkj9hwjlymtw8j5g</span> <span class="mi">36</span> <span class="o">-</span><span class="mi">1000000</span>
<span class="mi">913011</span><span class="n">f2fab73c230131501570a9f9d2ada5569fe79c9af0268947c9ddf0c2d2</span> <span class="n">tb1q3l7cfqfx2alnkey9slkf5r8gtecd3k2e033juk</span> <span class="mi">36</span> <span class="mi">958366</span>
<span class="n">d3a43c327b25b884191ed1aefb39f67463d2d0a61ba0485dfeef1afb26cb8261</span> <span class="n">tb1q3l7cfqfx2alnkey9slkf5r8gtecd3k2e033juk</span> <span class="mi">36</span> <span class="o">-</span><span class="mi">958366</span>
<span class="n">d3a43c327b25b884191ed1aefb39f67463d2d0a61ba0485dfeef1afb26cb8261</span> <span class="n">tb1qr59yyur6n7xy6n7wrm8va9wt754kjhhmdkdtga</span> <span class="mi">36</span> <span class="mi">935681</span>
<span class="n">cedd18dc60a87fd39a2c8b4ad6b15442b5a53faf5363bca18a36a305294a3f0f</span> <span class="n">tb1qr59yyur6n7xy6n7wrm8va9wt754kjhhmdkdtga</span> <span class="mi">36</span> <span class="o">-</span><span class="mi">935681</span>
<span class="n">cedd18dc60a87fd39a2c8b4ad6b15442b5a53faf5363bca18a36a305294a3f0f</span> <span class="n">tb1qr4t5k0p57evw4dayuvq973cqapwprr5l8cur7q</span> <span class="mi">36</span> <span class="mi">897986</span>
<span class="mi">8</span><span class="n">b7ada2e6acd6619a080b25991f5d9408ee0b42a6a1ecc0eea304c4345a244b4</span> <span class="n">tb1qr4t5k0p57evw4dayuvq973cqapwprr5l8cur7q</span> <span class="mi">36</span> <span class="o">-</span><span class="mi">897986</span>
<span class="mi">8</span><span class="n">b7ada2e6acd6619a080b25991f5d9408ee0b42a6a1ecc0eea304c4345a244b4</span> <span class="n">tb1qxlqxgz62x9j8r6uhz6puckrfuzmgd5k60fp7rq</span> <span class="mi">36</span> <span class="mi">861808</span>
<span class="mi">80333162</span><span class="n">a87bc8e088eaa54f1f6718c0b7caa72a29a2dfe15a8233110f01612d</span> <span class="n">tb1q7fm9fvs62q76vgk5q998a35jyhpusprvm6j3w4</span> <span class="mi">33</span> <span class="o">-</span><span class="mi">1000000</span>
<span class="mi">80333162</span><span class="n">a87bc8e088eaa54f1f6718c0b7caa72a29a2dfe15a8233110f01612d</span> <span class="n">tb1qqt5kj0jus0ud36d90d48ecp2593tx9tt6zze6a</span> <span class="mi">33</span> <span class="mi">696456</span>
<span class="mi">449432</span><span class="n">de51fbe0b5b52a7234b2c860229ca3995888e87dd541a7885211838cc8</span> <span class="n">tb1qxlqxgz62x9j8r6uhz6puckrfuzmgd5k60fp7rq</span> <span class="mi">33</span> <span class="o">-</span><span class="mi">861808</span>
<span class="mi">449432</span><span class="n">de51fbe0b5b52a7234b2c860229ca3995888e87dd541a7885211838cc8</span> <span class="n">tb1q868k6nepnmrm5tehc68p5km3dzk8neyag0ph6c</span> <span class="mi">33</span> <span class="mi">399125</span>
<span class="mi">9</span><span class="n">a22ec2e22518678cd6bf4ca88e23c3b7480482be579479ee6db49fbe53f42f7</span> <span class="n">tb1q868k6nepnmrm5tehc68p5km3dzk8neyag0ph6c</span> <span class="mi">33</span> <span class="o">-</span><span class="mi">399125</span>
<span class="mi">9</span><span class="n">a22ec2e22518678cd6bf4ca88e23c3b7480482be579479ee6db49fbe53f42f7</span> <span class="n">tb1qsuyry7q0sf24pdhrzfl32f0zlg4h2dgr963wcy</span> <span class="mi">33</span> <span class="mi">147415</span>
<span class="mi">796</span><span class="n">f4c1eec2a242508bcb75b1c57920597d376e381289804255d51d9e8c3b336</span> <span class="n">tb1qsuyry7q0sf24pdhrzfl32f0zlg4h2dgr963wcy</span> <span class="mi">33</span> <span class="o">-</span><span class="mi">147415</span>
<span class="mi">796</span><span class="n">f4c1eec2a242508bcb75b1c57920597d376e381289804255d51d9e8c3b336</span> <span class="n">tb1q36wljxt3zfxaqe727vjp7lwvtrtpm4lvk9067s</span> <span class="mi">33</span> <span class="mi">121692</span>
<span class="mi">0335</span><span class="n">d2d56ac5861f8854c7539a9ffcbedc86c274a1603c605b5690a17968ba2f</span> <span class="n">tb1qqt5kj0jus0ud36d90d48ecp2593tx9tt6zze6a</span> <span class="mi">33</span> <span class="o">-</span><span class="mi">696456</span>
<span class="mi">0335</span><span class="n">d2d56ac5861f8854c7539a9ffcbedc86c274a1603c605b5690a17968ba2f</span> <span class="n">tb1qjpnl7236ltsm9jy3k9vhsc8fyw4xpwscxxd8np</span> <span class="mi">33</span> <span class="mi">575090</span>
<span class="n">d3f512ad2ee829cdb8365adfee8afe73700dd2be8706b5542de302bab448df4f</span> <span class="n">tb1qjpnl7236ltsm9jy3k9vhsc8fyw4xpwscxxd8np</span> <span class="mi">26</span> <span class="o">-</span><span class="mi">575090</span>
<span class="n">d3f512ad2ee829cdb8365adfee8afe73700dd2be8706b5542de302bab448df4f</span> <span class="n">tb1qsjddg0rd54z450kz00xm0nfl44qvewfqa82xsl</span> <span class="mi">26</span> <span class="mi">287950</span> <span class="n">U</span>
<span class="mi">5714845</span><span class="n">c10f0cdf4f4767ebb5b00a05fc8428d4c1a35c4f2f11779353193a8f3</span> <span class="n">tb1q36wljxt3zfxaqe727vjp7lwvtrtpm4lvk9067s</span> <span class="mi">25</span> <span class="o">-</span><span class="mi">121692</span>
<span class="mi">5714845</span><span class="n">c10f0cdf4f4767ebb5b00a05fc8428d4c1a35c4f2f11779353193a8f3</span> <span class="n">tb1qjazjs9tm7xvckmhdn65fcy2dtsjh89cceer7hq</span> <span class="mi">25</span> <span class="mi">105173</span> <span class="n">U</span>
<span class="o">=</span> <span class="n">Balance</span> <span class="n">Totals</span> <span class="p">(</span><span class="n">includes</span> <span class="n">unconfirmed</span><span class="p">)</span> <span class="o">=</span>
<span class="n">testnet</span> <span class="p">(</span><span class="n">Account</span> <span class="mi">0</span><span class="p">)</span> <span class="mf">0.00414823</span> <span class="n">TBTC</span>
</pre></div>
<p>Now the only thing left to do is to export the transactions. For example in CSV format.</p>
</div>
<div class="section" id="export-transactions">
<h2>Export transactions</h2>
<p>The python code below exports all incoming and outgoing transactions.</p>
<div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">w</span><span class="o">.</span><span class="n">transactions</span><span class="p">():</span>
<span class="c1"># Export this transaction as list of tuples in the following format:</span>
<span class="c1"># (in/out, transaction_hash, transaction_date, address, value)</span>
<span class="n">te</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">export</span><span class="p">()</span>
<span class="c1"># Loop through all transaction inputs and outputs</span>
<span class="k">for</span> <span class="n">tei</span> <span class="ow">in</span> <span class="n">te</span><span class="p">:</span>
<span class="c1"># Create string with list of inputs addresses for incoming transactions, and outputs addresses for outgoing txs</span>
<span class="n">addr_list</span> <span class="o">=</span> <span class="n">tei</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">tei</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="nb">list</span><span class="p">)</span> <span class="k">else</span> <span class="p">[</span><span class="n">tei</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="c1"># Print CSV string to standard output</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2">,</span><span class="si">%s</span><span class="s2">,</span><span class="si">%s</span><span class="s2">,:</span><span class="si">%d</span><span class="s2">,</span><span class="si">%d</span><span class="s2">,</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">tei</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">tei</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">tei</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S"</span><span class="p">),</span> <span class="n">tei</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span> <span class="n">cumulative_value</span><span class="p">,</span>
<span class="s2">";"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">addr_list</span><span class="p">)))))</span>
</pre></div>
<p>This creates a list of comma separated fields with the transaction info of your wallet.</p>
<div class="highlight"><pre><span></span><span class="ow">in</span><span class="p">,</span><span class="mi">7722</span><span class="n">a3c7bd0934522767564943e92a22caaca69e05eec9fbce23fe0a98f044f0</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">13</span><span class="p">:</span><span class="mi">37</span><span class="p">:</span><span class="mi">10</span><span class="p">,:</span><span class="mi">1000000</span><span class="p">,</span><span class="mi">2</span><span class="n">NDkRVM4VAbrEoJtafq6pkV4hDQBBbsnAgA</span><span class="p">;</span><span class="mi">2</span><span class="n">MzRww85sARtDjHJ7QPUL1BdAx8y1Y1d3be</span>
<span class="ow">in</span><span class="p">,</span><span class="mi">00</span><span class="n">c76570c0eb91dfd3c644f6321db4de8e0983d2d0528276abeb08aaae9979a8</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">13</span><span class="p">:</span><span class="mi">56</span><span class="p">:</span><span class="mi">32</span><span class="p">,:</span><span class="mi">1000000</span><span class="p">,</span><span class="mi">2</span><span class="n">NDBrFwt5J9JtvtEJGrbR1x3HMwY7eYQFXM</span>
<span class="ow">in</span><span class="p">,</span><span class="mi">9</span><span class="n">fbc417ea3bcd8bd076bbac7a481dc7852c8e168173c70955a97e830cd93fab4</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">23</span><span class="p">:</span><span class="mi">35</span><span class="p">,:</span><span class="mi">10000</span><span class="p">,</span>
<span class="ow">in</span><span class="p">,</span><span class="n">eff479895812039b2f4bcea508989bd3498df1595afc028570323a79f21d8693</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">23</span><span class="p">:</span><span class="mi">35</span><span class="p">,:</span><span class="mi">7700</span><span class="p">,</span><span class="mi">2</span><span class="n">NGAfMrvWZBnUx6wu3SMwRArBmMyNV9xXB9</span>
<span class="ow">in</span><span class="p">,</span><span class="mi">7</span><span class="n">af39e591a11962cedf6f433f657670d5f0335663788035d9dbe8c0cb7209fb4</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">23</span><span class="p">:</span><span class="mi">35</span><span class="p">,:</span><span class="mi">4000</span><span class="p">,</span><span class="mi">2</span><span class="n">N5BVu3mnXieaREwFHVE4RKVBUTT79GFugx</span>
<span class="n">out</span><span class="p">,</span><span class="mi">913011</span><span class="n">f2fab73c230131501570a9f9d2ada5569fe79c9af0268947c9ddf0c2d2</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">42</span><span class="p">:</span><span class="mi">09</span><span class="p">,:</span><span class="mi">41283</span><span class="p">,</span><span class="n">mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt</span>
<span class="n">out</span><span class="p">,</span><span class="n">d3a43c327b25b884191ed1aefb39f67463d2d0a61ba0485dfeef1afb26cb8261</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">42</span><span class="p">:</span><span class="mi">09</span><span class="p">,:</span><span class="mi">21645</span><span class="p">,</span><span class="n">mv4rnyY3Su5gjcDNzbMLKBQkBicCtHUtFB</span>
<span class="n">out</span><span class="p">,</span><span class="n">cedd18dc60a87fd39a2c8b4ad6b15442b5a53faf5363bca18a36a305294a3f0f</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">42</span><span class="p">:</span><span class="mi">09</span><span class="p">,:</span><span class="mi">36655</span><span class="p">,</span><span class="n">n2eMqTT929pb1RDNuqEnxdaLau1rxy3efi</span>
<span class="n">out</span><span class="p">,</span><span class="mi">8</span><span class="n">b7ada2e6acd6619a080b25991f5d9408ee0b42a6a1ecc0eea304c4345a244b4</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">42</span><span class="p">:</span><span class="mi">09</span><span class="p">,:</span><span class="mi">35153</span><span class="p">,</span><span class="mi">2</span><span class="n">NGZrVvZG92qGYqzTLjCAewvPZ7JE8S8VxE</span>
<span class="n">out</span><span class="p">,</span><span class="mi">80333162</span><span class="n">a87bc8e088eaa54f1f6718c0b7caa72a29a2dfe15a8233110f01612d</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">15</span><span class="p">:</span><span class="mi">25</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">302642</span><span class="p">,</span><span class="mi">2</span><span class="n">NGZrVvZG92qGYqzTLjCAewvPZ7JE8S8VxE</span>
<span class="n">out</span><span class="p">,</span><span class="mi">449432</span><span class="n">de51fbe0b5b52a7234b2c860229ca3995888e87dd541a7885211838cc8</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">15</span><span class="p">:</span><span class="mi">25</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">462332</span><span class="p">,</span><span class="n">mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt</span>
<span class="n">out</span><span class="p">,</span><span class="mi">9</span><span class="n">a22ec2e22518678cd6bf4ca88e23c3b7480482be579479ee6db49fbe53f42f7</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">15</span><span class="p">:</span><span class="mi">25</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">250795</span><span class="p">,</span><span class="n">mv4rnyY3Su5gjcDNzbMLKBQkBicCtHUtFB</span>
<span class="n">out</span><span class="p">,</span><span class="mi">796</span><span class="n">f4c1eec2a242508bcb75b1c57920597d376e381289804255d51d9e8c3b336</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">15</span><span class="p">:</span><span class="mi">25</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">25579</span><span class="p">,</span><span class="n">n2eMqTT929pb1RDNuqEnxdaLau1rxy3efi</span>
<span class="n">out</span><span class="p">,</span><span class="mi">0335</span><span class="n">d2d56ac5861f8854c7539a9ffcbedc86c274a1603c605b5690a17968ba2f</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">15</span><span class="p">:</span><span class="mi">25</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">120464</span><span class="p">,</span><span class="mi">2</span><span class="n">NGZrVvZG92qGYqzTLjCAewvPZ7JE8S8VxE</span>
<span class="n">out</span><span class="p">,</span><span class="n">d3f512ad2ee829cdb8365adfee8afe73700dd2be8706b5542de302bab448df4f</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">16</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">286279</span><span class="p">,</span><span class="mi">2</span><span class="n">NGZrVvZG92qGYqzTLjCAewvPZ7JE8S8VxE</span>
<span class="n">out</span><span class="p">,</span><span class="mi">5714845</span><span class="n">c10f0cdf4f4767ebb5b00a05fc8428d4c1a35c4f2f11779353193a8f3</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">16</span><span class="p">:</span><span class="mi">51</span><span class="p">:</span><span class="mi">31</span><span class="p">,:</span><span class="mi">16375</span><span class="p">,</span><span class="n">mv4rnyY3Su5gjcDNzbMLKBQkBicCtHUtFB</span>
</pre></div>
<p>You can now easily import this CSV data into a spreadsheet or into your administration software.</p>
</div>
<div class="section" id="export-transactions-add-cumulative-info">
<h2>Export transactions - add cumulative info</h2>
<p>Of course you also need totals per year, month, week, etc. Add a cumulative field to the export to keep track of the
wallet totals.</p>
<div class="highlight"><pre><span></span><span class="n">cumulative_value</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">w</span><span class="o">.</span><span class="n">transactions</span><span class="p">():</span>
<span class="c1"># Export this transaction as list of tuples in the following format:</span>
<span class="c1"># (in/out, transaction_hash, transaction_date, address, value)</span>
<span class="n">te</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">export</span><span class="p">()</span>
<span class="c1"># Deduct fee from cumulative value if this is an outgoing transaction</span>
<span class="k">if</span> <span class="n">te</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'out'</span><span class="p">:</span>
<span class="n">cumulative_value</span> <span class="o">-=</span> <span class="n">t</span><span class="o">.</span><span class="n">fee</span>
<span class="c1"># Loop through all transaction inputs and outputs</span>
<span class="k">for</span> <span class="n">tei</span> <span class="ow">in</span> <span class="n">te</span><span class="p">:</span>
<span class="c1"># Create string with list of inputs addresses for incoming transactions, and outputs addresses for outgoing txs</span>
<span class="n">addr_list</span> <span class="o">=</span> <span class="n">tei</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">tei</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="nb">list</span><span class="p">)</span> <span class="k">else</span> <span class="p">[</span><span class="n">tei</span><span class="p">[</span><span class="mi">3</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">tei</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'in'</span><span class="p">:</span>
<span class="n">cumulative_value</span> <span class="o">+=</span> <span class="n">tei</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">cumulative_value</span> <span class="o">-=</span> <span class="n">tei</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
<span class="c1"># Print CSV string to standard output</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2">,</span><span class="si">%s</span><span class="s2">,</span><span class="si">%s</span><span class="s2">,:</span><span class="si">%d</span><span class="s2">,</span><span class="si">%d</span><span class="s2">,</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">tei</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">tei</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">tei</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S"</span><span class="p">),</span> <span class="n">tei</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span> <span class="n">cumulative_value</span><span class="p">,</span>
<span class="s2">";"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">addr_list</span><span class="p">)))))</span>
</pre></div>
<p>Which results in this CSV output:</p>
<div class="highlight"><pre><span></span><span class="ow">in</span><span class="p">,</span><span class="mi">7722</span><span class="n">a3c7bd0934522767564943e92a22caaca69e05eec9fbce23fe0a98f044f0</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">13</span><span class="p">:</span><span class="mi">37</span><span class="p">:</span><span class="mi">10</span><span class="p">,:</span><span class="mi">1000000</span><span class="p">,</span><span class="mi">1000000</span><span class="p">,</span><span class="mi">2</span><span class="n">MzRww85sARtDjHJ7QPUL1BdAx8y1Y1d3be</span><span class="p">;</span><span class="mi">2</span><span class="n">NDkRVM4VAbrEoJtafq6pkV4hDQBBbsnAgA</span>
<span class="ow">in</span><span class="p">,</span><span class="mi">00</span><span class="n">c76570c0eb91dfd3c644f6321db4de8e0983d2d0528276abeb08aaae9979a8</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">13</span><span class="p">:</span><span class="mi">56</span><span class="p">:</span><span class="mi">32</span><span class="p">,:</span><span class="mi">1000000</span><span class="p">,</span><span class="mi">2000000</span><span class="p">,</span><span class="mi">2</span><span class="n">NDBrFwt5J9JtvtEJGrbR1x3HMwY7eYQFXM</span>
<span class="ow">in</span><span class="p">,</span><span class="mi">9</span><span class="n">fbc417ea3bcd8bd076bbac7a481dc7852c8e168173c70955a97e830cd93fab4</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">23</span><span class="p">:</span><span class="mi">35</span><span class="p">,:</span><span class="mi">10000</span><span class="p">,</span><span class="mi">2010000</span><span class="p">,</span>
<span class="ow">in</span><span class="p">,</span><span class="n">eff479895812039b2f4bcea508989bd3498df1595afc028570323a79f21d8693</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">23</span><span class="p">:</span><span class="mi">35</span><span class="p">,:</span><span class="mi">7700</span><span class="p">,</span><span class="mi">2017700</span><span class="p">,</span><span class="mi">2</span><span class="n">NGAfMrvWZBnUx6wu3SMwRArBmMyNV9xXB9</span>
<span class="ow">in</span><span class="p">,</span><span class="mi">7</span><span class="n">af39e591a11962cedf6f433f657670d5f0335663788035d9dbe8c0cb7209fb4</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">23</span><span class="p">:</span><span class="mi">35</span><span class="p">,:</span><span class="mi">4000</span><span class="p">,</span><span class="mi">2021700</span><span class="p">,</span><span class="mi">2</span><span class="n">N5BVu3mnXieaREwFHVE4RKVBUTT79GFugx</span>
<span class="n">out</span><span class="p">,</span><span class="mi">913011</span><span class="n">f2fab73c230131501570a9f9d2ada5569fe79c9af0268947c9ddf0c2d2</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">42</span><span class="p">:</span><span class="mi">09</span><span class="p">,:</span><span class="mi">41283</span><span class="p">,</span><span class="mi">1980066</span><span class="p">,</span><span class="n">mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt</span>
<span class="n">out</span><span class="p">,</span><span class="n">d3a43c327b25b884191ed1aefb39f67463d2d0a61ba0485dfeef1afb26cb8261</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">42</span><span class="p">:</span><span class="mi">09</span><span class="p">,:</span><span class="mi">21645</span><span class="p">,</span><span class="mi">1957381</span><span class="p">,</span><span class="n">mv4rnyY3Su5gjcDNzbMLKBQkBicCtHUtFB</span>
<span class="n">out</span><span class="p">,</span><span class="n">cedd18dc60a87fd39a2c8b4ad6b15442b5a53faf5363bca18a36a305294a3f0f</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">42</span><span class="p">:</span><span class="mi">09</span><span class="p">,:</span><span class="mi">36655</span><span class="p">,</span><span class="mi">1919686</span><span class="p">,</span><span class="n">n2eMqTT929pb1RDNuqEnxdaLau1rxy3efi</span>
<span class="n">out</span><span class="p">,</span><span class="mi">8</span><span class="n">b7ada2e6acd6619a080b25991f5d9408ee0b42a6a1ecc0eea304c4345a244b4</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">14</span><span class="p">:</span><span class="mi">42</span><span class="p">:</span><span class="mi">09</span><span class="p">,:</span><span class="mi">35153</span><span class="p">,</span><span class="mi">1883508</span><span class="p">,</span><span class="mi">2</span><span class="n">NGZrVvZG92qGYqzTLjCAewvPZ7JE8S8VxE</span>
<span class="n">out</span><span class="p">,</span><span class="mi">80333162</span><span class="n">a87bc8e088eaa54f1f6718c0b7caa72a29a2dfe15a8233110f01612d</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">15</span><span class="p">:</span><span class="mi">25</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">302642</span><span class="p">,</span><span class="mi">1579964</span><span class="p">,</span><span class="mi">2</span><span class="n">NGZrVvZG92qGYqzTLjCAewvPZ7JE8S8VxE</span>
<span class="n">out</span><span class="p">,</span><span class="mi">449432</span><span class="n">de51fbe0b5b52a7234b2c860229ca3995888e87dd541a7885211838cc8</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">15</span><span class="p">:</span><span class="mi">25</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">462332</span><span class="p">,</span><span class="mi">1117281</span><span class="p">,</span><span class="n">mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt</span>
<span class="n">out</span><span class="p">,</span><span class="mi">9</span><span class="n">a22ec2e22518678cd6bf4ca88e23c3b7480482be579479ee6db49fbe53f42f7</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">15</span><span class="p">:</span><span class="mi">25</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">250795</span><span class="p">,</span><span class="mi">865571</span><span class="p">,</span><span class="n">mv4rnyY3Su5gjcDNzbMLKBQkBicCtHUtFB</span>
<span class="n">out</span><span class="p">,</span><span class="mi">796</span><span class="n">f4c1eec2a242508bcb75b1c57920597d376e381289804255d51d9e8c3b336</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">15</span><span class="p">:</span><span class="mi">25</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">25579</span><span class="p">,</span><span class="mi">839848</span><span class="p">,</span><span class="n">n2eMqTT929pb1RDNuqEnxdaLau1rxy3efi</span>
<span class="n">out</span><span class="p">,</span><span class="mi">0335</span><span class="n">d2d56ac5861f8854c7539a9ffcbedc86c274a1603c605b5690a17968ba2f</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">15</span><span class="p">:</span><span class="mi">25</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">120464</span><span class="p">,</span><span class="mi">718482</span><span class="p">,</span><span class="mi">2</span><span class="n">NGZrVvZG92qGYqzTLjCAewvPZ7JE8S8VxE</span>
<span class="n">out</span><span class="p">,</span><span class="n">d3f512ad2ee829cdb8365adfee8afe73700dd2be8706b5542de302bab448df4f</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">16</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mi">01</span><span class="p">,:</span><span class="mi">286279</span><span class="p">,</span><span class="mi">431342</span><span class="p">,</span><span class="mi">2</span><span class="n">NGZrVvZG92qGYqzTLjCAewvPZ7JE8S8VxE</span>
<span class="n">out</span><span class="p">,</span><span class="mi">5714845</span><span class="n">c10f0cdf4f4767ebb5b00a05fc8428d4c1a35c4f2f11779353193a8f3</span><span class="p">,</span><span class="mi">2019</span><span class="o">-</span><span class="mi">11</span><span class="o">-</span><span class="mi">19</span> <span class="mi">16</span><span class="p">:</span><span class="mi">51</span><span class="p">:</span><span class="mi">31</span><span class="p">,:</span><span class="mi">16375</span><span class="p">,</span><span class="mi">414823</span><span class="p">,</span><span class="n">mv4rnyY3Su5gjcDNzbMLKBQkBicCtHUtFB</span>
</pre></div>
</div>
Create a Bitcoin multisig wallet from Python commandline2019-02-12T11:22:00+01:002019-02-12T11:22:00+01:00Lennart Jongeneeltag:coineva.com,2019-02-12:/create-multisig-wallet-bitcoin-python.html<p class="first last">Create a 2-of-2 Bitcoin multi-signature wallet from the Python commandline</p>
<!-- :slug: create-multisig-wallet-bitcoin-python: -->
<p>Follow the steps below to create a 2-of-2 multi-signature wallet from the Python commandline with a few simple steps.
It assumes you have the installed the <a class="reference external" href="https://coineva.com/python-bitcoin-library.html">Python BitcoinLib</a> with
'pip install bitcoinlib'.</p>
<div class="section" id="create-some-private-keys">
<h2>Create some private keys</h2>
<p>Create the first key using the Mnemonic phrase generator from BitcoinLib</p>
<div class="highlight"><pre><span></span>>>> from bitcoinlib.mnemonic import Mnemonic
>>> p1 = Mnemonic().generate()
>>> p1
'ethics near crew genuine enter panda garment siren tumble slush nation dash'
</pre></div>
<p>Make sure to write down this private key passphrase on 2 or more pieces of paper and store them in a safe place.</p>
<p>Now preferably on another (offline) device generate a second key.</p>
<div class="highlight"><pre><span></span>>>> from bitcoinlib.mnemonic import Mnemonic
>>> p2 = Mnemonic().generate()
>>> p2
'poem swamp inside oyster cube sign prefer scatter field health victory false'
</pre></div>
<p>Backup this key carefully again. We can now create a public masterkey to share with our main PC.</p>
<div class="highlight"><pre><span></span>>>> from bitcoinlib.keys import HDKey
>>> key2 = HDKey.from_passphrase(p2, key_type='single')
>>> key2.wif()
'xpub661MyMwAqRbcFpdnKAgSoGkJoFfk6LAC7Ncewo9hUxPcQA7yCjY7k6QoMBPxYAv4RsJj3GiuDHVBeMGxABJJb5JsvxEMFwy3ekamoJLXHCc'
Share this key using a USB stick or use a library such as qrcode to create a printable and scanable code.
</pre></div>
<div class="highlight"><pre><span></span>>>> import pyqrcode
>>> qrcode = pyqrcode.create(key2.wif())
>>> print(qrcode.terminal())
</pre></div>
</div>
<div class="section" id="create-the-multisig-wallet">
<h2>Create the multisig wallet</h2>
<p>We are now ready to create the wallet with the private key from above and the public master key from the other PC.
The first address / key is created with the new_key() method.</p>
<div class="highlight"><pre><span></span>>>> from bitcoinlib.wallets import HDWallet
>>> wif2 = 'xpub661MyMwAqRbcFpdnKAgSoGkJoFfk6LAC7Ncewo9hUxPcQA7yCjY7k6QoMBPxYAv4RsJj3GiuDHVBeMGxABJJb5JsvxEMFwy3ekamoJLXHCc'
>>> key2 = HDKey(wif2, key_type='single')
>>> w = HDWallet.create('bitcoin-multisig-wallet', [p1, key2])
>>> >>> w.new_key()
<HDWalletKey(key_id=764, name=Multisig Key 763/755, wif=multisig-37dtoR6QrsiEZEsnarByktVRNreSC61gDf, path=m/45'/0/0/0)>
>>> w.info()
=== WALLET ===
ID 126
Name bitcoin-multisig-wallet
Owner
Scheme bip32
Multisig True
Multisig Wallet IDs 127, 128
Witness type legacy
Main network bitcoin
= Multisig Public Account Keys =
751 xpub682fymfahPiaB1nHt9JLKfBrkXdJS92LFEwjVkPMJoesjXZSG79DvmtguYDexeCvRrhETF6mcFQScZj47PBX6yR6zY8wQU1qDqEzgQEUNE1 main
756 xpub68A4hatRFDPrgWatXRoSc72bBVVnV6EiBUSsGa4uwh1ZuZNZ9BhPktWKuzY9jX2xXtoXbyu3JC9cJraQE1FM2cS3jEdVZj7LoUNGqUGPg1v main
For main keys a private master key is available in this wallet to sign transactions.
- NETWORK: bitcoin -
- - Keys
764 m/45'/0/0/0 37dtoR6QrsiEZEsnarByktVRNreSC61gDf Multisig Key 763/755 0.00000000 BTC
= Balance Totals (includes unconfirmed) =
</pre></div>
<p>The info() method show the 2 public master keys of this wallet. At the end of the line you find 'main' when a private key is available.</p>
<p>Your wallet will be stored in a Sqlite database in your home folder. You can reopen it later using the name or wallet ID.</p>
<div class="highlight"><pre><span></span>>>> w = HDWallet('bitcoin-multisig-wallet')
>>> w = HDWallet(126)
</pre></div>
</div>
<div class="section" id="create-a-transaction">
<h2>Create a Transaction</h2>
<p>Now fund your wallet with a small amount of bitcoins so we can create a transaction.</p>
<p>Update your wallet:</p>
<div class="highlight"><pre><span></span>>>> w.utxos_update()
1
</pre></div>
<p>The utxos_update method returns the number of new UTXO's found, so '1' means funds received! If you call the w.info()
method again you can find the details of the UTXO's and total balance available in this wallet.</p>
<p>Imagine you want to donate all the funds in your wallet to the
<a class="reference external" href="https://archive.org/donate/">Internet Archive</a>
Then you can use the wallets sweep() method to spent all UTXO's.</p>
<div class="highlight"><pre><span></span>>>> t = w.sweep('1Archive1n2C579dMsAu3iC6tWzuQJz8dN')
>>> t.info()
Transaction 1e4e979c9622d64c51cbba0b17386e3b5a7ddfb9aad4a4ec3a935a01bff87666
Date: None
Network: bitcoin
Version: 1
Witness type: legacy
Status: new
Verified: False
Inputs
- 37dtoR6QrsiEZEsnarByktVRNreSC61gDf 388813 9b3ff0e4ebf336036a30cdf1d5ed6e45ef39d661315faed069efa3371770297b 1
legacy p2sh_multisig; sigs: 1 (2-of-2) not validated
Outputs
- 1Archive1n2C579dMsAu3iC6tWzuQJz8dN 387813 p2pkh
Size: 337
Vsize: 337
Fee: 1000
Confirmations: None
Pushed to network: False
Wallet: bitcoin-multisig-wallet
Errors: Cannot verify transaction
</pre></div>
<p>This will create a transaction and as you can see it could not be verified. The first input needs 2 signatures but
the wallet contains only 1 private key. So we need to copy the transaction to the other PC to sign it.</p>
<div class="highlight"><pre><span></span>>>> t.raw_hex()
'010000000...etc...5d88ac00000000'
</pre></div>
<p>Now on the other PC import this raw transaction and sign.</p>
<div class="highlight"><pre><span></span>>>> t = Transaction.import_raw('010000000...etc...5d88ac00000000')
>>> t.sign(key2)
>>> t.verify()
>>> t.info()
Transaction 47f4a511aef839fa9fea9d900b1eba2866ab397fee558e8aaec3c90586072768
Date: None
Network: bitcoin
Version: 1
Witness type: legacy
Status: new
Verified: True
Inputs
- 37dtoR6QrsiEZEsnarByktVRNreSC61gDf 388813 9b3ff0e4ebf336036a30cdf1d5ed6e45ef39d661315faed069efa3371770297b 1
legacy p2sh_multisig; sigs: 2 (2-of-2) valid
Outputs
- 1Archive1n2C579dMsAu3iC6tWzuQJz8dN 387813 p2pkh
Size: 230
Vsize: 230
Fee: None
Confirmations: None
</pre></div>
<p>The transaction input now has 2 signatures and is ready to send. You could copy-n-paste the raw transaction and send
it with a service such as <a class="reference external" href="https://live.blockcypher.com/btc/pushtx/">https://live.blockcypher.com/btc/pushtx/</a> or -when the PC is online- you can send it
with BitcoinLib.</p>
<div class="highlight"><pre><span></span>>>> from bitcoinlib.service import Service
>>> Service().sendrawtransaction(t.raw())
</pre></div>
<p>Which will return a transaction ID when sending was successful.</p>
</div>
Create a Bitcoin and Litecoin Segwit Wallet2018-12-05T12:04:00+01:002018-12-05T13:18:00+01:00Lennart Jongeneeltag:coineva.com,2018-12-05:/create-litecoin-bitcoin-segwit-wallet.html<p class="first last">Create a Bitcoin and Litecoin Segregated Witness Wallet with a single private key</p>
<!-- :slug: create-litecoin-bitcoin-segwit-wallet: -->
<p>Storing private keys in a safe way can be cumbersome, so if you work with multiple cryptocurrencies, it
is handy to use a single private key for multiple networks for example Bitcoin and Litecoin.</p>
<p>This article describes how to create a Segwit wallet with Python BitcoinLib from the Python console.
It assumes you have the installed the <a class="reference external" href="https://coineva.com/python-bitcoin-library.html">Python BitcoinLib</a> with
'pip install bitcoinlib'.</p>
<img alt="Bitcoin and Litecoin SegWit Wallet, credits @Frankieboy93" class="align-right" src="/images/bitcoin-litecoin-segwit.jpg" style="width: 640px;" />
<p>Thanks to Peter Dalby for the image, <a class="reference external" href="https://twitter.com/Frankieboy93">https://twitter.com/Frankieboy93</a></p>
<div class="section" id="create-the-private-key">
<h2>Create the private key</h2>
<div class="highlight"><pre><span></span>>>> from bitcoinlib.mnemonic import Mnemonic
>>> key = Mnemonic().generate()
>>> key
'scheme unfold sea follow canvas food average knife stamp random collect slot'
</pre></div>
<p>Make sure to write down this private key passphrase on 2 or more pieces of paper and store them in a safe place.</p>
</div>
<div class="section" id="create-the-wallet">
<h2>Create the wallet</h2>
<p>Now create a Bitcoin segwit wallet and add an account for the Litecoin network:</p>
<div class="highlight"><pre><span></span>>>> from bitcoinlib.wallets import HDWallet
>>> w = HDWallet.create('mywallet', key, witness_type='segwit', network='bitcoin')
>>> w.new_account(network='litecoin')
>>> w.info()
=== WALLET ===
ID 13
Name mywallet
Owner
Scheme bip32
Multisig False
Witness type segwit
Main network bitcoin
= Wallet Master Key =
ID 116
Private True
Depth 0
- NETWORK: bitcoin -
- - Keys
121 m/84'/0'/0'/0/0 bc1qjalwm3tr6jz5fecprutheejj84axlvsunj267k address index 0 0.00000000 BTC
129 m/84'/0'/0'/1/0 bc1qyuwzqgn0czf40k2vdf9qsz3wlsfsmcfw59ag07 address index 0 0.00000000 BTC
- - Transactions (Account 0, zpub6qrL6kaP9pEhD9RXiJrbVC9JmMd2XwXJh6nxH4rNk6Q1qHC7fgEEarNLKAFseRxXY8cZLymniczWvyqJp8CZGnmDSX6US1tit2BxHroAPCR)
- NETWORK: litecoin -
- - Keys
125 m/84'/2'/0'/0/0 ltc1qpeez5d09uq7ruead6lh5m7aq09r47muvutgsgd address index 0 0.00000000 LTC
127 m/84'/2'/0'/1/0 ltc1qzwus8mmd8y302aw20wg84whhszj6h0ay75vyhm address index 0 0.00000000 LTC
- - Transactions (Account 0, Mtub2sXpSFfX3mYCLHrNtJFNfaMcTU5M7UdbasVAQDUVBwrvqEwFTeAcJVkCtgrv9MViXistThqQNPt77sUSvpj4dTwsRD4tFa5jwDcujaHQacL)
= Balance Totals (includes unconfirmed) =
</pre></div>
<p>A wallet with the first derived addresses has been created. This wallet will be stored in a Sqlite database in your
home folder. You can reopen it later with:</p>
<div class="highlight"><pre><span></span>>>> w = HDWallet('mywallet')
</pre></div>
</div>
<div class="section" id="create-a-transaction">
<h2>Create a Transaction</h2>
<p>First fund your wallet with a small amount of litecoins or bitcoins so we can create a transaction.</p>
<p>Update your wallet:</p>
<div class="highlight"><pre><span></span>>>> w.utxos_update()
1
</pre></div>
<p>The utxos_update method outputs how many new unspent outputs or new funds are added, so '1' means a new UTXO is found.</p>
<p>To create an transaction type:</p>
<div class="highlight"><pre><span></span>>>> t = w.send_to('ltc1qzwus8mmd8y302aw20wg84whhszj6h0ay75vyhm', 94118, fee=1000, offline=True)
>>> t.info()
Transaction
Date: None
Network: litecoin
Version: 1
Witness type: segwit
Status: new
Verified: True
Inputs
- ltc1qpeez5d09uq7ruead6lh5m7aq09r47muvutgsgd 95118 4b2698a851b2a38ebef43c2af7da4726058b3a88e6dda4cace43d2e944d99227 0
Script type: sig_pubkey (segwit), signatures: 1 (1-of-1), valid
Outputs, s
- ltc1qzwus8mmd8y302aw20wg84whhszj6h0ay75vyhm 94118
Size: 141
Vsize: 141
Fee: 1000
Confirmations: None
Pushed to network: False
Wallet: mywallet
</pre></div>
<p>If everything looks fine you can push the transaction:</p>
<div class="highlight"><pre><span></span>>>> t.send()
True
>>> t.info()
Transaction b68ea01a4521048bece5f208932d36add3f85981f13bb446bf05a065f0c43405
Date: None
Network: litecoin
Version: 1
Witness type: segwit
Status: unconfirmed
Verified: True
Inputs
- ltc1qpeez5d09uq7ruead6lh5m7aq09r47muvutgsgd 95118 4b2698a851b2a38ebef43c2af7da4726058b3a88e6dda4cace43d2e944d99227 0
Script type: sig_pubkey (segwit), signatures: 1 (1-of-1), valid
Outputs
- ltc1qzwus8mmd8y302aw20wg84whhszj6h0ay75vyhm 94118
Size: 191
Vsize: 141
Fee: 1000
Confirmations: 0
Pushed to network: True
Wallet: mywallet
</pre></div>
<p>After sending the transaction object is updated with the transaction ID, and send results. The status should show as
'unconfirmed' and pushed to network should be True. If any errors occur when sending they will also be added to the
object.</p>
<p>This is it. You can reopen your wallet later as all information is stored in the database. And you can restore or
recreate your wallet with the passphrase.</p>
<p>Please note that this wallet is not super-secure as private keys are stored unencrypted on your device, so you should
only use it for testing or small amounts of pocket money. To add extra security you can
<a class="reference external" href="https://coineva.com/create-litecoin-multisig-wallet.html">create a multisig wallet</a>
and/or encrypt your wallet private keys with a extra password.</p>
</div>
Use Nulldata to store data on the Litecoin or Dash Blockchain2018-09-14T08:45:00+02:002018-09-14T08:45:00+02:00Lennart Jongeneeltag:coineva.com,2018-09-14:/use-nulldata-to-store-data-on-litecoin-or-dash-blockchain.html<p class="first last">Use nulldata outputs to store data on the Litecoin or Dash blockchain</p>
<div class="section" id="store-data-on-litecoin-or-dash-blockchain">
<h2>Store data on Litecoin or Dash blockchain</h2>
<p>In a previous article we described
<a class="reference external" href="https://coineva.com/use-nulldata-to-send-blockchain-messages.html">how to store data on the Bitcoin Blockchain</a>.
But another and perhaps cheaper option is to store data on the Litecoin or Dash blockchain.
Both blockchains allow Null Data Transactions just as the bitcoin protocol.</p>
<p>A Null Data Transaction looks just like a normal transaction. But instead of sending value the output is a
data string, an OP_RETURN byte followed by some data. The transaction still needs an input, an unspent output of
a previous transaction to cover the transactions fees.</p>
</div>
<div class="section" id="send-a-data-transaction">
<h2>Send a Data Transaction</h2>
<p>With the code below using the <a class="reference external" href="https://coineva.com/python-bitcoin-library.html">Python BitcoinLib</a>
you can create a Nulldata transaction.</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">bitcoinlib.transactions</span> <span class="kn">import</span> <span class="n">Output</span>
<span class="kn">from</span> <span class="nn">bitcoinlib.wallets</span> <span class="kn">import</span> <span class="n">wallet_create_or_open</span>
<span class="kn">from</span> <span class="nn">bitcoinlib.encoding</span> <span class="kn">import</span> <span class="n">varstr</span>
<span class="n">wallet</span> <span class="o">=</span> <span class="n">wallet_create_or_open</span><span class="p">(</span><span class="s1">'ExpensiveDatabase'</span><span class="p">,</span> <span class="n">network</span><span class="o">=</span><span class="s1">'litecoin'</span><span class="p">)</span>
<span class="n">wk</span> <span class="o">=</span> <span class="n">wallet</span><span class="o">.</span><span class="n">get_key</span><span class="p">()</span>
<span class="n">wallet</span><span class="o">.</span><span class="n">utxos_update</span><span class="p">()</span>
<span class="n">utxos</span> <span class="o">=</span> <span class="n">wallet</span><span class="o">.</span><span class="n">utxos</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">utxos</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Please deposit to </span><span class="si">%s</span><span class="s2"> to start creating Nulldata transactions"</span> <span class="o">%</span> <span class="n">wk</span><span class="o">.</span><span class="n">address</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">lock_script</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">'</span><span class="se">\x6a</span><span class="s1">'</span> <span class="o">+</span> <span class="n">varstr</span><span class="p">(</span><span class="sa">b</span><span class="s1">'This is message for the Litecoin network'</span><span class="p">)</span>
<span class="n">t_output</span> <span class="o">=</span> <span class="n">Output</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">lock_script</span><span class="o">=</span><span class="n">lock_script</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">wallet</span><span class="o">.</span><span class="n">send</span><span class="p">([</span><span class="n">t_output</span><span class="p">])</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span>
</pre></div>
<p>The locking script of the Null Data output starts with the OP_RETURN opcode (HEX 6A) followed by the data string.
The data string can contain anything you like, a size byte is added by the varstr() method.</p>
</div>
<div class="section" id="find-your-message">
<h2>Find your message</h2>
<p>When your successfully broadcasted your message transaction to the Litecoin network the script above return a
transaction ID. With this ID or the address you can look it up on a block explorer such as Chain.so:
<a class="reference external" href="https://chain.so/tx/LTC/1e57b40392edaa6a64d9e5df3d8729a679e9d9205daf575fd71d1bd2d18c0005">https://chain.so/tx/LTC/1e57b40392edaa6a64d9e5df3d8729a679e9d9205daf575fd71d1bd2d18c0005</a></p>
<p>The OP_RETURN output is marked as 'nonstandard' but you can read the decoded message.</p>
<p>Not all nodes and Service providers accept Nulldata transactions or accept only Nulldata with a
maximum size of 40 bytes. If you encounter this problem, you could set up your own node and use
this or specify an service provider when sending the transaction.</p>
<p>To push transaction with a specific provider add the following line to the script above before
the wallet.send([t_output]) action. You can substitute 'chainso' for any other working provider.</p>
<div class="highlight"><pre><span></span><span class="n">wallet</span><span class="o">.</span><span class="n">providers</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'chainso'</span><span class="p">]</span>
</pre></div>
</div>
<div class="section" id="create-a-data-transaction-for-the-dash-network">
<h2>Create a Data Transaction for the Dash network</h2>
<p>To create a Nulldata transaction for the Dash network simply replace 'litecoin' in the script above with 'dash'.
The Dash, Litecoin and Bitcoin network have the same specifications for Nulldata transactions.</p>
<p>This is an example of a Dash Nulldata transaction:
<a class="reference external" href="https://chain.so/tx/DASH/96dfdba1b214609ecb6db577c4f39d2daa36742e41da76e3dc9bcfe909b867ba">https://chain.so/tx/DASH/96dfdba1b214609ecb6db577c4f39d2daa36742e41da76e3dc9bcfe909b867ba</a></p>
</div>
<div class="section" id="where-can-this-be-used-for">
<h2>Where can this be used for?</h2>
<p>Besides tagging the blockchain with your graffiti this has some useful applications. The blockchain
is a timestamped database of records which cannot be modified or deleted after they are included in the
blockchain. This is nice (and necessary) for storing value but can also be used to prove existence of a document
on a specific date: a renting contract or birth certificate for instance.</p>
<p>On the Proof Of Existence website (<a class="reference external" href="https://poex.io">https://poex.io</a>) you can store a hash of any document, which proves the existence of
a document on a specific data. And in my article: "
<a class="reference external" href="https://coineva.com/proof-existence-store-documents-hash-blockchain.html">Proof existence of documents using Nulldata</a> "
I explain how to do this yourself with BitcoinLib.</p>
<p>But Null Data messages can also be used to build another layer on the blockchain network to store assets
or other crypto currencies. Colored coins (<a class="reference external" href="https://en.wikipedia.org/wiki/Colored_coin">https://en.wikipedia.org/wiki/Colored_coin</a>)
or Counterparty (<a class="reference external" href="https://counterparty.io">https://counterparty.io</a>) are examples of this.</p>
</div>
Proof existence of documents using Nulldata2018-07-12T06:43:00+02:002018-07-12T06:43:00+02:00Lennart Jongeneeltag:coineva.com,2018-07-12:/proof-existence-store-documents-hash-blockchain.html<p class="first last">Proof existence of documents by storing a document hash on the blockchain using the Python BitcoinLib</p>
<p>Besides storing value the Blockchain can be used to store small amounts of arbitrary data.
This could be used to store a document hash to proof its existence on a particular date.</p>
<p>This article explains how to store a document hash on the blockchain or a full compressed message.
We do this using a Nulldata transaction, you can read the full details in this article:
<a class="reference external" href="https://coineva.com/use-nulldata-to-send-blockchain-messages.html">Use Nulldata to Store Data on the Blockchain</a></p>
<div class="section" id="create-a-document-hash-in-python">
<h2>1. Create a document hash in Python</h2>
<p>First let's create a hash of the document. The script below splits the document in blocks of 64Kb so very
large documents can be read as well. The SHA1 algorithm is used to create the hash, you can easily replace this
with another algorithm if you wish.</p>
<img alt="Bitcoin Logo" class="align-center" src="/images/bitcoin-logo.png" style="width: 191px;" />
<p>Create a hash of this bitcoin logo PNG image file:</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">hashlib</span> <span class="kn">import</span> <span class="n">sha1</span>
<span class="n">FILENAME</span> <span class="o">=</span> <span class="s1">'/home/guest/Documents/bitcoin-logo.png'</span>
<span class="n">BLOCKSIZE</span> <span class="o">=</span> <span class="mi">65536</span>
<span class="c1"># Get document hash</span>
<span class="n">hasher</span> <span class="o">=</span> <span class="n">sha1</span><span class="p">()</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">FILENAME</span><span class="p">,</span> <span class="s1">'rb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">BLOCKSIZE</span><span class="p">)</span>
<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="n">hasher</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">BLOCKSIZE</span><span class="p">)</span>
<span class="n">document_hash</span> <span class="o">=</span> <span class="n">hasher</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Hash of </span><span class="si">%s</span><span class="s2"> is </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">FILENAME</span><span class="p">,</span> <span class="n">document_hash</span><span class="p">))</span>
</pre></div>
<p>When you run this script it should return the following output:</p>
<div class="highlight"><pre><span></span>Hash of /home/guest/Documents/bitcoin-logo.png is f6e4f3701cc1ab4695195d809d5a54d8cb3a87aa
</pre></div>
</div>
<div class="section" id="store-document-hash-on-the-blockchain">
<h2>2. Store document hash on the blockchain</h2>
<p>Now store the document hash from the previous step in a transaction output on the Blockchain.</p>
<p>The following script creates a wallet and a deposit address where you have to make a deposit
for the transaction fees.</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">bitcoinlib.transactions</span> <span class="kn">import</span> <span class="n">Output</span>
<span class="kn">from</span> <span class="nn">bitcoinlib.wallets</span> <span class="kn">import</span> <span class="n">wallet_create_or_open</span>
<span class="kn">from</span> <span class="nn">bitcoinlib.encoding</span> <span class="kn">import</span> <span class="n">varstr</span>
<span class="n">FEE_PER_TRANSACTION</span> <span class="o">=</span> <span class="mf">0.00005000</span>
<span class="n">DOCUMENT_HASH</span> <span class="o">=</span> <span class="s1">'f6e4f3701cc1ab4695195d809d5a54d8cb3a87aa'</span>
<span class="n">wallet</span> <span class="o">=</span> <span class="n">wallet_create_or_open</span><span class="p">(</span><span class="s1">'Messenger'</span><span class="p">)</span>
<span class="n">wk</span> <span class="o">=</span> <span class="n">wallet</span><span class="o">.</span><span class="n">get_key</span><span class="p">()</span>
<span class="n">wallet</span><span class="o">.</span><span class="n">utxos_update</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">wallet</span><span class="o">.</span><span class="n">utxos</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Please deposit </span><span class="si">%.8f</span><span class="s2"> Bitcoin to </span><span class="si">%s</span><span class="s2"> to create a Nulldata transaction"</span> <span class="o">%</span> <span class="p">(</span><span class="n">FEE_PER_TRANSACTION</span><span class="p">,</span> <span class="n">wk</span><span class="o">.</span><span class="n">address</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">lock_script</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">'</span><span class="se">\x6a</span><span class="s1">'</span> <span class="o">+</span> <span class="n">varstr</span><span class="p">(</span><span class="n">DOCUMENT_HASH</span><span class="p">)</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">wallet</span><span class="o">.</span><span class="n">send</span><span class="p">([</span><span class="n">Output</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">lock_script</span><span class="o">=</span><span class="n">lock_script</span><span class="p">)])</span>
<span class="n">t</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
</pre></div>
<p>Once the deposit has been received the transaction will be created and
pushed to the network.</p>
<div class="highlight"><pre><span></span>Transaction aff2e75be2b82cc179058bbc0255a96310e55b2956fa827a3776c64d6fe91f4d
Date: None
Network: bitcoin
Status: unconfirmed
Verified: True
Inputs
- 18KovL8EsjGGXo1ja4jcMihytbJcjd5sCw 1000 06d0cc8c8f85d7b10d02df8ff3abc5527e746760b19e7af9e2b656c6dc91e7b3 0
Script type: p2pkh, signatures: 1 (1 of 1)
Outputs
- NULLDATA b'\xf6\xe4\xf3p\x1c\xc1\xabF\x95\x19]\x80\x9dZT\xd8\xcb:\x87\xaa'
Fee: 1000
Confirmations: 0
Pushed to network: True
Wallet: Messenger
</pre></div>
</div>
<div class="section" id="proof-existence-of-a-document-with-the-blockchain">
<h2>3. Proof existence of a document with the blockchain</h2>
<p>To proof existence of the document on a particular date you need to have the original document and
the transaction ID.</p>
<p>Redo the first step to create a hash of the document. Then retrieve the transaction from the blockchain
and compare the document hash with the Nulldata output.</p>
<div class="highlight"><pre><span></span><span class="n">txid</span> <span class="o">=</span> <span class="s1">'aff2e75be2b82cc179058bbc0255a96310e55b2956fa827a3776c64d6fe91f4d'</span>
<span class="n">document_hash</span> <span class="o">=</span> <span class="s1">'f6e4f3701cc1ab4695195d809d5a54d8cb3a87aa'</span>
<span class="n">srv</span> <span class="o">=</span> <span class="n">Service</span><span class="p">()</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">srv</span><span class="o">.</span><span class="n">gettransaction</span><span class="p">(</span><span class="n">txid</span><span class="p">)</span>
<span class="n">found</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">t</span><span class="o">.</span><span class="n">outputs</span><span class="p">:</span>
<span class="k">if</span> <span class="n">o</span><span class="o">.</span><span class="n">script_type</span> <span class="o">==</span> <span class="s1">'nulldata'</span><span class="p">:</span>
<span class="n">tx_doc_hash</span> <span class="o">=</span> <span class="n">to_hexstring</span><span class="p">(</span><span class="n">o</span><span class="o">.</span><span class="n">lock_script</span><span class="p">[</span><span class="mi">2</span><span class="p">:])</span>
<span class="k">if</span> <span class="n">tx_doc_hash</span> <span class="o">==</span> <span class="n">document_hash</span><span class="p">:</span>
<span class="n">found</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">found</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Existence of document with hash </span><span class="si">%s</span><span class="s2"> proofed in transaction with ID </span><span class="si">%s</span><span class="s2"> on </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span>
<span class="p">(</span><span class="n">document_hash</span><span class="p">,</span> <span class="n">txid</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">date</span><span class="p">))</span>
</pre></div>
<p>If they match you have proofed the document existed on the time the transaction was confirmed.</p>
<div class="highlight"><pre><span></span>Existence of document with hash f6e4f3701cc1ab4695195d809d5a54d8cb3a87aa proofed in transaction with
ID aff2e75be2b82cc179058bbc0255a96310e55b2956fa827a3776c64d6fe91f4d on 2018-07-12 05:57:59
</pre></div>
</div>
Create a Litecoin Multisig Transaction2018-05-23T10:11:00+02:002019-11-14T22:55:00+01:00Lennart Jongeneeltag:coineva.com,2018-05-23:/create-litecoin-multisig-transaction.html<p class="first last">Create a Litecoin Multisig Transaction with the 2-of-3 multisig wallet using the BitcoinLib Command Line Utility</p>
<!-- :slug: create-litecoin-multisig-transaction: -->
<p>This guide assumes you <a class="reference external" href="https://coineva.com/create-litecoin-multisig-wallet.html">created a Litecoin 2-of-3 wallet</a>
following the previous article.</p>
<p>We will create a Litecoin multisig transaction using the command line wallet from
<a class="reference external" href="https://coineva.com/python-bitcoin-library.html">Python BitcoinLib</a> with the online main wallet
and an offline wallet.</p>
<img alt="Litecoin Multisig Transaction" class="align-right" src="/images/litecoin-transactions.jpg" style="width: 495px;" />
<div class="section" id="create-transaction-with-online-wallet">
<h2>Create transaction with online wallet</h2>
<p>First update your wallet and unspent transaction outputs:</p>
<div class="highlight"><pre><span></span>$ clw LitecoinMS-on -x
Command Line Wallet - BitcoinLib <span class="m">0</span>.4.11
Wallet info <span class="k">for</span> LitecoinMS-on
<span class="o">===</span> <span class="nv">WALLET</span> <span class="o">===</span>
ID <span class="m">39</span>
Name LitecoinMS-on
Owner
Scheme bip32
Multisig True
Multisig Wallet IDs <span class="m">40</span>, <span class="m">41</span>, <span class="m">42</span>
Cosigner ID <span class="m">0</span>
Witness <span class="nb">type</span> legacy
Main network litecoin
Latest update <span class="m">2019</span>-11-14 <span class="m">22</span>:57:24.785464
<span class="o">=</span> Multisig Public Master <span class="nv">Keys</span> <span class="o">=</span>
<span class="m">0</span> <span class="m">261</span> Ltub2VECoJe5hBU8kNinfTfFsyPz5qfDMiFhPmmWi89yMBGJH9MtjZk6zmhcmvg8FXm3ZBDRibocbSfFzGaczfrUjWT4ZsXNhbCchwr48MZgXyS bip32 main *
<span class="m">1</span> <span class="m">266</span> Ltub2UpT1zg3aS9mgDSoxF1KxXTFWQWJdySpgtQ8WMRX7pFX7BXfshnMjRP4LqApSVETddt6B9NBnjW4XqhWPprZXKfKk9oWEmUV8MsoVZ3EW5f bip32 cosigner
<span class="m">2</span> <span class="m">270</span> Ltub2V3tPynSv6pHv8tjXE3chMuDNybh1DmQXuKQ9bALUZ1Zw811u9PFS6QyEcKrC72PmK8rSyb1mv1mRHjTt22UrtmsP1hmrvTWz4vdPDZMUvR bip32 cosigner
For main keys a private master key is available <span class="k">in</span> this wallet to sign transactions. * cosigner key <span class="k">for</span> this wallet
- NETWORK: litecoin -
- - Keys
<span class="m">280</span> m/45<span class="err">'</span>/0/0/0 MFvNqhAWJY58yjLAME5V6ppivh9iVJJ6TH Multisig Key <span class="m">276</span>/265/279 <span class="m">0</span>.03266639 LTC
- - Transactions <span class="o">(</span>Account <span class="m">0</span>, Ltub2SSUS19CirucWsPQ8ekikRQ5BKr3FiQBfPUHoW4p9LP9MT7ifG5HBJvR3kkowxFm8aXiMSXXgRQfZHVGQCDWyMnBvnsDUzMkKT9eBQnt1nk<span class="o">)</span>
<span class="m">10</span> 9a9b4c9c9decefd50b7f40c3a243bbd514a18958cda70aa4fe9f82e0726e4d2f MFvNqhAWJY58yjLAME5V6ppivh9iVJJ6TH <span class="m">1</span> <span class="m">3266639</span> <span class="nv">U</span>
<span class="o">=</span> Balance Totals <span class="o">(</span>includes unconfirmed<span class="o">)</span> <span class="o">=</span>
litecoin <span class="o">(</span>Account <span class="m">0</span><span class="o">)</span> <span class="m">0</span>.03266639 LTC
</pre></div>
<p>If unspent transaction outputs are found you can create a transaction. We create a transaction
to send 0.01 LTC to another address.</p>
<div class="highlight"><pre><span></span>$ clw LitecoinMS-on -t LgaczM5X63xd7QNnKrLjLK4rhrSQqfxuKv <span class="m">1000000</span>
Command Line Wallet <span class="k">for</span> BitcoinLib
Transaction created
Transaction
Date: None
Network: litecoin
Status: new
Verified: False
Inputs
- MFvNqhAWJY58yjLAME5V6ppivh9iVJJ6TH <span class="m">3266639</span> 9a9b4c9c9decefd50b7f40c3a243bbd514a18958cda70aa4fe9f82e0726e4d2f <span class="m">0</span>
Script type: p2sh_multisig, signatures: <span class="m">1</span> <span class="o">(</span><span class="m">2</span> of <span class="m">3</span><span class="o">)</span>
Outputs
- LgaczM5X63xd7QNnKrLjLK4rhrSQqfxuKv <span class="m">1000000</span>
- 3LPmJ7DLR9v4ax6cSdPtgMB9jh7CDQ4Y64 <span class="m">2209347</span>
Fee: <span class="m">57292</span>
Confirmations: None
Pushed to network: False
Wallet: LitecoinMS-on
Transaction created but not send yet. Transaction dictionary <span class="k">for</span> export:
<span class="o">{</span><span class="s1">'fee'</span>: <span class="m">57292</span>,
<span class="s1">'inputs'</span>: <span class="o">[{</span><span class="s1">'address'</span>: <span class="s1">'MFvNqhAWJY58yjLAME5V6ppivh9iVJJ6TH'</span>,
<span class="s1">'output_n'</span>: <span class="m">0</span>,
<span class="s1">'prev_hash'</span>: <span class="s1">'9a9b4c9c9decefd50b7f40c3a243bbd514a18958cda70aa4fe9f82e0726e4d2f'</span>,
<span class="s1">'signatures'</span>: <span class="o">[{</span><span class="s1">'pub_key'</span>: <span class="s1">'0364170e13312e6a2a867ce65e868a5539d53ed79017943f95059a2525fef5bb0f'</span>,
<span class="s1">'sig_der'</span>: <span class="s1">'304502210091ddefdd9b18e036b0fe930a395914522f189c812c40fbbfbfe0d9936e645bfb022064c29a3fb85f0fac6ae0debeff410aca8c310c339def1ffa0e47b63a68b89f1a'</span>,
<span class="s1">'signature'</span>: <span class="s1">'91ddefdd9b18e036b0fe930a395914522f189c812c40fbbfbfe0d9936e645bfb64c29a3fb85f0fac6ae0debeff410aca8c310c339def1ffa0e47b63a68b89f1a'</span><span class="o">}]</span>,
<span class="s1">'value'</span>: <span class="m">3266639</span><span class="o">}]</span>,
<span class="s1">'network'</span>: <span class="s1">'litecoin'</span>,
<span class="s1">'outputs'</span>: <span class="o">[{</span><span class="s1">'address'</span>: <span class="s1">'LgaczM5X63xd7QNnKrLjLK4rhrSQqfxuKv'</span>,
<span class="s1">'value'</span>: <span class="m">1000000</span><span class="o">}</span>,
<span class="o">{</span><span class="s1">'address'</span>: <span class="s1">'3LPmJ7DLR9v4ax6cSdPtgMB9jh7CDQ4Y64'</span>,
<span class="s1">'value'</span>: <span class="m">2209347</span><span class="o">}]</span>,
<span class="s1">'raw'</span>: <span class="s1">'01000000012f4d6e72e0829ffea40aa7cd5889a114d5bb43a2c3407f0bd5efec9d9c4c9b9a00000000b50048304502210091ddefdd9b18e036b0fe930a395914522f189c812c40fbbfbfe0d9936e645bfb022064c29a3fb85f0fac6ae0debeff410aca8c310c339def1ffa0e47b63a68b89f1a014c6952210364170e13312e6a2a867ce65e868a5539d53ed79017943f95059a2525fef5bb0f21038de68940ee5bf5c3004c940768155338f0fd404049ecd5760219e7386726b97f2103ddd8009546aa3300d97cd6d49be227be78095ac72b05af8fe77490fd2091ce3f53aeffffffff0240420f00000000001976a914ea4349b431766be64c1c5015afd865e267d77a6988ac43b621000000000017a914cd271b873341f5364c9eb0217b5255be25f11cf98700000000'</span>
<span class="o">}</span>
</pre></div>
<p>The commandline wallet outputs the transaction in human readable format and as a Python dictionary.
The transaction does not verify yet because it is only signed by 1 signature and it needs 2.</p>
<p>Now save the Python dictionary to a USB stick in text format and name it 'tx_dict.txt'.</p>
</div>
<div class="section" id="sign-transaction-with-offline-wallet">
<h2>Sign transaction with offline wallet</h2>
<p>Go to the offline device to sign the transaction with the second key. Use the following command to
import the freshly transaction dictionary.</p>
<div class="highlight"><pre><span></span>$ clw LitecoinMS -a <path-to-usb-stick>/tx_dict.txt
Command Line Wallet <span class="k">for</span> BitcoinLib
Transaction
Date: None
Network: litecoin
Status: new
Verified: True
Inputs
- MFvNqhAWJY58yjLAME5V6ppivh9iVJJ6TH <span class="m">3266639</span> 9a9b4c9c9decefd50b7f40c3a243bbd514a18958cda70aa4fe9f82e0726e4d2f <span class="m">0</span>
Script type: p2sh_multisig, signatures: <span class="m">2</span> <span class="o">(</span><span class="m">2</span> of <span class="m">3</span><span class="o">)</span>
Outputs
- LgaczM5X63xd7QNnKrLjLK4rhrSQqfxuKv <span class="m">1000000</span>
- 3LPmJ7DLR9v4ax6cSdPtgMB9jh7CDQ4Y64 <span class="m">2209347</span>
Fee: <span class="m">57292</span>
Confirmations: None
Pushed to network: False
Wallet: LitecoinMS
Signed transaction:
<span class="o">{</span><span class="s1">'fee'</span>: <span class="m">57292</span>,
<span class="s1">'inputs'</span>: <span class="o">[{</span><span class="s1">'address'</span>: <span class="s1">'MFvNqhAWJY58yjLAME5V6ppivh9iVJJ6TH'</span>,
<span class="s1">'output_n'</span>: <span class="m">0</span>,
<span class="s1">'prev_hash'</span>: <span class="s1">'9a9b4c9c9decefd50b7f40c3a243bbd514a18958cda70aa4fe9f82e0726e4d2f'</span>,
<span class="s1">'signatures'</span>: <span class="o">[{</span><span class="s1">'pub_key'</span>: <span class="s1">'0364170e13312e6a2a867ce65e868a5539d53ed79017943f95059a2525fef5bb0f'</span>,
<span class="s1">'sig_der'</span>: <span class="s1">'304502210091ddefdd9b18e036b0fe930a395914522f189c812c40fbbfbfe0d9936e645bfb022064c29a3fb85f0fac6ae0debeff410aca8c310c339def1ffa0e47b63a68b89f1a'</span>,
<span class="s1">'signature'</span>: <span class="s1">'91ddefdd9b18e036b0fe930a395914522f189c812c40fbbfbfe0d9936e645bfb64c29a3fb85f0fac6ae0debeff410aca8c310c339def1ffa0e47b63a68b89f1a'</span><span class="o">}</span>,
<span class="o">{</span><span class="s1">'pub_key'</span>: <span class="s1">'038de68940ee5bf5c3004c940768155338f0fd404049ecd5760219e7386726b97f'</span>,
<span class="s1">'sig_der'</span>: <span class="s1">'3045022100ed4f1c06fecc53df9b36dd54a79d5b8764f147fc5538f707df6c4a6afd3070390220419311e194d9e42984f8c4ec246f12e587b9f9e67caaf417ad51c7a23a6bf52e'</span>,
<span class="s1">'signature'</span>: <span class="s1">'ed4f1c06fecc53df9b36dd54a79d5b8764f147fc5538f707df6c4a6afd307039419311e194d9e42984f8c4ec246f12e587b9f9e67caaf417ad51c7a23a6bf52e'</span><span class="o">}]</span>,
<span class="s1">'value'</span>: <span class="m">3266639</span><span class="o">}]</span>,
<span class="s1">'network'</span>: <span class="s1">'litecoin'</span>,
<span class="s1">'outputs'</span>: <span class="o">[{</span><span class="s1">'address'</span>: <span class="s1">'LgaczM5X63xd7QNnKrLjLK4rhrSQqfxuKv'</span>,
<span class="s1">'value'</span>: <span class="m">1000000</span><span class="o">}</span>,
<span class="o">{</span><span class="s1">'address'</span>: <span class="s1">'3LPmJ7DLR9v4ax6cSdPtgMB9jh7CDQ4Y64'</span>,
<span class="s1">'value'</span>: <span class="m">2209347</span><span class="o">}]</span>,
<span class="s1">'raw'</span>: <span class="s1">'01000000012f4d6e72e0829ffea40aa7cd5889a114d5bb43a2c3407f0bd5efec9d9c4c9b9a00000000fdfe000048304502210091ddefdd9b18e036b0fe930a395914522f189c812c40fbbfbfe0d9936e645bfb022064c29a3fb85f0fac6ae0debeff410aca8c310c339def1ffa0e47b63a68b89f1a01483045022100ed4f1c06fecc53df9b36dd54a79d5b8764f147fc5538f707df6c4a6afd3070390220419311e194d9e42984f8c4ec246f12e587b9f9e67caaf417ad51c7a23a6bf52e014c6952210364170e13312e6a2a867ce65e868a5539d53ed79017943f95059a2525fef5bb0f21038de68940ee5bf5c3004c940768155338f0fd404049ecd5760219e7386726b97f2103ddd8009546aa3300d97cd6d49be227be78095ac72b05af8fe77490fd2091ce3f53aeffffffff0240420f00000000001976a914ea4349b431766be64c1c5015afd865e267d77a6988ac43b621000000000017a914cd271b873341f5364c9eb0217b5255be25f11cf98700000000'</span><span class="o">}</span>
</pre></div>
<p>This will create a signed transaction and as you can see now it is verified and ready to send.</p>
<p>But before you continue please check if the transaction is the same as the original transaction. Besides
software or human mistakes it is a possibility someone hacks into your online PC and change the
transaction so it sends outputs to another address.</p>
</div>
<div class="section" id="send-transaction">
<h2>Send transaction</h2>
<p>Copy the transaction dictionary (or just the 'raw' part) to the USB stick. You can send the transaction
with any online transaction broadcast service, but below we will explain how to send it with your
online wallet. This way your online wallet is updated as well.</p>
<p>To send the transaction import the transaction in your online wallet. You could import it without
the 'push' option first to double check the transaction.</p>
<p>To broadcast your transaction to the network import the raw transaction and push.</p>
<div class="highlight"><pre><span></span>$ clw LitecoinMS -p -i 01000000012f4d6e72e0829ffea40aa7cd5889a114d5bb43a2c3407f0bd5efec9d9c4c9b9a00000000fdfe000048304502210091ddefdd9b18e036b0fe930a395914522f189c812c40fbbfbfe0d9936e645bfb022064c29a3fb85f0fac6ae0debeff410aca8c310c339def1ffa0e47b63a68b89f1a01483045022100ed4f1c06fecc53df9b36dd54a79d5b8764f147fc5538f707df6c4a6afd3070390220419311e194d9e42984f8c4ec246f12e587b9f9e67caaf417ad51c7a23a6bf52e014c6952210364170e13312e6a2a867ce65e868a5539d53ed79017943f95059a2525fef5bb0f21038de68940ee5bf5c3004c940768155338f0fd404049ecd5760219e7386726b97f2103ddd8009546aa3300d97cd6d49be227be78095ac72b05af8fe77490fd2091ce3f53aeffffffff0240420f00000000001976a914ea4349b431766be64c1c5015afd865e267d77a6988ac43b621000000000017a914cd271b873341f5364c9eb0217b5255be25f11cf98700000000
</pre></div>
<!-- == Restore wallet from backup
= Online wallet lost
Online PC:
create new temporary wallet with public keys and backup key
create new multisig wallet
transfer funds to new wallet (see create transaction section)
= Offline wallet lost
Online PC:
create transaction
create new multisig wallet
Offline PC:
sign transaction with backup key
Online PC
send tx to new wallet -->
</div>
Create a Litecoin Multisig Wallet2018-05-11T17:44:00+02:002019-11-14T22:46:00+01:00Lennart Jongeneeltag:coineva.com,2018-05-11:/create-litecoin-multisig-wallet.html<p class="first last">How to Create a Litecoin Multisig Wallet with the BitcoinLib Command Line Utility</p>
<!-- :slug: create-litecoin-multisig-wallet: -->
<p>This guide explains how to create a Litecoin 2 of 3 multisig wallet with the python
BitcoinLib command line wallet. The wallet has 3 private keys: one stored on a
online device, one on a offline device and one on a paper backup. Transactions are created
on the online device and then signed with the offline PC with the second signature.</p>
<p>If one device gets lost or broken the litecoins can be accessed with the backup key.
And if someone gets access to one of the devices your litecoins are still safe.</p>
<p>The safety of this wallet also depends on the safety of your devices and storage of the
backup key but this is out of scope for this article, so I leave that up to your common sense.</p>
<img alt="Litecoin Multisig Wallet with three Keys" class="align-right" src="/images/litecoin-multisig-2-of-3.jpg" style="width: 308px;" />
<div class="section" id="create-the-first-key-on-your-online-device">
<h2>Create the first key on your online device</h2>
<p>Install the <a class="reference external" href="https://coineva.com/python-bitcoin-library.html">Python BitcoinLib</a> on your online
device.</p>
<p>Create the first key on your online device with the command line wallet:</p>
<div class="highlight"><pre><span></span>$ clw -g -n litecoin
Command Line Wallet <span class="k">for</span> BitcoinLib
Your mnemonic private key sentence is: donkey blame tunnel album awake turkey fatigue immune keen nice gown alert
Please write down on paper and backup. With this key you can restore your wallet and all keys
Type <span class="s1">'yes'</span> <span class="k">if</span> you understood and wrote down your key: yes
Private Master key, to create multisig wallet on this machine:
Ltpv71G8qDifUiNetQH49pk8pBpNUeJZx4xBKvzESga8AkuRyqdUfNHKNAnSVK97DjYrq7UcPSkruByUpS6B9sDThcLeHEJ7ALKjVHFioeFf2RB
Public Master key, to share with other cosigner multisig wallets:
Ltub2VECoJe5hBU8kNinfTfFsyPz5qfDMiFhPmmWi89yMBGJH9MtjZk6zmhcmvg8FXm3ZBDRibocbSfFzGaczfrUjWT4ZsXNhbCchwr48MZgXyS
Network: litecoin
</pre></div>
<p>Now store the private and public key on a safe location on your online device.</p>
<p>(You can choose to create a backup of this key on paper or on another encrypted device in
case both your online and offline device get lost or broken. This creates an extra
security risk of course, so I leave it up to you. In any case: Do not store this backup
together with the offline device or other paper backup!)</p>
</div>
<div class="section" id="the-backup-key">
<h2>The backup key</h2>
<p>Install BitcoinLib on your offline device and then make sure it never goes online again.</p>
<p>Create the backup key and write down the Mnemonic passphrase on a piece of paper. Or on
a couple of papers and store them in vaults around the globe.</p>
<div class="highlight"><pre><span></span>$ clw -g -n litecoin
Your mnemonic private key sentence is: timber replace put whale tunnel swamp lawn alley consider farm betray actor
Please write down on paper and backup. With this key you can restore your wallet and all keys
Type <span class="s1">'yes'</span> <span class="k">if</span> you understood and wrote down your key: yes
Private Master key, to create multisig wallet on this machine:
Ltpv71G8qDifUiNesRsfsyPyg1qKDQPXs1EQv3th2LT8qQE44UADuQVDiKkvbGkLST5512opQsZaqudU3cdRLsJUUC2zS45XHgYdfK1MsyNJKVN
Public Master key, to share with other cosigner multisig wallets:
Ltub2UpT1zg3aS9mgDSoxF1KxXTFWQWJdySpgtQ8WMRX7pFX7BXfshnMjRP4LqApSVETddt6B9NBnjW4XqhWPprZXKfKk9oWEmUV8MsoVZ3EW5f
Network: litecoin
</pre></div>
<p>Copy the public account key and use it to create the wallet in the next step.</p>
</div>
<div class="section" id="install-the-offline-wallet">
<h2>Install the offline wallet</h2>
<p>You are now ready to create the offline wallet. For this you need the 2 public account
keys created in the previous steps.</p>
<div class="highlight"><pre><span></span>$ clw LitecoinMS -n litecoin -m <span class="m">3</span> <span class="m">2</span> Ltub2VECoJe5hBU8kNinfTfFsyPz5qfDMiFhPmmWi89yMBGJH9MtjZk6zmhcmvg8FXm3ZBDRibocbSfFzGaczfrUjWT4ZsXNhbCchwr48MZgXyS Ltub2UpT1zg3aS9mgDSoxF1KxXTFWQWJdySpgtQ8WMRX7pFX7BXfshnMjRP4LqApSVETddt6B9NBnjW4XqhWPprZXKfKk9oWEmUV8MsoVZ3EW5f
Command Line Wallet - BitcoinLib <span class="m">0</span>.4.11
Wallet LitecoinMS does not exist, create new wallet <span class="o">[</span>yN<span class="o">]</span>? y
CREATE wallet <span class="s1">'LitecoinMS'</span> <span class="o">(</span>litecoin network<span class="o">)</span>
Not all keys provided, creating <span class="m">1</span> additional keys
Your mnemonic private key sentence is: planet fashion payment involve lens night pattern truck feel antenna demand bean
Please write down on paper and backup. With this key you can restore your wallet and all keys
Type <span class="s1">'yes'</span> <span class="k">if</span> you understood and wrote down your key: yes
Wallet info <span class="k">for</span> <span class="nv">LitecoinMS</span>
<span class="o">===</span> <span class="nv">WALLET</span> <span class="o">===</span>
ID <span class="m">35</span>
Name LitecoinMS
Owner
Scheme bip32
Multisig True
Multisig Wallet IDs <span class="m">36</span>, <span class="m">37</span>, <span class="m">38</span>
Cosigner ID <span class="m">0</span>
Witness <span class="nb">type</span> legacy
Main network litecoin
Latest update <span class="nv">None</span>
<span class="o">=</span> Multisig Public Master <span class="nv">Keys</span> <span class="o">=</span>
<span class="m">0</span> <span class="m">241</span> Ltub2VECoJe5hBU8kNinfTfFsyPz5qfDMiFhPmmWi89yMBGJH9MtjZk6zmhcmvg8FXm3ZBDRibocbSfFzGaczfrUjWT4ZsXNhbCchwr48MZgXyS bip32 cosigner *
<span class="m">1</span> <span class="m">245</span> Ltub2V3tPynSv6pHv8tjXE3chMuDNybh1DmQXuKQ9bALUZ1Zw811u9PFS6QyEcKrC72PmK8rSyb1mv1mRHjTt22UrtmsP1hmrvTWz4vdPDZMUvR bip32 main
<span class="m">2</span> <span class="m">250</span> Ltub2UpT1zg3aS9mgDSoxF1KxXTFWQWJdySpgtQ8WMRX7pFX7BXfshnMjRP4LqApSVETddt6B9NBnjW4XqhWPprZXKfKk9oWEmUV8MsoVZ3EW5f bip32 cosigner
For main keys a private master key is available <span class="k">in</span> this wallet to sign transactions. * cosigner key <span class="k">for</span> this wallet
</pre></div>
<p>As you noticed the script creates the 3rd missing key, which is our offline key. I wouldn't
backup this key as it probably only degrades your security.</p>
</div>
<div class="section" id="final-step-create-the-online-wallet">
<h2>Final step: Create the Online wallet</h2>
<p>Go back to the online PC again. Use the private key created in the first step on this
online device and the public account keys from backup and offline wallet.</p>
<p>Then to create the new 2 of 3 multisig wallet type:</p>
<div class="highlight"><pre><span></span>$ clw LitecoinMS-on -n litecoin -m <span class="m">3</span> <span class="m">2</span> Ltpv71G8qDifUiNetQH49pk8pBpNUeJZx4xBKvzESga8AkuRyqdUfNHKNAnSVK97DjYrq7UcPSkruByUpS6B9sDThcLeHEJ7ALKjVHFioeFf2RB Ltub2UpT1zg3aS9mgDSoxF1KxXTFWQWJdySpgtQ8WMRX7pFX7BXfshnMjRP4LqApSVETddt6B9NBnjW4XqhWPprZXKfKk9oWEmUV8MsoVZ3EW5f Ltub2V3tPynSv6pHv8tjXE3chMuDNybh1DmQXuKQ9bALUZ1Zw811u9PFS6QyEcKrC72PmK8rSyb1mv1mRHjTt22UrtmsP1hmrvTWz4vdPDZMUvR
Command Line Wallet - BitcoinLib <span class="m">0</span>.4.11
Wallet LitecoinMS-on does not exist, create new wallet <span class="o">[</span>yN<span class="o">]</span>? y
CREATE wallet <span class="s1">'LitecoinMS-on'</span> <span class="o">(</span>litecoin network<span class="o">)</span>
Wallet info <span class="k">for</span> LitecoinMS-on
<span class="o">===</span> <span class="nv">WALLET</span> <span class="o">===</span>
ID <span class="m">39</span>
Name LitecoinMS-on
Owner
Scheme bip32
Multisig True
Multisig Wallet IDs <span class="m">40</span>, <span class="m">41</span>, <span class="m">42</span>
Cosigner ID <span class="m">0</span>
Witness <span class="nb">type</span> legacy
Main network litecoin
Latest update <span class="nv">None</span>
<span class="o">=</span> Multisig Public Master <span class="nv">Keys</span> <span class="o">=</span>
<span class="m">0</span> <span class="m">261</span> Ltub2VECoJe5hBU8kNinfTfFsyPz5qfDMiFhPmmWi89yMBGJH9MtjZk6zmhcmvg8FXm3ZBDRibocbSfFzGaczfrUjWT4ZsXNhbCchwr48MZgXyS bip32 main *
<span class="m">1</span> <span class="m">266</span> Ltub2UpT1zg3aS9mgDSoxF1KxXTFWQWJdySpgtQ8WMRX7pFX7BXfshnMjRP4LqApSVETddt6B9NBnjW4XqhWPprZXKfKk9oWEmUV8MsoVZ3EW5f bip32 cosigner
<span class="m">2</span> <span class="m">270</span> Ltub2V3tPynSv6pHv8tjXE3chMuDNybh1DmQXuKQ9bALUZ1Zw811u9PFS6QyEcKrC72PmK8rSyb1mv1mRHjTt22UrtmsP1hmrvTWz4vdPDZMUvR bip32 cosigner
For main keys a private master key is available <span class="k">in</span> this wallet to sign transactions. * cosigner key <span class="k">for</span> this wallet
</pre></div>
<p>Verify if the first address is the same in the offline and online wallet.</p>
</div>
<div class="section" id="next-step-create-a-transaction">
<h2>Next step: Create a Transaction</h2>
<p>Now your 2 of 3 Litecoin multisig wallet is complete and ready to store litecoins.
In the next article I will explain how to spend them and
<a class="reference external" href="https://coineva.com/create-litecoin-multisig-transaction.html">create a Litecoin multisig transaction</a></p>
</div>
Guide: Create a safe offline wallet without printer2018-04-09T21:54:00+02:002018-04-09T21:54:00+02:00Lennart Jongeneeltag:coineva.com,2018-04-09:/create-safe-offline-wallet-without-printer.html<p class="first last">Create a safe offline crypto currency wallet on an offline system without using a printer</p>
<div class="section" id="what-s-wrong-with-a-printer">
<span id="create-safe-offline-wallet-without-printer"></span><h2>What's wrong with a printer?</h2>
<p>Many things. Most printers contain a large storage device which remembers all printed documents for a indefinite amount
of time. There are good changes you communicate to your printer via a wireless network which packages can be easily
intercepted in various ways. And almost all modern printers are online, continuously connected to the internet and
safety is not high on the list of priorities of most printer manufacturers.</p>
<p>So if you print an offline 'super secure' paper wallet it could be intercepted and emptied before the print is
finished or the funds could disappear after 5 years when your dump your printer in the garbage and someone is so
clever to check the hard drive in the printer.</p>
<img alt="No printers" class="align-center" src="/images/noprinter.png" style="width: 1200px;" />
</div>
<div class="section" id="steps-to-create-an-offline-wallet-prepare-laptop">
<h2>Steps to create an offline wallet: Prepare Laptop</h2>
<p>First you need a old PC or laptop which you can miss and keep offline. Install a fresh copy of Linux OS such as
Debian or Ubuntu on it and then install the Python BitcoinLib. See <a class="reference external" href="https://github.com/1200wd/bitcoinlib">https://github.com/1200wd/bitcoinlib</a></p>
<p>Ubuntu allows you to encrypt your home folder or the full disc. It is advised to use this option, but select a
strong encryption password and do not forget it.</p>
<div class="highlight"><pre><span></span>pip install bitcoinlib
</pre></div>
<p>Look at <a class="reference external" href="http://bitcoinlib.readthedocs.io/en/latest/_static/manuals.install.html">http://bitcoinlib.readthedocs.io/en/latest/_static/manuals.install.html</a> for detailed installation instructions.</p>
<p>To show QR codes in the terminal you can optionally install a python QR code module</p>
<div class="highlight"><pre><span></span>pip install qrcodelib
</pre></div>
<p>Disclaimer: The Python Bitcoin Library BitcoinLib has been tested and used extensively but is still in Alpha
development phase. To use it technical knowledge is required and a basic understanding of python is recommended.
Please use carefully and at your own risk.</p>
</div>
<div class="section" id="next-step-create-a-secure-offline-wallet">
<h2>Next Step: Create a secure offline Wallet</h2>
<p>After your laptop is configured and the BitcoinLib is working take if offline so we can create a new secure wallet.</p>
<p>Go to the tools directory of BitcoinLib, create a new wallet and generate an addresses to receive funds:</p>
<div class="highlight"><pre><span></span>clw mywallet-priv -u
</pre></div>
<p>Type 'y' to create an new wallet and write down to passphrase to at least 2 pieces of paper as backup. You can
recreate a wallet with one of these pieces of papers if you lose access to your PC/Laptop</p>
<div class="highlight"><pre><span></span>lennart@c:~$ clw mywallet-priv -u
Command Line Wallet <span class="k">for</span> BitcoinLib
Wallet mywallet-priv does not exist, create new wallet <span class="o">[</span>yN<span class="o">]</span>? y
CREATE wallet <span class="s1">'mywallet-priv'</span> <span class="o">(</span>bitcoin network<span class="o">)</span>
Your mnemonic private key sentence is: toward music glory great faith sustain work length gossip easy dizzy clever
Please write down on paper and backup. With this key you can restore your wallet and all keys
Type <span class="s1">'yes'</span> <span class="k">if</span> you understood and wrote down your key: yes
Updating wallet
Wallet info <span class="k">for</span> mywallet-priv
<span class="o">===</span> <span class="nv">WALLET</span> <span class="o">===</span>
ID <span class="m">3</span>
Name mywallet-priv
Owner
Scheme bip44
Main network <span class="nv">bitcoin</span>
<span class="o">=</span> Wallet Master <span class="nv">Key</span> <span class="o">=</span>
ID <span class="m">72</span>
Private True
Depth <span class="m">0</span>
- NETWORK: bitcoin -
- - Keys
<span class="m">72</span> m 1M4bY9QqkiJsmrAmpD611bksrPfjFoMbgY mywallet-priv <span class="m">0</span>.00000000 BTC
<span class="m">73</span> m/44<span class="s1">' 1GZwumEZTXjxBwTpfaqCHwiNphpcXnydEM mywallet-priv 0.00000000 BTC</span>
<span class="s1"> 74 m/44'</span>/0<span class="s1">' 17zdAqPsqG57ztr5gAPk8dDTAArvxBoPKH mywallet-priv 0.00000000 BTC</span>
<span class="s1"> 75 m/44'</span>/0<span class="s1">'/0'</span> 1M81iGJqXpXU2De4eutj3c1gSprqfUZbdJ Account <span class="c1">#0 0.00000000 BTC</span>
<span class="m">76</span> m/44<span class="s1">'/0'</span>/0<span class="s1">'/0 1GsmxzLQbBKXkUAEsxvRmQs3o3L5yRDvDc Account #0 Payments 0.00000000 BTC</span>
<span class="s1"> 77 m/44'</span>/0<span class="s1">'/0'</span>/1 1Jmv5EhGPMVVmG5Bn5PPq1ovkG9ccfocpT Account <span class="c1">#0 Change 0.00000000 BTC</span>
<span class="m">78</span> m/44<span class="s1">'/0'</span>/0<span class="s1">'/0/0 1DJT5PtdrkRvPUTaPXEmCjL7RzVBRsnuhL Key 0 0.00000000 BTC</span>
<span class="s1"> 79 m/44'</span>/0<span class="s1">'/0'</span>/0/1 1Bo1ZSw3rkqyoVLHGrD1TpnVWMZmV8eoCs Key <span class="m">1</span> <span class="m">0</span>.00000000 BTC
<span class="m">80</span> m/44<span class="s1">'/0'</span>/0<span class="s1">'/0/2 18bhdmbv5YDae7Aw28XtQuP8WJ47bPBzYS Key 2 0.00000000 BTC</span>
<span class="s1"> 81 m/44'</span>/0<span class="s1">'/0'</span>/0/3 126FWpggWSLAzQYcJ3zQCjh85ZKVv5VE3M Key <span class="m">3</span> <span class="m">0</span>.00000000 BTC
<span class="m">82</span> m/44<span class="s1">'/0'</span>/0<span class="s1">'/0/4 1Ay2KnQyyEEYfM1BoEpyQneqLZjAyZYzyd Key 4 0.00000000 BTC</span>
<span class="s1"> 83 m/44'</span>/0<span class="s1">'/0'</span>/1/0 1Pq9ZANWmSXsMgdjsiMcmN2grdog6MKRv6 Change <span class="m">0</span> <span class="m">0</span>.00000000 BTC
<span class="m">84</span> m/44<span class="s1">'/0'</span>/0<span class="s1">'/1/1 1Lnrdad7ZPK7G6ysgDuUhsc3e43SCCgkDM Change 1 0.00000000 BTC</span>
<span class="s1"> 85 m/44'</span>/0<span class="s1">'/0'</span>/1/2 1CkiLqUq8bWhgf3vQKeGSSwVCsE5RFHc38 Change <span class="m">2</span> <span class="m">0</span>.00000000 BTC
<span class="m">86</span> m/44<span class="s1">'/0'</span>/0<span class="s1">'/1/3 1HSYFNrgaa3Aoof9pz44Jy8w8iZAQE6cxZ Change 3 0.00000000 BTC</span>
<span class="s1"> 87 m/44'</span>/0<span class="s1">'/0'</span>/1/4 13295LYWJz2smeG1PbBDTA3LDdiPqmPUwT Change <span class="m">4</span> <span class="m">0</span>.00000000 BTC
- - Transactions <span class="o">(</span>Account <span class="m">0</span>, xpub6CDUND4VWCjyL4bYqY9ngbSrnmSeqTPtwqdDVQ8p5YYLhippqKiLFmbCHvP4ZbpE3C1DzkiAHMkWpycmY6kqhSvRHTCVWiyAYhA4j3StK8Q<span class="o">)</span>
<span class="o">=</span> Balance Totals <span class="o">(</span>includes unconfirmed<span class="o">)</span> <span class="o">=</span>
</pre></div>
<p>The '-u' option is to update transactions and in this case it is used to create new addresses / keys/</p>
<p>Now copy your public account key WIF showed in the wallet info on the line starting with '- - Transactions'. In this case:
xpub6C5F532enEXKa4Q8RFGVUeLwQ86BNCWaqMCgq8uSqxeRFtiAziDPYG9sH2SJB1dmzVAfTnZiWQNxBeXRcGSnyNc7rRD38Pe2vU5RW1o9mhK</p>
</div>
<div class="section" id="create-an-online-wallet">
<h2>Create an online wallet</h2>
<p>On your online PC create an online public wallet using the public account key from the offline wallet. Use the '-u'
option again to creates a couple of new keys / addresses.</p>
<div class="highlight"><pre><span></span>clw mywallet-pub -u -c xpub6CZhfzY66MTQFXuwMoKNUJWeBY152kPEFASoESfvgLj2SzeF7DZZN64UKv9foLNQ5STxyMEfWWXon6J7oVBFyw7nmDqpahWbWGF3HQkj9fp
</pre></div>
<p>A new wallet has been created and all key addresses should be the same.</p>
<p>The public wallet is a watch-only wallet it cannot sign and send transaction. But with the public wallet you can:
- Create new addresses (keys)
- View your balance
- Download transactions and unspent outputs
- Create new unsigned transactions</p>
</div>
<div class="section" id="receive-a-payment">
<h2>Receive a payment</h2>
<p>Now send funds to a wallet's receive address. Show an available address with:</p>
<div class="highlight"><pre><span></span>clw mywallet-pub -r
</pre></div>
<p>If you have installed the qrcodelib you can now scan the QR code with another online application to get the
address so you can transfer funds to your wallet.</p>
<p>Your wallet will be updated when you call clw without extra options. Once you have send the funds they
should show on your online PC with:</p>
<div class="highlight"><pre><span></span>clw mywallet-pub -u
</pre></div>
</div>
<div class="section" id="create-and-send-a-transaction">
<h2>Create and send a transaction</h2>
<p>Now on create a transaction with your online wallet like this:</p>
<div class="highlight"><pre><span></span>lennart@c:~$ clw mywallet-pub -t 3LrXizKejCGYyGUxYzGweyuxFVtfs3odEe <span class="m">100000</span>
Command Line Wallet <span class="k">for</span> BitcoinLib
Transaction created
Transaction
Date: None
Network: bitcoin
Status: new
Verified: False
Inputs
- 1Ay2KnQyyEEYfM1BoEpyQneqLZjAyZYzyd <span class="m">148414</span> db158f07381d9cc87ef27eed4ecb604b7405163e1ab4563e6c10537fc6aa6ee9 <span class="m">1</span>
Script type: p2pkh, signatures: <span class="m">0</span> <span class="o">(</span><span class="m">1</span> of <span class="m">1</span><span class="o">)</span>
Outputs
- 3LrXizKejCGYyGUxYzGweyuxFVtfs3odEe <span class="m">100000</span>
- 13295LYWJz2smeG1PbBDTA3LDdiPqmPUwT <span class="m">46194</span>
Fee: <span class="m">2220</span>
Confirmations: None
Pushed to network: False
Wallet: mywallet-pub
Transaction created but not send yet. Transaction dictionary <span class="k">for</span> export:
<span class="o">{</span><span class="s1">'fee'</span>: <span class="m">2220</span>,
<span class="s1">'inputs'</span>: <span class="o">[{</span><span class="s1">'address'</span>: <span class="s1">'1Ay2KnQyyEEYfM1BoEpyQneqLZjAyZYzyd'</span>,
<span class="s1">'output_n'</span>: <span class="m">1</span>,
<span class="s1">'prev_hash'</span>: <span class="s1">'db158f07381d9cc87ef27eed4ecb604b7405163e1ab4563e6c10537fc6aa6ee9'</span>,
<span class="s1">'signatures'</span>: <span class="o">[]</span>,
<span class="s1">'value'</span>: <span class="m">148414</span><span class="o">}]</span>,
<span class="s1">'network'</span>: <span class="s1">'bitcoin'</span>,
<span class="s1">'outputs'</span>: <span class="o">[{</span><span class="s1">'address'</span>: <span class="s1">'3LrXizKejCGYyGUxYzGweyuxFVtfs3odEe'</span>, <span class="s1">'value'</span>: <span class="m">100000</span><span class="o">}</span>,
<span class="o">{</span><span class="s1">'address'</span>: <span class="s1">'13295LYWJz2smeG1PbBDTA3LDdiPqmPUwT'</span>, <span class="s1">'value'</span>: <span class="m">46194</span><span class="o">}]</span>,
<span class="s1">'raw'</span>: <span class="s1">'0100000001e96eaac67f53106c3e56b41a3e1605744b60cb4eed7ef27ec89c1d38078f15db0100000000ffffffff02a08601000000000017a914d237028e93ddb5e063c5f47685557e7b7265549e8772b40000000000001976a914162768737af6846894ec022692825c1e714f21de88ac00000000'</span><span class="o">}</span>
</pre></div>
<p>This will output a transaction overview with a python dictionary style output. Copy the transaction dictionary to
your offline PC for instance with the help of an USB stick.</p>
<div class="highlight"><pre><span></span>clw mywallet-priv -a <path-to-usb>/txdict.txt
</pre></div>
<p>The transaction will be imported and signed by the offline wallet and the transaction information is showed. Copy the
raw transaction hash and save it to the USB stick.</p>
<p>To push the transaction to the network import the raw transaction on the online PC.</p>
<div class="highlight"><pre><span></span>clw mywallet-pub -i <span class="s2">"0100000001e96eaac67f53106c3e56b41a3e1605744b60cb4eed7ef27ec89c1d38078f15db010000006b483045022100ed3681a573783a691f85311a5c4af6302742c331f049bf793b7d7eca30d2e60402201126c83895d1f3bd0f0e32a3d2e6fb2c22da11615e33282c7cb6d2b0de151505012102babad319637c497291a81ac53a84dd0485971303cc52ea635915640dc3cde097ffffffff02a08601000000000017a914d237028e93ddb5e063c5f47685557e7b7265549e8772b40000000000001976a914162768737af6846894ec022692825c1e714f21de88ac00000000"</span> -p
</pre></div>
<p>And if transaction is successfully pushed you will receive a message like this:</p>
<div class="highlight"><pre><span></span>Transaction pushed to network. Transaction ID: 8606205a652d9340569444f728fddfb03acadd1d270063872b4e4bc5bd3d4291
</pre></div>
<p>When you open the wallet again you will see the updated balance and transaction.</p>
<p>Good luck,</p>
<p>Lennart</p>
<p>PS: There are still a little bit of sathosis left on this wallet with the private key shown above. If you are the first
one to find them: congratulations and drink a coffee or beer on me!</p>
</div>
Claim your Bitcoin Gold, Bitcoin Cash or other forks2017-12-13T13:54:00+01:002017-12-13T18:22:00+01:00Lennart Jongeneeltag:coineva.com,2017-12-13:/claim-bitcoin-cash-bitcoin-gold-or-other-forks.html<p class="first last">How to claim your Bitcoin Cash, Bitcoin Gold or other coins after a bitcoin hard fork</p>
<div class="section" id="when-can-you-claim-your-bitcoin-cash-or-gold">
<h2>When can you claim your Bitcoin Cash or Gold?</h2>
<p>If you had bitcoins in your hardware of software wallet on the date of the fork you can claim
your coins. You need to know the private keys of the corresponding bitcoin addresses containing
value on the date of the fork.</p>
<p>You can not claim any forked coin if you stored your bitcoins on an exchange or online wallet.</p>
<img alt="Cool Forks" class="align-left" src="/images/forks-are-cool.jpg" style="width: 450px;" />
<p>Bitcoin Cash forked on August 1th 2017, Bitcoin Gold on October 24th and Bitcoin Diamond on
November 24th. More forks will probably follow, a complete list can be found on Wikipedia
(<a class="reference external" href="https://en.wikipedia.org/wiki/List_of_Bitcoin_forks">https://en.wikipedia.org/wiki/List_of_Bitcoin_forks</a>)</p>
</div>
<div class="section" id="what-is-a-fork-what-happened">
<h2>What is a fork, what happened?</h2>
<p>When the first major Bitcoin fork in August 2017 took place nothing happened to Bitcoin itself.
The network, protocol and blockchain with all the transactions stayed exactly the same.
The only thing what happened was that some people / miners copied the blockchain with all the
transactions - and thus address balances - and changed a few things in the protocol.</p>
<p>With the Bitcoin Cash fork for instance the size of the blocks was increased, allowing more
transactions but increasing demand on storage and bandwidth. But no politics here, just
Google 'blocksize debate' to find more about this fierce debate with lasted for years.</p>
</div>
<div class="section" id="do-i-have-to-claim-my-bitcoin-gold-cash-or-diamond">
<h2>Do I have to claim my Bitcoin Gold, Cash or Diamond?</h2>
<p>No. If you have the private keys and keep them you are already the owner of the Bitcoin Gold,
Diamond or Cash coins or whatever future forks might occur. You can always claim them later.
Only if you want to use or exchange them you need to take some actions described below.</p>
</div>
<div class="section" id="how-do-i-claim-bitcoin-gold-cash-or-diamond">
<h2>How do I claim Bitcoin Gold, Cash or Diamond?</h2>
<p>There are many ways to do this, but on this page I will try to describe the easiest way in my
opinion.</p>
<ol class="arabic simple">
<li>Transfer the bitcoins to another address in the same or another wallet.</li>
<li>Second step is to find the private key.</li>
<li>Then sweep the private key and transfer it to your Coinomi wallet.</li>
<li>As final step you can leave the coins in your Coinomi wallet or exchange it for Bitcoins or another coin.</li>
</ol>
<p>First a little warning:</p>
</div>
<div class="section" id="beware-of-phishing-and-scams">
<h2>Beware of phishing and scams</h2>
<p>Some website ask you to enter a private key to claim your forked coins.
This is not the way to claim your coins. It could be a phishing website, the
website could be hacked or someone could intercept your internet traffic resulting in loss
of all your bitcoins.</p>
<p>So never enter your private key on any website, even if you fully trust the website!</p>
</div>
<div class="section" id="step-1-transfer-the-bitcoins-to-another-address">
<h2>Step 1: Transfer the bitcoins to another address</h2>
<p>To reduce risks it is advisable to transfer the bitcoins to another private key / address.
It is not needed but just good practice before you start working with a private key.</p>
<p>If you bitcoins are stored on a paper wallet you find more information on how transfer on
this page:
<a class="reference external" href="https://coineva.com/what-to-do-with-my-paper-wallet.html">What to do with my paper wallet?</a></p>
<p>Otherwise just create a transaction in your wallet and send to one of your own addresses:
Copy the address from receive and paste it to send.</p>
</div>
<div class="section" id="step-2-look-for-your-private-key">
<h2>Step 2: Look for your private key</h2>
<p>Now look for your private keys. This is different for every wallet, in Electrum for instance
go to the address tab and right click on an address which had funds on the day of the fork -
could be in 'used' addresses - and then select 'Private Key'. If you cannot find a private key in
your wallet you might have to unlock it first.</p>
<img alt="Get your private key from Electrum" class="align-center" src="/images/electrum-get-private-key.png" style="width: 600px;" />
<p>Be careful with your private key, do not share it with anyone.</p>
</div>
<div class="section" id="step-3-sweep-the-private-key-with-coinomi">
<h2>Step 3: Sweep the private key with Coinomi</h2>
<p>Install or update Coinomi on your android device. Follow the installation instructions and
make sure you make a backup of the Coinomi recovery phrase.</p>
<img alt="Add Bitcoin Gold to Coinomi" class="align-center" src="/images/coinomi-add-coin.png" style="width: 450px;" />
<p>Next open the left menu and select '+ Coins' and add Bitcoin Gold, Bitcoin Diamond or any other
forked coin.</p>
<p>Go to the coin, select 'Sweep wallet' from the right menu and scan the QR code of the private
key from the previous step. Your coins are now swept to your coinomi wallet and are visible within
a few moments. Before you can use them they need to be confirmed / included in a block this
can take a while.</p>
<p>Repeat this process with every address with coins in your wallet.</p>
</div>
<div class="section" id="step-4-exchange-transfer-or-store-your-new-coins">
<h2>Step 4: Exchange, Transfer or store your new coins</h2>
<p>Once you have received the new coins in your Coinomi wallet it is up to you what to do with them.
You can leave them in Coinomi, although this is not advised for larger amount as your phone
is probably not a very secure device. Or you can transfer them to another wallet or exchange.</p>
<img alt="Add Bitcoin Gold to Coinomi" class="align-center" src="/images/coinomi-shapeshift-exchange.png" style="width: 450px;" />
<p>Coinomi also has the option to exchange coins within the same wallet. For instance to exchange from
Bitcoin Cash to Bitcoin: open your Bitcoin Cash page and select 'ShapeShift' from the left menu.
You can now choose how many funds you would like to exchange, select 'Next' and enter your password
to proceed. Now your funds will be send to ShapeShift in the background and - this is a bit scary -
disappear from your wallet, it can take a while before the bitcoins show up.</p>
</div>
Use Nulldata to store data on the Bitcoin Blockchain2017-10-12T11:14:00+02:002018-12-26T15:51:00+01:00Lennart Jongeneeltag:coineva.com,2017-10-12:/use-nulldata-to-send-blockchain-messages.html<p class="first last">How to send messages or store data on the Bitcoin blockchain</p>
<div class="section" id="blockchain-to-send-and-store-data">
<h2>Blockchain to Send and Store Data</h2>
<p>Not many people know that besides transacting and storing value, the bitcoin blockchain offers
an option to 'send data' instead of currency and store small amounts of data in the blockchain.</p>
<p>To store data in the blockchain you just send a transaction, but instead of sending it to another bitcoin
address you send a Null Data transaction with a zero value output. So 1 of the outputs does not contain
an amount and address, but a message and an amount of zero.</p>
<p>A Null Data transaction and consists of an OP_RETURN byte followed by the length of the and then
the actual 0 to 80 bytes of data.</p>
<p>The output amount of the Null Data output is zero, but the transaction still requires an input with enough value
to cover the transaction fees.</p>
</div>
<div class="section" id="how-to-send-a-message-transaction">
<h2>How to Send a Message Transaction</h2>
<p>As far as I know there is no GUI wallet offering the option to send a data transaction at the moment,
but with some code and the <a class="reference external" href="https://coineva.com/python-bitcoin-library.html">Python BitcoinLib</a>
it is easy to do.</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">bitcoinlib.transactions</span> <span class="kn">import</span> <span class="n">Output</span>
<span class="kn">from</span> <span class="nn">bitcoinlib.wallets</span> <span class="kn">import</span> <span class="n">wallet_create_or_open</span>
<span class="kn">from</span> <span class="nn">bitcoinlib.encoding</span> <span class="kn">import</span> <span class="n">varstr</span>
<span class="n">wallet</span> <span class="o">=</span> <span class="n">wallet_create_or_open</span><span class="p">(</span><span class="s1">'Messenger'</span><span class="p">)</span>
<span class="n">wk</span> <span class="o">=</span> <span class="n">wallet</span><span class="o">.</span><span class="n">get_key</span><span class="p">()</span>
<span class="n">wallet</span><span class="o">.</span><span class="n">utxos_update</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">wallet</span><span class="o">.</span><span class="n">utxos</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Please deposit to </span><span class="si">%s</span><span class="s2"> to start creating Nulldata transactions"</span> <span class="o">%</span> <span class="n">wk</span><span class="o">.</span><span class="n">address</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">lock_script</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">'j'</span> <span class="o">+</span> <span class="n">varstr</span><span class="p">(</span><span class="sa">b</span><span class="s1">'Please leave a message after the beep'</span><span class="p">)</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">wallet</span><span class="o">.</span><span class="n">send</span><span class="p">([</span><span class="n">Output</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">lock_script</span><span class="o">=</span><span class="n">lock_script</span><span class="p">)])</span>
<span class="n">t</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
</pre></div>
<p>The locking script of the Null Data output starts with the OP_RETURN opcode followed by the data string.
The data string can contain anything you like, a size byte is added by the varstr() method.</p>
</div>
<div class="section" id="nulldata-acceptance-issues">
<h2>Nulldata acceptance issues</h2>
<p>Not all Bitcoin nodes and Service providers accept Nulldata transactions or accept only Nulldata with a
maximum size of 40 bytes. If you encounter this problem, you could set up your own bitcoin node and use
this or specify an service provider when sending the transaction.</p>
</div>
<div class="section" id="where-can-this-be-used-for">
<h2>Where can this be used for?</h2>
<p>Besides tagging the blockchain with your graffiti this has some useful applications. The blockchain
is a timestamped database of records which cannot be modified or deleted after they are included in the
blockchain. This is nice (and necessary) for storing value but can also be used to prove existence of a document
on a specific date: a renting contract or birth certificate for instance.</p>
<p>On the Proof Of Existence website (<a class="reference external" href="https://poex.io">https://poex.io</a>) you can store a hash of any document, which proves the existence of
a document on a specific data. And in my article: "
<a class="reference external" href="https://coineva.com/proof-existence-store-documents-hash-blockchain.html">Proof existence of documents using Nulldata</a> "
is explained how to do this yourself with BitcoinLib.</p>
<p>Storing data is not limited to the Bitcoin blockchain,
<a class="reference external" href="https://coineva.com/use-nulldata-to-store-data-on-litecoin-or-dash-blockchain.html">Null data transactions are also available on the Litecoin or Dash blockchain</a>.</p>
<p>But Null Data messages can also be used to build another layer on the blockchain network to store assets
or other crypto currencies. Colored coins (<a class="reference external" href="https://en.wikipedia.org/wiki/Colored_coin">https://en.wikipedia.org/wiki/Colored_coin</a>)
or Counterparty (<a class="reference external" href="https://counterparty.io">https://counterparty.io</a>) are examples of this.</p>
</div>
<div class="section" id="read-your-message">
<h2>Read your message</h2>
<p>You can use the BitcoinLib to retreive transactions and read nulldata messages. Some block explorers such
as smartbit.au.com and btc.com also show decode nulldata messages.</p>
<p>I couldn't help it and embedded the Python script above in the bitcoin blockchain. The script has been
split up in seven parts as one nulldata script can only contain 80 bytes. And a transaction can only contain
one nulldata script, so seven transactions are needed. The first byte in the script is used to determine the
order.</p>
<p>The python script can be found in these 8 transactions:
<a class="reference external" href="https://www.smartbit.com.au/tx/c6960cd3a688db18550c06b08ed744382cfc9abce63cf6f97981e4b61bba81dc">c6960cd3a688db18550c06b08ed744382cfc9abce63cf6f97981e4b61bba81dc</a>
<a class="reference external" href="https://www.smartbit.com.au/tx/7af7bea324b9cf4d6692d7b63518c076c55616c7943310dec9c23b2435ca4609">7af7bea324b9cf4d6692d7b63518c076c55616c7943310dec9c23b2435ca4609</a>
<a class="reference external" href="https://www.smartbit.com.au/tx/31328c4e23abd547e4b6f49546a584ed969ed9b106f177f06365ea8f2222d576">31328c4e23abd547e4b6f49546a584ed969ed9b106f177f06365ea8f2222d576</a>
<a class="reference external" href="https://www.smartbit.com.au/tx/8f0551fd70fa8cb4a92121277fdab51e88856c669a1ae4a8143c1ccf1fce3d26">8f0551fd70fa8cb4a92121277fdab51e88856c669a1ae4a8143c1ccf1fce3d26</a>
<a class="reference external" href="https://www.smartbit.com.au/tx/2bb9e14d2005bd633e632399c702bcbd8438f0a4ea636400a6efceb14b8d14d0">2bb9e14d2005bd633e632399c702bcbd8438f0a4ea636400a6efceb14b8d14d0</a>
<a class="reference external" href="https://www.smartbit.com.au/tx/055a22998664a6ffb5bddb7db38933bded2442c22991ea76dd363a1265ec4967">055a22998664a6ffb5bddb7db38933bded2442c22991ea76dd363a1265ec4967</a>
<a class="reference external" href="https://www.smartbit.com.au/tx/da6fc4129b7fcd1c79fe9d96cb128c9edca897090048ff7b136ffcaf3baf50c6">da6fc4129b7fcd1c79fe9d96cb128c9edca897090048ff7b136ffcaf3baf50c6</a></p>
<p>Technically you can create a transaction with multiple nulldata scripts. Such a transaction is considered valid
but is non-standard and will be rejected by most bitcoin clients.</p>
</div>
What to do with my paper wallet?2017-07-01T14:36:00+02:002017-07-01T14:36:00+02:00Lennart Jongeneeltag:coineva.com,2017-07-01:/what-to-do-with-my-paper-wallet.html<p class="first last">Step-by-step instruction guide if you have received a paper wallet</p>
<p>Nice, you have just received a paper wallet with bitcoins! After reading this page you know what do
with them, but whatever you do please keep this in mind:</p>
<ul class="simple">
<li>If you lose this paper and did not make a copy your bitcoins are lost forever</li>
<li>Anyone who has access to the private key on this paper, can steal your bitcoins</li>
</ul>
<div class="section" id="decision-tree">
<h2>Decision Tree</h2>
<img alt="Decision tree for your paper wallet" class="align-center" src="/images/decision-tree-paper-wallet.png" style="width: 600px;" />
</div>
<div class="section" id="option-1-create-an-online-wallet-and-sell">
<h2>Option 1: Create an online wallet and sell</h2>
<p>There are several online wallets out there and numerous places where you can sell
your bitcoins. Follow this guide on
<a class="reference external" href="https://coineva.com/create-blockchain-info-wallet.html">how to create Blockchain.info Wallet</a>
. It is easy to setup, requires no ID verification and it is safe.</p>
<p>Once you have <a class="reference external" href="https://coineva.com/paper-wallet-import-blockchain-info.html">made the transfer from your paper wallet</a>
to the online wallet you can
<a class="reference external" href="https://coineva.com/sell-bitcoins-on-bitonic.html">sell your bitcoins on Bitonic</a>
and they will be transferred in Euro's within 1 business day to any IBAN bank account.</p>
</div>
<div class="section" id="option-2-do-nothing-and-just-store-this-paper">
<h2>Option 2: Do nothing and just store this paper</h2>
<p>With the private key on the paper wallet you can unlock your bitcoins and use them.
If you do nothing the private key will remain valid and the bitcoins will remain on
the same place. You can just wait to see the value increase or decrease compared to
the Euro or another currency.</p>
<p>The disadvantages of this are that your paper wallet can be stolen, lost, burned or
eaten by you dog and there is no way to recover them. So please make sure to make a
number of copies and put them where bad people cannot find them.</p>
<p>Also note that you have to trust the issuer of the paper wallet, you have no guarantees
he or see does not have a copy of the private key and thus can also spend your bitcoins.</p>
<p>If you want to use your bitcoins to sell them, exchange or spend them or maybe put
them in a safer place you need to create another wallet.</p>
</div>
<div class="section" id="option-3-create-an-mycelium-wallet-on-your-phone">
<h2>Option 3: Create an Mycelium Wallet on your Phone</h2>
<p>Installing a software wallet on your phone is easy, and the Mycelium wallet is very user friendly.
Keep in mind that most phones are easy to hack so do not keep more bitcoins on there than you
would keep in your pocket wallet.</p>
<p><a class="reference external" href="https://coineva.com/create-mycelium-wallet.html">Create a Mycelium Wallet</a>
and then transfer the funds from
<a class="reference external" href="https://coineva.com/paper-wallet-import-mycelium.html">your paper wallet to Mycelium</a>.</p>
</div>
<div class="section" id="option-4-install-electrum-on-your-pc">
<h2>Option 4: Install Electrum on your PC</h2>
<p>If you have received a larger amount of bitcoins or you want to learn and experiment more
<a class="reference external" href="https://coineva.com/create-electrum-wallet.html">install the Electrum Wallet</a></p>
<p>With this wallet you have a lot of control and there is broad range of functionality but it
still safe to use.</p>
<p><a class="reference external" href="https://coineva.com/paper-wallet-import-electrum.html">Import the paper wallet in Electrum</a>
by sweeping it. Which means all the bitcoins are transferred at once.</p>
</div>
<div class="section" id="or-any-combination-of-the-options-above">
<h2>Or any combination of the options above</h2>
<p>Of course you don't have to restrict yourself to one of this options, you can combine them.
For instance you could sell the largest part on Bitonic and then put a smaller amount
on your phone to buy pizza once in a while. Or split it between a user wallet on your phone
a long term investment wallet on your PC.</p>
<p>And as final remark: there are more wallets and places to buy or sell bitcoins out there.
I choose those because I know them and think they are good beginner options. But please
look around yourself and experiment with other bitcoin websites or software.</p>
<p>A good place to learn more about bitcoin is <a class="reference external" href="https://bitcoin.org">https://bitcoin.org</a></p>
</div>
Create a Blockchain.info Wallet2017-06-01T14:36:00+02:002017-06-01T14:36:00+02:00Lennart Jongeneeltag:coineva.com,2017-06-01:/create-blockchain-info-wallet.html<p class="first last">Step-by-step instruction guide to create Blockchain.info wallet and transfer funds from your paper wallet</p>
<p id="create-blockchain-info-wallet">Go to <a class="reference external" href="https://blockchain.info/wallet/">https://blockchain.info/wallet/</a> and create an account with your email and password.</p>
<img alt="Create wallet on Blockchain.info" class="align-center" src="/images/blockchain-info-create.png" style="width: 1200px;" />
<p>Now go to security settings to verify your email. You can disable TOR if you do not use it.</p>
<p>Next backup your passphrase by writing down the 12 words on a piece of paper and store them
in a safe place. You can restore you wallet in case you have forgotten your password,
or if Blockchain.info might disappear. But anyone who
finds this paper can also use your bitcoins.</p>
<img alt="Blockchain.info security settings" class="align-center" src="/images/blockchain-info-security-settings.png" style="width: 1200px;" />
<p>Thats all, your wallet is ready! You can continue to
<a class="reference external" href="https://coineva.com/paper-wallet-import-blockchain-info.html">import a paper wallet</a>
or buy some bitcoins.</p>
Create an Electrum Wallet2017-06-01T14:36:00+02:002017-06-01T14:36:00+02:00Lennart Jongeneeltag:coineva.com,2017-06-01:/create-electrum-wallet.html<p class="first last">Step-by-step instruction guide to create Electrum wallet</p>
<p id="create-electrum-wallet">Go to <a class="reference external" href="http://electrum.org">http://electrum.org</a> and download the easy installation software for your platform,
i.e.: Windows, Android, Linux.</p>
<img alt="Download Electrum wallet" class="align-center" src="/images/electrum-download.png" style="width: 1200px;" />
<p>Start the Electrum software and select auto connect, after this you will be guided to the setup
process the create a new wallet.</p>
<img alt="Create new Electrum Wallet" class="align-center" src="/images/electrum-create-wallet.png" style="width: 1200px;" />
<p>Use the default settings, so choose 'Standard wallet' and then 'Create a new seed'.
Write down the 12 words on a piece of paper and put them in a safe place.
Preferable 2 or more pieces of paper depending on the
amount off bitcoins you are going to store. Do not copy-paste, print-screen or store your 12 word seed
electronically, then you will more vulnerable for an attack.</p>
<img alt="Generate a new seed" class="align-center" src="/images/electrum-create-new-seed.png" style="width: 1200px;" />
<p>To verify you have got the passphrase correctly you will be asked to enter the 12 words again.
This is a bit of a hassle, but is really necessary to 'play your own bank' and secure your bitcoins.
After setting everything up you only need your password to enter and use your wallet.</p>
<img alt="Confirm your private key seed" class="align-center" src="/images/electrum-confirm-seed.png" style="width: 1200px;" />
<p>Now choose a strong password and remember it or store it in a password manager. If you forgot your
password you will able to recreate your wallet with the 12-word passphrase.</p>
<img alt="Enter a strong password" class="align-center" src="/images/electrum-strong-password.png" style="width: 1200px;" />
<p>Your wallet is ready, you can now
<a class="reference external" href="https://coineva.com/paper-wallet-import-electrum.html">transfer funds from your paper wallet into Electrum</a>
or buy some bitcoins.</p>
<div class="section" id="security">
<h2>Security</h2>
<p>Your wallet is protected with a password and is secured against loss with writen backups of
the private key. However if your computer has bad security and anyone gains access and is capable
of installing software they can gain access to your bitcoins. So please update regularly, choose strong passwords,
use a good virus scanner and firewall. This is not the place to elaborate too much about security, there is
<a class="reference external" href="https://antivirus.comodo.com/blog/computer-safety/5-simple-steps-protect-pc/">more security information</a>
out there.</p>
</div>
Create Mycelium Wallet2017-06-01T14:36:00+02:002017-06-01T14:36:00+02:00Lennart Jongeneeltag:coineva.com,2017-06-01:/create-mycelium-wallet.html<p class="first last">Step-by-step instruction guide to create a Mycelium wallet</p>
<div class="section" id="installation-and-setup">
<span id="id1"></span><h2>Installation and setup</h2>
<p>Go to Google Play and install the Mycelium bitcoin wallet.</p>
<a class="reference external image-reference" href="https://play.google.com/store/apps/details?id=com.mycelium.wallet"><img alt="Download and install Mycelium app" class="align-center" src="/images/mycelium-download.png" style="width: 400px;" /></a>
<p>Follow the instructions and create a HD Wallet, be sure to write down the private key and store it in
a safe place. This key can be used to restore your bitcoins in case your phone is broken or lost.</p>
<p>You have created a bitcoin wallet with a HD account, go to the second tab to open your account.</p>
<img alt="Your Mycelium HD Wallet account" class="align-center" src="/images/mycelium-your-account.png" style="width: 400px;" />
<p>Your wallet is ready to use, you can now
<a class="reference external" href="https://coineva.com/paper-wallet-import-mycelium.html">import a paper wallet into Mycelium</a>
or buy some bitcoins.</p>
</div>
Import a paper wallet into Blockchain.info2017-06-01T14:36:00+02:002020-06-11T09:42:00+02:00Lennart Jongeneeltag:coineva.com,2017-06-01:/paper-wallet-import-blockchain-info.html<p class="first last">Instruction on how to transfer funds from your paper wallet to a Blockchain.info Wallet</p>
<p id="paper-wallet-import-blockchain-info">You have <a class="reference external" href="https://coineva.com/create-blockchain-info-wallet.html">created a Blockchain.info wallet</a>
so log in and continue to transfer the funds from your paper wallet.</p>
<p>To import your paper wallet go to the settings menu and select addresses. Then click on
import address and enter your private key. The private key will be validated and the funds
from your paper wallet will be transferred to the Blockchain.info wallet. If you want to
send coins from your Blockchain wallet right away, use priority fee, otherwise you might have
to wait a couple of hours.</p>
<img alt="Transfer bitcoins from your paper wallet to the Blockchain.info wallet" class="align-center" src="/images/blockchain-info-import-private-key.png" style="width: 1200px;" />
<p>Please note: Normally never enter your private key on any website! However blockchain.info is
well-known and established, and their website is set up in such a way that your private keys are
not sent to their servers. However, for larger amount of bitcoins and / or long term storage I
would advise to use a local hardware or software wallet.</p>
<img alt="Received paper wallet's bitcoins into Blockchain.info wallet" class="align-center" src="/images/blockchain-info-received-from-paper-wallet.png" style="width: 1200px;" />
<p>Congratulations, you have now transferred the bitcoins to your Blockchain.info wallet.</p>
<p>You can leave your bitcoins there and use them once in a while or you could
<a class="reference external" href="https://coineva.com/sell-bitcoins-on-bitonic.html">sell your bitcoins on Bitonic</a></p>
Import a paper wallet into Electrum2017-06-01T14:36:00+02:002017-06-01T14:36:00+02:00Lennart Jongeneeltag:coineva.com,2017-06-01:/paper-wallet-import-electrum.html<p class="first last">How to import (or sweep) a paper wallet into Electrum</p>
<p id="paper-wallet-import-electrum">You have
<a class="reference external" href="https://coineva.com/create-electrum-wallet.html">installed a Electrum wallet</a>.
Open your wallet and follow the instruction
to transfer the funds from your paper wallet.
Go to the Wallets menu and select 'Private Keys' and the 'Sweep'</p>
<img alt="Wallet menu - Private key - Sweep" class="align-center" src="/images/electrum-private-key-sweep.png" style="width: 1200px;" />
<p>Now enter the private key. Yes you have to type it over from your paper wallet.
Another option is to scan the QR code with your webcam or phone and send it to your PC,
but this is not very safe.</p>
<img alt="Wallet menu - Private key - Sweep" class="align-center" src="/images/electrum-sweep-private-keys.png" style="width: 1200px;" />
<p>If you entered the private key correctly, you will be able to sweep it, or in other words:
transfer the bitcoins from your paper wallet to Electrum.</p>
<p>Click on Broadcast to push the transaction to the network and start the transfer.</p>
<img alt="Broadcast Sweep Transaction" class="align-center" src="/images/electrum-sweep-transaction-send.png" style="width: 1200px;" />
<p>You should see an unconfirmed transaction in your wallet. The only thing you have to do
know is wait, it can take from a couple of minutes to hours -depending on the fee- before
you transaction is confirmed. You do not have to stay online for the transfer,
you can safely exit your wallet.</p>
<img alt="Sweep transaction unconfirmed" class="align-center" src="/images/electrum-sweep-transaction-send.png" style="width: 1200px;" />
<p>The bitcoin blockchain where all bitcoin transactions are stored is public, so can go
to a block explorer website such as <a class="reference external" href="https://blockchain.info">https://blockchain.info</a> and search for your
transaction.</p>
<img alt="Sweep transaction unconfirmed" class="align-center" src="/images/electrum-view-on-blockchain.png" style="width: 1200px;" />
<p>Now while have your bitcoins on your PC you can
<a class="reference external" href="https://coineva.com/sell-bitcoins-on-bitonic.html">sell some of them on Bitonic</a>
, <a class="reference external" href="http://bitcoinspot.nl/waar-kan-je-in-nederland-met-bitcoins-betalen/zoo-frontpage.html">go shopping</a>
or
<a class="reference external" href="https://coineva.com/create-mycelium-wallet.html">install a Mycelium Wallet</a>
to be able to scan QR-codes for easier payments.</p>
Import a paper wallet into Mycelium2017-06-01T14:36:00+02:002018-06-28T17:12:00+02:00Lennart Jongeneeltag:coineva.com,2017-06-01:/paper-wallet-import-mycelium.html<p class="first last">How to import a paper wallet into Mycelium</p>
<p id="paper-wallet-import-mycelium">After you have successfully
<a class="reference external" href="https://coineva.com/create-mycelium-wallet.html">setup a Mycelium wallet</a>
on your phone you can
continue to import your paper wallet. Select 'Cold storage' (= Paper wallets)
from the main menu and then select 'QR code'
to scan the Private key from your paper wallet.</p>
<img alt="Scan private key with Mycelium from 'cold storage'" class="align-center" src="/images/mycelium-your-account.png" style="width: 400px;" />
<p>Now you are ready to create the transaction. Be sure to select an address from your own wallet.
You should see a warning: You are sending a payment to your own address.</p>
<img alt="Scan private key with Mycelium from 'cold storage'" class="align-center" src="/images/mycelium-create-transaction.png" style="width: 400px;" />
<p>It is advised to take all the bitcoins of the paper wallet in one transaction. To do
this click on the keyboard and select 'max'. In case you are not in a hurry, you can
select 'low-prio' from the miner fee selection.</p>
<img alt="Sweep complete cold storage / paper wallet" class="align-center" src="/images/mycelium-create-transaction-max-amount.png" style="width: 400px;" />
<p>Your transaction is now being processed and shows up in your wallet as pending.
It might take a couple of hours or more if you have selected low priority fee,
but you can already use your bitcoins.</p>
<img alt="Waiting to confirm..." class="align-center" src="/images/mycelium-transaction-done.png" style="width: 400px;" />
Bitcoinlib2017-06-01T14:36:00+02:002018-12-27T21:28:00+01:00Lennart Jongeneeltag:coineva.com,2017-06-01:/python-bitcoin-library.html<p class="first last">Python Bitcoin library to create and manage single and multisig wallets, keys, transactions and blockchain service providers for various crypto currencies.</p>
<div class="section" id="python-bitcoin-library">
<h2>Python Bitcoin Library</h2>
<p>Bitcoin and other crypto currency Library for Python.</p>
<p>Includes a fully functional wallet, with multi signature, multi currency and multiple accounts.
You this library at a high level and create and manage wallets for the command line or at a low level
and create your own custom made transactions, keys or wallets.</p>
<p>The BitcoinLib connects to various service providers automatically to update wallets, transactions and
blockchain information. It does currently not parse the blockchain itself.</p>
<a class="reference external image-reference" href="https://travis-ci.org/1200wd/bitcoinlib"><img alt="travis-ci" src="https://travis-ci.org/1200wd/bitcoinlib.svg?branch=master" /></a>
<a class="reference external image-reference" href="https://pypi.python.org/pypi/bitcoinlib/"><object data="https://img.shields.io/pypi/v/bitcoinlib.svg" type="image/svg+xml">PyPi</object></a>
<a class="reference external image-reference" href="http://bitcoinlib.readthedocs.io/en/latest/?badge=latest"><img alt="Documentation" src="https://readthedocs.org/projects/bitcoinlib/badge/?version=latest" /></a>
</div>
<div class="section" id="documentation">
<h2>Documentation</h2>
<p>Read the full documentation at: <a class="reference external" href="http://bitcoinlib.readthedocs.io/">http://bitcoinlib.readthedocs.io/</a></p>
</div>
<div class="section" id="disclaimer">
<h2>Disclaimer</h2>
<p>This library is still in development, please use at your own risk and test sufficiently before using it in a
production environment. Only bitcoin and litecoin transactions are available at the moment, support for Dash is
just for a read only wallet, not for creating or sending transactions</p>
</div>
<div class="section" id="features">
<h2>Features</h2>
<div class="section" id="wallet">
<h3>Wallet</h3>
<p>The Bitcoin library contains a wallet implementation using SQLAlchemy and SQLite to import, create and manage
keys in a Hierarchical Deterministic way.</p>
<p>Example: Create wallet and generate new address (key) to receive bitcoins</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">bitcoinlib.wallets</span> <span class="kn">import</span> <span class="n">HDWallet</span>
<span class="o">>>></span> <span class="n">w</span> <span class="o">=</span> <span class="n">HDWallet</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="s1">'Wallet1'</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">key1</span> <span class="o">=</span> <span class="n">w</span><span class="o">.</span><span class="n">get_key</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">key1</span><span class="o">.</span><span class="n">address</span>
<span class="s1">'1Fo7STj6LdRhUuD1AiEsHpH65pXzraGJ9j'</span>
</pre></div>
<p>Now send a small transaction to your wallet and use the scan() method to update transactions and UTXO's</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">scan</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">w</span><span class="o">.</span><span class="n">info</span><span class="p">()</span> <span class="c1"># Shows wallet information, keys, transactions and UTXO's</span>
</pre></div>
<p>When your wallet received a payment and has unspent transaction outputs, you can send bitcoins easily.
If successful a transaction ID is returned</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">t</span> <span class="o">=</span> <span class="n">w</span><span class="o">.</span><span class="n">send_to</span><span class="p">(</span><span class="s1">'12ooWd8Xag7hsgP9PBPnmyGe36VeUrpMSH'</span><span class="p">,</span> <span class="mi">100000</span><span class="p">)</span>
<span class="s1">'b7feea5e7c79d4f6f343b5ca28fa2a1fcacfe9a2b7f44f3d2fd8d6c2d82c4078'</span>
<span class="o">>>></span> <span class="n">t</span><span class="o">.</span><span class="n">info</span> <span class="c1"># Shows transaction information and send results</span>
</pre></div>
</div>
<div class="section" id="wallet-from-passphrase-with-accounts-and-multiple-currencies">
<h3>Wallet from passphrase with accounts and multiple currencies</h3>
<p>The following code creates a wallet with two bitcoin and one litecoin account from a Mnemonic passphrase.
The complete wallet can be recovered from the passphrase which is the masterkey.</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">bitcoinlib.wallets</span> <span class="kn">import</span> <span class="n">HDWallet</span><span class="p">,</span> <span class="n">wallet_delete</span>
<span class="kn">from</span> <span class="nn">bitcoinlib.mnemonic</span> <span class="kn">import</span> <span class="n">Mnemonic</span>
<span class="n">passphrase</span> <span class="o">=</span> <span class="n">Mnemonic</span><span class="p">()</span><span class="o">.</span><span class="n">generate</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">passphrase</span><span class="p">)</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">HDWallet</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="s2">"Wallet2"</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">passphrase</span><span class="p">,</span> <span class="n">network</span><span class="o">=</span><span class="s1">'bitcoin'</span><span class="p">)</span>
<span class="n">account_btc2</span> <span class="o">=</span> <span class="n">w</span><span class="o">.</span><span class="n">new_account</span><span class="p">(</span><span class="s1">'Account BTC 2'</span><span class="p">)</span>
<span class="n">account_ltc1</span> <span class="o">=</span> <span class="n">w</span><span class="o">.</span><span class="n">new_account</span><span class="p">(</span><span class="s1">'Account LTC'</span><span class="p">,</span> <span class="n">network</span><span class="o">=</span><span class="s1">'litecoin'</span><span class="p">)</span>
<span class="n">w</span><span class="o">.</span><span class="n">get_key</span><span class="p">()</span>
<span class="n">w</span><span class="o">.</span><span class="n">get_key</span><span class="p">(</span><span class="n">account_btc2</span><span class="o">.</span><span class="n">account_id</span><span class="p">)</span>
<span class="n">w</span><span class="o">.</span><span class="n">get_key</span><span class="p">(</span><span class="n">account_ltc1</span><span class="o">.</span><span class="n">account_id</span><span class="p">)</span>
<span class="n">w</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
</pre></div>
</div>
<div class="section" id="multi-signature-wallets">
<h3>Multi Signature Wallets</h3>
<p>Create a Multisig wallet with 2 cosigner which both need to sign a transaction.</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">bitcoinlib.wallets</span> <span class="kn">import</span> <span class="n">HDWallet</span>
<span class="kn">from</span> <span class="nn">bitcoinlib.keys</span> <span class="kn">import</span> <span class="n">HDKey</span>
<span class="n">NETWORK</span> <span class="o">=</span> <span class="s1">'testnet'</span>
<span class="n">pk1</span> <span class="o">=</span> <span class="n">HDKey</span><span class="p">(</span><span class="s1">'tprv8ZgxMBicQKsPd1Q44tfDiZC98iYouKRC2CzjT3HGt1yYw2zuX2awTotzGAZQEAU9bi2M5MCj8iedP9MREPjUgpDEBwBgGi2C8eK'</span>
<span class="s1">'5zNYeiX8'</span><span class="p">,</span> <span class="n">network</span><span class="o">=</span><span class="n">NETWORK</span><span class="p">)</span>
<span class="n">pk2</span> <span class="o">=</span> <span class="n">HDKey</span><span class="p">(</span><span class="s1">'tprv8ZgxMBicQKsPeUbMS6kswJc11zgVEXUnUZuGo3bF6bBrAg1ieFfUdPc9UHqbD5HcXizThrcKike1c4z6xHrz6MWGwy8L6YKVbgJ'</span>
<span class="s1">'MeQHdWDp'</span><span class="p">,</span> <span class="n">network</span><span class="o">=</span><span class="n">NETWORK</span><span class="p">)</span>
<span class="n">w1</span> <span class="o">=</span> <span class="n">HDWallet</span><span class="o">.</span><span class="n">create_multisig</span><span class="p">(</span><span class="s1">'multisig_2of2_cosigner1'</span><span class="p">,</span> <span class="n">sigs_required</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="n">key_list</span><span class="o">=</span><span class="p">[</span><span class="n">pk1</span><span class="p">,</span> <span class="n">pk2</span><span class="o">.</span><span class="n">account_multisig_key</span><span class="p">()</span><span class="o">.</span><span class="n">wif_public</span><span class="p">()],</span> <span class="n">network</span><span class="o">=</span><span class="n">NETWORK</span><span class="p">)</span>
<span class="n">w2</span> <span class="o">=</span> <span class="n">HDWallet</span><span class="o">.</span><span class="n">create_multisig</span><span class="p">(</span><span class="s1">'multisig_2of2_cosigner2'</span><span class="p">,</span> <span class="n">sigs_required</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="n">key_list</span><span class="o">=</span><span class="p">[</span><span class="n">pk1</span><span class="o">.</span><span class="n">account_multisig_key</span><span class="p">()</span><span class="o">.</span><span class="n">wif_public</span><span class="p">(),</span> <span class="n">pk2</span><span class="p">],</span> <span class="n">network</span><span class="o">=</span><span class="n">NETWORK</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Deposit testnet bitcoin to this address to create transaction: "</span><span class="p">,</span> <span class="n">w1</span><span class="o">.</span><span class="n">get_key</span><span class="p">()</span><span class="o">.</span><span class="n">address</span><span class="p">)</span>
</pre></div>
<p>Create a transaction in the first wallet</p>
<div class="highlight"><pre><span></span><span class="n">w1</span><span class="o">.</span><span class="n">utxos_update</span><span class="p">()</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">w1</span><span class="o">.</span><span class="n">sweep</span><span class="p">(</span><span class="s1">'mwCwTceJvYV27KXBc3NJZys6CjsgsoeHmf'</span><span class="p">,</span> <span class="n">min_confirms</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
</pre></div>
<p>And then import the transaction in the second wallet, sign it and push it to the network</p>
<div class="highlight"><pre><span></span><span class="n">w2</span><span class="o">.</span><span class="n">get_key</span><span class="p">()</span>
<span class="n">t2</span> <span class="o">=</span> <span class="n">w2</span><span class="o">.</span><span class="n">transaction_import</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
<span class="n">t2</span><span class="o">.</span><span class="n">sign</span><span class="p">()</span>
<span class="n">t2</span><span class="o">.</span><span class="n">send</span><span class="p">()</span>
<span class="n">t2</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
</pre></div>
</div>
<div class="section" id="mnemonic-key-generation">
<h3>Mnemonic key generation</h3>
<p>Allows you to use easy to remember passphrases consisting of a number of words to store private keys (BIP0039).
You can password protect this passphrase (BIP0038), and use the HD Wallet structure to generate a almost infinite
number of new private keys and bitcoin addresses (BIP0043 and BIP0044).</p>
<p>Example: Generate a list of words passphrase and derive a private key seed</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">bitcoinlib.mnemonic</span> <span class="kn">import</span> <span class="n">Mnemonic</span>
<span class="o">>>></span> <span class="n">words</span> <span class="o">=</span> <span class="n">Mnemonic</span><span class="p">()</span><span class="o">.</span><span class="n">generate</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">words</span>
<span class="n">protect</span> <span class="n">dumb</span> <span class="n">smart</span> <span class="n">toddler</span> <span class="n">journey</span> <span class="n">spawn</span> <span class="n">same</span> <span class="n">dry</span> <span class="n">season</span> <span class="n">ecology</span> <span class="n">scissors</span> <span class="n">more</span>
<span class="o">>>></span> <span class="n">Mnemonic</span><span class="p">()</span><span class="o">.</span><span class="n">to_seed</span><span class="p">(</span><span class="n">words</span><span class="p">)</span>
<span class="n">xprv6CY4yxy6enC53V7hEut2FFW74tv6L3dB53jSoSXpab2X8UMowLJc521UUFuar98eacS9MK5rwWjrEmp6SUone5swQWcqf4vhfhZuerj5E1Y</span>
</pre></div>
</div>
<div class="section" id="service-providers">
<h3>Service providers</h3>
<p>Communicates with pools of bitcoin service providers to retreive transaction, address, blockchain information.
Can be used to push a transaction to the network, determine optimal service fee for a transaction or to update your
wallet's balance.</p>
<p>When working with wallets connections to service providers are automatically managed so you don't have to worry
about them. You can however easily use the Service object directly.</p>
<p>Example: Get estimated transaction fee in sathosis per Kb for confirmation within 5 blocks</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">bitcoinlib.services.services</span> <span class="kn">import</span> <span class="n">Service</span>
<span class="o">>>></span> <span class="n">Service</span><span class="p">()</span><span class="o">.</span><span class="n">estimatefee</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="mi">138964</span>
</pre></div>
</div>
</div>
<div class="section" id="more-examples">
<h2>More examples</h2>
<p>For more examples see <a class="reference external" href="https://github.com/1200wd/bitcoinlib/tree/master/examples">https://github.com/1200wd/bitcoinlib/tree/master/examples</a></p>
</div>
<div class="section" id="implements-the-following-bitcoin-improvement-proposals">
<h2>Implements the following Bitcoin Improvement Proposals</h2>
<ul class="simple">
<li>Hierarchical Deterministic Wallets (BIP0032)</li>
<li>Passphrase-protected private key (BIP0038)</li>
<li>Mnemonic code for generating deterministic keys (BIP0039)</li>
<li>Purpose Field for Deterministic Wallets (BIP0043)</li>
<li>Multi-Account Hierarchy for Deterministic Wallets (BIP0044)</li>
<li>Structure for Deterministic P2SH Multisignature Wallets (BIP0045)</li>
</ul>
</div>
<div class="section" id="implementations">
<h2>Implementations</h2>
<div class="section" id="currently-this-python-bitcoin-library-is-used-in-the-following-implementation">
<h3>Currently this python bitcoin library is used in the following implementation</h3>
<ul class="simple">
<li>Bulk Paper Wallets - <a class="reference external" href="https://github.com/1200wd/bulkpaperwallets">https://github.com/1200wd/bulkpaperwallets</a></li>
</ul>
</div>
</div>
<div class="section" id="references">
<h2>References</h2>
<ul class="simple">
<li><a class="reference external" href="https://pypi.python.org/pypi/bitcoinlib/">https://pypi.python.org/pypi/bitcoinlib/</a></li>
<li><a class="reference external" href="https://github.com/1200wd/bitcoinlib">https://github.com/1200wd/bitcoinlib</a></li>
</ul>
</div>
How to sell bitcoins on Bitonic2017-06-01T14:36:00+02:002017-06-01T14:36:00+02:00Lennart Jongeneeltag:coineva.com,2017-06-01:/sell-bitcoins-on-bitonic.html<p class="first last">How to sell bitcoins on Bitonic</p>
<p id="sell-bitcoins-on-bitonic">Login to your <a class="reference external" href="https://coineva.com/create-blockchain-info-wallet.html">Blockchain.info Wallet</a>
or open another wallet you own and go to <a class="reference external" href="https://bitonic.nl">https://bitonic.nl</a></p>
<p>Fill in the amount of bitcoins you would like to sell and the return bitcoin address.
The bitcoin address can be same address as you send the bitcoins from, or you can request
a new address from your wallet if you are concerned about privacy.</p>
<a class="reference external image-reference" href="https://bitonic.nl"><img alt="How to sell bitcoins on Bitonic.nl?" class="align-center" src="/images/bitonic-sell-bitcoins.png" style="width: 1200px;" /></a>
<p>If you would like to sell the full amount please do not forget to deduct the transaction fees.
So transfer the full amount of your wallet minus the expected transaction fees. You can
find the expected transaction fee when you click on 'Send' in the Blockchain.info wallet.</p>
<img alt="Transfer bitcoins from your paper wallet to the Blockchain.info wallet" class="align-center" src="/images/blockchain-info-import-private-key.png" style="width: 1200px;" />
<p>Then fill in your name and bank account number, and also advisedly also your email address.
Now you will receive a bitcoin address and you can transfer the bitcoins from your wallet
to Bitonic. You do not need to include a priority fee, as a standard fee is enough to get
your transaction through in a couple of hours normally.</p>
<img alt="Bitcoins sold on Bitonic.nl" class="align-center" src="/images/bitonic-sold-bitcoins.png" style="width: 1200px;" />
<p>Now you have sold your bitcoins and they will be transferred to your bank account the next
business day.</p>