<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <updated>2023-06-09T12:15:44Z</updated>
  <generator>https://nostr.ae</generator>

  <title>Nostr notes by Tomas [ARCHIVE]</title>
  <author>
    <name>Tomas [ARCHIVE]</name>
  </author>
  <link rel="self" type="application/atom+xml" href="https://nostr.ae/npub1rsp4w56r24w3zv4xy8zfgesep45qmf9rq6aghxfw3wr7yemqnnwsf9evk4.rss" />
  <link href="https://nostr.ae/npub1rsp4w56r24w3zv4xy8zfgesep45qmf9rq6aghxfw3wr7yemqnnwsf9evk4" />
  <id>https://nostr.ae/npub1rsp4w56r24w3zv4xy8zfgesep45qmf9rq6aghxfw3wr7yemqnnwsf9evk4</id>
  <icon></icon>
  <logo></logo>




  <entry>
    <id>https://nostr.ae/nevent1qqsd0202h9httfpj4hcner3fazq9antc69l77ydxpwu4ckycyggq4qczyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd69za85m</id>
    
      <title type="html">📅 Original date posted:2017-04-08 📝 Original message:&amp;gt; ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsd0202h9httfpj4hcner3fazq9antc69l77ydxpwu4ckycyggq4qczyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd69za85m" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqswq849vjrq3gmpm0m3rad00p03pcz34vvhwxafkzvntlhc7542r0c0slgpf&#39;&gt;nevent1q…lgpf&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-08&lt;br/&gt;📝 Original message:&amp;gt; Please no conspiracy theory like stepping on someone’s toes. I believe&lt;br/&gt;&amp;gt; it’s always nice to challenge the established model. However, as I’m&lt;br/&gt;&amp;gt; trying to make some hardfork design, I intend to have a stricter UTXO&lt;br/&gt;&amp;gt; growth limit. As you said &amp;#34;protocol addressing the UTXO growth, might not&lt;br/&gt;&amp;gt; be worth considering protocol improvements*, it sounds like UTXO growth&lt;br/&gt;&amp;gt; limit wouldn’t be very helpful for your model, which I doubt. &lt;br/&gt;&lt;br/&gt;Thank you. I realize that  this particular phrase implies that in my&lt;br/&gt;design, outputs are less costly then inputs, *in total resource costs*,&lt;br/&gt;which I can not defend without completely ignoring base load script&lt;br/&gt;verification. I rephrased it.&lt;br/&gt;&lt;br/&gt;Tomas
    </content>
    <updated>2023-06-07T17:59:42Z</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs0g6ty5avee90kpfeekfh7ef7d4hjhu3mt6dl0823tcfls9xa3g9qzyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6par7za</id>
    
      <title type="html">📅 Original date posted:2017-04-08 📝 Original message:&amp;gt; I ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs0g6ty5avee90kpfeekfh7ef7d4hjhu3mt6dl0823tcfls9xa3g9qzyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6par7za" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8mdpg8u80c6ux33dxq3rq4cwj8ejdjs7470hkcwc2gkhstgjjwjg5jmvnq&#39;&gt;nevent1q…mvnq&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-08&lt;br/&gt;📝 Original message:&amp;gt; I don’t fully understand your storage engine. So the following deduction&lt;br/&gt;&amp;gt; is just based on common sense.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; a) It is possible to make unlimited number of 1-in-100-out txs&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; b) The maximum number of 100-in-1-out txs is limited by the number of&lt;br/&gt;&amp;gt; previous 1-in-100-out txs&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; c) Since bitcrust performs not good with 100-in-1-out txs, for anti-DoS&lt;br/&gt;&amp;gt; purpose you should limit the number of previous 1-in-100-out txs. &lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; d) Limit 1-in-100-out txs == Limit UTXO growth&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; I’m not surprised that you find an model more efficient than Core. But I&lt;br/&gt;&amp;gt; don’t believe one could find a model that doesn’t become more efficient&lt;br/&gt;&amp;gt; with UTXO growth limitation.&lt;br/&gt;&lt;br/&gt;My efficiency claims are *only* with regards to order validation. If we&lt;br/&gt;assume all transactions are already pre-synced and verified, bitcrust&amp;#39;s&lt;br/&gt;order validation is very fast, and (only slightly) negatively effected&lt;br/&gt;by input-counts.&lt;br/&gt;&lt;br/&gt;Most total time is spend during base load script validation, and UTXO&lt;br/&gt;growth is the definitely the limiting factor there, as the model here&lt;br/&gt;isn&amp;#39;t all that different from Core&amp;#39;s.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&amp;gt; Maybe you could try an experiment with regtest? Make a lot 1-in-100-out&lt;br/&gt;&amp;gt; txs with many blocks, then spend all the UTXOs with 100-in-1-out txs.&lt;br/&gt;&amp;gt; Compare the performance of bitcrust with core. Then repeat with&lt;br/&gt;&amp;gt; 1-in-1-out chained txs (so the UTXO set is always almost empty)&lt;br/&gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;Again, this really depends on whether we focus on full block validation,&lt;br/&gt;in which case the 100-1, 1-100 distinction will be the similar to Core,&lt;br/&gt;or only regard order validation, in which case Bitcrust will have this&lt;br/&gt;odd reversal. &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&amp;gt; One more question: what is the absolute minimum disk and memory usage in&lt;br/&gt;&amp;gt; bitcrust, compared with the pruning mode in Core?&lt;br/&gt;&lt;br/&gt;As bitcrust doesn&amp;#39;t support this yet, I cannot give accurate numbers,&lt;br/&gt;but I&amp;#39;ve provided some numbers estimates earlier in the thread.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Rereading my post and these comments, I may have stepped on some toes&lt;br/&gt;with regards to SegWit&amp;#39;s model. I like SegWit (though I may have a&lt;br/&gt;slight preference for BIP140), and I understand the reasons for the&lt;br/&gt;&amp;#34;discount&amp;#34;, so this was not my intention. I just think that the reversal&lt;br/&gt;of costs during peak load order validation is a rather interesting&lt;br/&gt;feature of using spend-tree  based validation. &lt;br/&gt;&lt;br/&gt;Tomas
    </content>
    <updated>2023-06-07T17:59:41Z</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsflptzpmmppyapamf9e7v5fs2nll383e83ryv9n5l5mmfgvwxn8rszyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd67txew4</id>
    
      <title type="html">📅 Original date posted:2017-04-08 📝 Original message:On ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsflptzpmmppyapamf9e7v5fs2nll383e83ryv9n5l5mmfgvwxn8rszyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd67txew4" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsz40vvuj6mpy7dvn7lx29lxcupfzkqdktcxnarz5el6uhq8anm6sgjhhjv5&#39;&gt;nevent1q…hjv5&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-08&lt;br/&gt;📝 Original message:On Sat, Apr 8, 2017, at 02:44, Gregory Maxwell wrote:&lt;br/&gt;&amp;gt; As you note that the output costs still bound the resource&lt;br/&gt;&amp;gt; requirements. &lt;br/&gt;&lt;br/&gt;Resource cost is not just a measure of storage requirement; data that&lt;br/&gt;needs to be accessed during peak load induce more cost then data only&lt;br/&gt;used during base load or only rarely used.&lt;br/&gt;&lt;br/&gt;&amp;gt; Latency related costs in Bitcoin Core also do not depend on the number&lt;br/&gt;&amp;gt; of outputs in transactions in a block. When a transaction is handled&lt;br/&gt;&amp;gt; it goes into an in-memory buffer and only gets flushed later if isn&amp;#39;t&lt;br/&gt;&amp;gt; spent before the buffer fills.  A block will take more time to&lt;br/&gt;&amp;gt; validate with more inputs, same as you observer, but the aggregate&lt;br/&gt;&amp;gt; resource usage for users depends significantly on outputs (so, in fact&lt;br/&gt;&amp;gt; there is even further misaligned incentives than just the fact that&lt;br/&gt;&amp;gt; small outputs have a outsized long term cost).&lt;br/&gt;&lt;br/&gt;In Core, when a block comes the inputs are checked against the UTXO set&lt;br/&gt;(which grows with outputs)  even if pre-synced, to verify order. Am I&lt;br/&gt;wrong there? This is not in the case in bitcrust; it is instead checked&lt;br/&gt;against the spend-tree (which grows with inputs).&lt;br/&gt;&lt;br/&gt;How &amp;#34;significant&amp;#34; this is, I neither know nor claim,  but it is an&lt;br/&gt;interesting difference. &lt;br/&gt;&lt;br/&gt;&amp;gt; Then I think you may want to retract the claim that &amp;#34;As this solution,&lt;br/&gt;&amp;gt; reversing the costs of outputs and inputs, [...] updates to the&lt;br/&gt;&amp;gt; protocol addressing the UTXO growth, might not be worth considering&lt;br/&gt;&amp;gt; *protocol improvements* &amp;#34;&lt;br/&gt;&lt;br/&gt;I think you are being a bit harsh here . I am also clearly explaining&lt;br/&gt;the difference only applies to peak load, and just making a suggestion.&lt;br/&gt;I simply want to stress the importance of protocol / implementation&lt;br/&gt;separation as even though you are correct UTXO data is always a resource&lt;br/&gt;cost for script validation (as I also state), the ratio of different&lt;br/&gt;costs are  not necessarily *identical* across implementation. &lt;br/&gt;&lt;br/&gt;Note that the converse also holds: In bitcrust, if the last few blocks&lt;br/&gt;contain many inputs, the peak load verification for this block is&lt;br/&gt;slower. This is not the case in Core.&lt;br/&gt;&lt;br/&gt;Tomas
    </content>
    <updated>2023-06-07T17:59:41Z</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs0xd9ljg8hlm4re8j2gfl02sywm9vnf9x6etv9q9tf0lcd8y5js4gzyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6yeng5k</id>
    
      <title type="html">📅 Original date posted:2017-04-07 📝 Original ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs0xd9ljg8hlm4re8j2gfl02sywm9vnf9x6etv9q9tf0lcd8y5js4gzyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6yeng5k" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsyvhezvxmsu2n2au34f7sxsz6clawvetmylsygk3zj6j8rqm2mhzcfe76jg&#39;&gt;nevent1q…76jg&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-07&lt;br/&gt;📝 Original message:Answering both,&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Fri, Apr 7, 2017 at 11:18 AM, Gregory Maxwell via bitcoin-dev &amp;lt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; I&amp;#39;m still lost on this-- AFAICT your proposals long term resource&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; requirements are directly proportional to the amount of&lt;br/&gt;&amp;gt;&amp;gt; unspent output&lt;br/&gt;&amp;gt;&amp;gt; data, which grows over time at some fraction of the total transaction&lt;br/&gt;&amp;gt;&amp;gt; volume (plus the rate of spending which is more or less a constant).&lt;br/&gt;&amp;gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; Can you help out my understanding here?&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Fri, Apr 7, 2017, at 20:39, Bram Cohen wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Expanding on this question a bit, it&amp;#39;s optimized for parallel access,&lt;br/&gt;&amp;gt; but hard drive access isn&amp;#39;t parallel and memory accesses are very&lt;br/&gt;&amp;gt; fast, so shouldn&amp;#39;t the target of optimization be about cramming as&lt;br/&gt;&amp;gt; much as possible in memory and minimizing disk accesses?&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;The long term *minimal disk storage* requirement, can obviously not be&lt;br/&gt;less then all the unspent outputs. Minimal disk requirements is not&lt;br/&gt;something bitcrust attempts to address.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; The storage that is accessed during peak load (block validation with&lt;br/&gt; pre-synced transactions), is minimized as this only needs the&lt;br/&gt; transaction index (to lookup ptrs from hashes), the tip of the spend-&lt;br/&gt; tree and the tip of the spend-index (together to check double&lt;br/&gt; spents/spending non-existing outputs). These not only easily fit in&lt;br/&gt; RAM, but are accessed in a cache efficient way. *These* only grow with&lt;br/&gt; inputs as the spend tree contains one record per input referencing the&lt;br/&gt; output being spent.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Script validation is also not something bitcrust *directly* addresses;&lt;br/&gt;it uses libbitcoinconsensus for the actual validation and lookups to&lt;br/&gt;outputs are mostly similar. They are kept fast by trusting the OS on MRU&lt;br/&gt;caching of transaction-outputs; I don&amp;#39;t think that for this part the&lt;br/&gt;UTXO index has much drawbacks,. Bitcrust seems to have a small advantage&lt;br/&gt;due to the awesomeness of Rayon&amp;#39;s parallelization and the lock-free data&lt;br/&gt;structures, but a disadvantage in that keeping all spent outputs&lt;br/&gt;decreases spatial locality of reference. Script validation is not the&lt;br/&gt;innovative part.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Tomas&lt;br/&gt;-------------- next part --------------&lt;br/&gt;An HTML attachment was scrubbed...&lt;br/&gt;URL: &amp;lt;&lt;a href=&#34;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20170407/f7db76c7/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20170407/f7db76c7/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T17:59:40Z</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsvtm00wuh3ucw8el3uthjwtcvhhd7eayl0tzafpwjfjlguel0fspgzyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6g04wp7</id>
    
      <title type="html">📅 Original date posted:2017-04-07 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsvtm00wuh3ucw8el3uthjwtcvhhd7eayl0tzafpwjfjlguel0fspgzyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6g04wp7" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsga4vn5c63fg368tx2ya590lmlyyjx239el4zn3dmjh2tafxh7x5cndw4gr&#39;&gt;nevent1q…w4gr&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-07&lt;br/&gt;📝 Original message:Hi Eric,&lt;br/&gt;&lt;br/&gt;On Fri, Apr 7, 2017, at 21:55, Eric Voskuil via bitcoin-dev wrote:&lt;br/&gt;&amp;gt; Optimization for lower memory platforms then becomes a process of&lt;br/&gt;&amp;gt; reducing the need for paging. This is the purpose of a cache. The seam&lt;br/&gt;&amp;gt; between disk and memory can be filled quite nicely by a small amount&lt;br/&gt;&amp;gt; of cache. On high RAM systems any cache is actually a de-optimization&lt;br/&gt;&amp;gt; but on low RAM systems it can prevent excessive paging. This is&lt;br/&gt;&amp;gt; directly analogous to a CPU cache. &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;I am not entirely sure I agree with that, or understand it correctly.&lt;br/&gt;&lt;br/&gt;If -for example - the data of some application is a set  of records&lt;br/&gt;which can be sorted from least frequently used to most frequently used&lt;br/&gt;then doing just that sort will beat any application-layer cache.&lt;br/&gt;Regardless of size of data and size of RAM, you simply allow the OS to&lt;br/&gt;use disk caching or memory map caching to work its  magic .&lt;br/&gt;&lt;br/&gt;In fact, I would argue that an application-layer cache *only* makes&lt;br/&gt;sense if the data model shows a *hard* distinction between often and not&lt;br/&gt;often used data. If usage-frequency is a continuous line, caching is&lt;br/&gt;best left to the OS by focussing on proper spatial and temporal locality&lt;br/&gt;of reference of your data, because the OS has much more information to&lt;br/&gt;make the right decision.
    </content>
    <updated>2023-06-07T17:59:39Z</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs273dmn4vxxafxc900h926pa5ggzjnywz493zxakz9vyvcmsleh5szyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6dz58vd</id>
    
      <title type="html">📅 Original date posted:2017-04-07 📝 Original message:Thank ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs273dmn4vxxafxc900h926pa5ggzjnywz493zxakz9vyvcmsleh5szyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6dz58vd" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrmcd9kpch90pvclhfqzlf3srgv04dly4fze4m9vjglt0uge6957qa228x5&#39;&gt;nevent1q…28x5&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-07&lt;br/&gt;📝 Original message:Thank you,&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;The benches are running in Google Cloud Engine; currently on 8 vCPU&lt;br/&gt;32gb, but I tend to switch hardware regularly.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Roughly, the results are better for Bitcrust with high end hardware and&lt;br/&gt;the difference for total block validations is mostly diminished at 2&lt;br/&gt;vCPU, 7,5 gb.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Note that the spend-tree optimization primarily aims to improve peak&lt;br/&gt;load order validation; when a block with pre-synced transactions comes&lt;br/&gt;in, but this is tricky to accurately bench with Core using this simple&lt;br/&gt;method of comparison by logs.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;I will upgrade to, and show the results against 0.14 in the next weeks.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Best,&lt;br/&gt;&lt;br/&gt;Tomas&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Fri, Apr 7, 2017, at 16:14, Greg Sanders wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Interesting work.&lt;br/&gt;&lt;br/&gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt; I was wondering if you could tellank  us what specs for the machine&lt;br/&gt;&amp;gt; being used as preliminary benchmark is here:&lt;br/&gt;&amp;gt; &lt;a href=&#34;https://bitcrust.org/results&#34;&gt;https://bitcrust.org/results&lt;/a&gt; ?&lt;br/&gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt; I&amp;#39;d be interested to also see comparisons with 0.14 which has some&lt;br/&gt;&amp;gt; improvements for script validation with more cores.&lt;br/&gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt; On Fri, Apr 7, 2017 at 4:47 AM, Tomas via bitcoin-dev &amp;lt;bitcoin-&lt;br/&gt;&amp;gt; dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt; Thank you Marcos,&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  Though written in Rust, bitcrust-db is definitely usable as&lt;br/&gt;&amp;gt;&amp;gt;  pluggable&lt;br/&gt;&amp;gt;&amp;gt;  module as its interface will be roughly some queries, add_tx and&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  add_block with blobs and flags. (Bitcrust internally uses a&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  deserialize-only model, keeping references to the blobs with the&lt;br/&gt;&amp;gt;&amp;gt;  parsed&lt;br/&gt;&amp;gt;&amp;gt;  data).&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  However, from Core&amp;#39;s side I believe network and storage are&lt;br/&gt;&amp;gt;&amp;gt;  currently&lt;br/&gt;&amp;gt;&amp;gt;  rather tightly coupled, which will make this far from trivial.&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  Regardless, I am also hoping (with funding &amp;amp; a team) to build a&lt;br/&gt;&amp;gt;&amp;gt;  Bitcrust&lt;br/&gt;&amp;gt;&amp;gt;  networking component as well to bring a strong competitor to the&lt;br/&gt;&amp;gt;&amp;gt;  market.&lt;br/&gt;&amp;gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  best,&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  Tomas&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; On Fri, Apr 7, 2017, at 09:55, Marcos mayorga wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; Hi Tomas,&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; I&amp;#39;ve read it and think it is an excellent work, I&amp;#39;d like to see it&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; integrated into bitcoin-core as a &amp;#39;kernel module&amp;#39;.&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; I see there are a lot of proof of concepts out there, IMO&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; every one&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; deserve a room in the bitcoin client as a selectable feature, to&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; make the&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; software more flexible and less dictatorial, an user could easily&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; select&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; which features she wants to run.&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; Best regards,&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; Marcos&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; I have been working on a bitcoin implementation that uses a&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; different&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; approach to indexing for verifying the order of transactions.&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; Instead of&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; using an index of unspent outputs, double spends are verified by&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; using a&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; spend-tree where spends are scanned against spent outputs&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; instead of&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; unspent outputs.&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; This allows for much better concurrency, as not only blocks, but&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; also&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; individual inputs can be verified fully in parallel.&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; I explain the approach at &lt;a href=&#34;https://bitcrust.org&#34;&gt;https://bitcrust.org&lt;/a&gt;, source code is&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; available&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; at &lt;a href=&#34;https://github.com/tomasvdw/bitcrust&#34;&gt;https://github.com/tomasvdw/bitcrust&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; I am sharing this not only to ask for your feedback, but also to&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; call&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; for a clear separation of protocol and implementations: As this&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; solution, reversing the costs of outputs and inputs, seems to&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; have&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; excellent performance characteristics (as shown in the test&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; results),&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; updates to the protocol addressing the UTXO growth, might not be&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; worth&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; considering *protocol improvements* and it might be best to&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; address&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; these concerns as implementation details.&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; Kind regards,&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; Tomas van der Wansem&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; tomas at bitcrust.org&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; Bitcrust&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; _______________________________________________&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; bitcoin-dev mailing list&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt; &lt;a href=&#34;https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev&#34;&gt;https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt; &amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  &amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  _______________________________________________&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt;  bitcoin-dev mailing list&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; &lt;a href=&#34;https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev&#34;&gt;https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;-------------- next part --------------&lt;br/&gt;An HTML attachment was scrubbed...&lt;br/&gt;URL: &amp;lt;&lt;a href=&#34;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20170407/68d9cba6/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20170407/68d9cba6/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T17:59:38Z</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsv0hq35944r7mx7fvsysew48rjl9w3e53u5wsmzjz0huxwvs78qaczyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6jsk5ps</id>
    
      <title type="html">📅 Original date posted:2017-04-11 📝 Original message:On ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsv0hq35944r7mx7fvsysew48rjl9w3e53u5wsmzjz0huxwvs78qaczyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6jsk5ps" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsdl9qk78h5ephldkh4ut2jnkf20gp2d676m44jc7a02zfms4mytcgr79ypp&#39;&gt;nevent1q…9ypp&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-11&lt;br/&gt;📝 Original message:On Tue, Apr 11, 2017, at 11:41, Eric Voskuil wrote:&lt;br/&gt;&amp;gt; It&amp;#39;s not the headers/tx-hashes of the blocks that I&amp;#39;m referring to, it&lt;br/&gt;&amp;gt; is the confirmation and spend information relative to all txs and all&lt;br/&gt;&amp;gt; outputs for each branch. This reverse navigation (i.e. utxo&lt;br/&gt;&amp;gt; information) is essential, must be persistent and is branch-relative.&lt;br/&gt;&lt;br/&gt;That is exactly what is stored in the spend-tree. &lt;br/&gt;&lt;br/&gt;&amp;gt;&amp;gt; As a simpler example, if two miners both mine a block at&lt;br/&gt;&amp;gt;&amp;gt; approximately the same time and send it to each other, then surely&lt;br/&gt;&amp;gt;&amp;gt; they would want to continue mining on their own block. Otherwise&lt;br/&gt;&amp;gt;&amp;gt; they would be throwing away their own reward.&lt;br/&gt;&lt;br/&gt;&amp;gt; That&amp;#39;s not your concurrent validation scenario. In the scenario you&lt;br/&gt;&amp;gt; described, the person chooses the weaker block of two that require&lt;br/&gt;&amp;gt; validation because it&amp;#39;s better somehow, not because it&amp;#39;s his own&lt;br/&gt;&amp;gt; (which does not require validation).&lt;br/&gt;&lt;br/&gt;&amp;gt; Consistency is reached, despite seeing things at different times,&lt;br/&gt;&amp;gt; because people use the same rules. If the economy ran on arbitrary&lt;br/&gt;&amp;gt; block preference consistency would be elusive.&lt;br/&gt;&lt;br/&gt;No but my example shows  that it is up to the miner to choose which tip&lt;br/&gt;to work on. This is not using different rules, it is just optimizing its&lt;br/&gt;income. This means that the economy *does* run on arbitrary &amp;#34;block&lt;br/&gt;preference&amp;#34;, even if it is not running on arbitrary rules.&lt;br/&gt;&lt;br/&gt;If two blocks are competing, a miner could optimize its decision which&lt;br/&gt;to mine on, not just on whether one of the blocks is his own, but also&lt;br/&gt;on fees, or on excessive validation costs.&lt;br/&gt;&lt;br/&gt;&amp;gt; I read this as encoding the height at which a fork historically&lt;br/&gt;&amp;gt; activated. If you intend to track activation for each branch that will&lt;br/&gt;&amp;gt; not be &amp;#34;height-based&amp;#34; it will be history based.&lt;br/&gt;&lt;br/&gt;I understand &amp;#34;height-based&amp;#34; was not the right wording, as it is of&lt;br/&gt;course branch-specific. Per tip ruleset metadata, must be matched with&lt;br/&gt;per-transaction ruleset metadata.&lt;br/&gt;&lt;br/&gt;Tomas
    </content>
    <updated>2023-06-07T17:59:37Z</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqstvm0407vrsjtvr6vlr8y3r0kg3xnvue4cuhc29zr82mghnkytfjszyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6v5uecd</id>
    
      <title type="html">📅 Original date posted:2017-04-07 📝 Original message:Thank ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqstvm0407vrsjtvr6vlr8y3r0kg3xnvue4cuhc29zr82mghnkytfjszyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6v5uecd" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8eaerz88fnqsvkz7rqremkck53j3rcf98xlzet9ss26ml7z8l44smaygzp&#39;&gt;nevent1q…ygzp&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-07&lt;br/&gt;📝 Original message:Thank you Marcos,&lt;br/&gt;&lt;br/&gt;Though written in Rust, bitcrust-db is definitely usable as pluggable&lt;br/&gt;module as its interface will be roughly some queries, add_tx and&lt;br/&gt;add_block with blobs and flags. (Bitcrust internally uses a&lt;br/&gt;deserialize-only model, keeping references to the blobs with the parsed&lt;br/&gt;data).  &lt;br/&gt;&lt;br/&gt;However, from Core&amp;#39;s side I believe network and storage are currently&lt;br/&gt;rather tightly coupled, which will make this far from trivial.&lt;br/&gt;&lt;br/&gt;Regardless, I am also hoping (with funding &amp;amp; a team) to build a Bitcrust&lt;br/&gt;networking component as well to bring a strong competitor to the market.&lt;br/&gt;&lt;br/&gt;best,&lt;br/&gt;Tomas&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Fri, Apr 7, 2017, at 09:55, Marcos mayorga wrote:&lt;br/&gt;&amp;gt; Hi Tomas,&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; I&amp;#39;ve read it and think it is an excellent work, I&amp;#39;d like to see it&lt;br/&gt;&amp;gt; integrated into bitcoin-core as a &amp;#39;kernel module&amp;#39;.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; I see there are a lot of proof of concepts out there, IMO every one&lt;br/&gt;&amp;gt; deserve a room in the bitcoin client as a selectable feature, to make the&lt;br/&gt;&amp;gt; software more flexible and less dictatorial, an user could easily select&lt;br/&gt;&amp;gt; which features she wants to run.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; Best regards,&lt;br/&gt;&amp;gt; Marcos&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; &amp;gt; I have been working on a bitcoin implementation that uses a different&lt;br/&gt;&amp;gt; &amp;gt; approach to indexing for verifying the order of transactions. Instead of&lt;br/&gt;&amp;gt; &amp;gt; using an index of unspent outputs, double spends are verified by using a&lt;br/&gt;&amp;gt; &amp;gt; spend-tree where spends are scanned against spent outputs instead of&lt;br/&gt;&amp;gt; &amp;gt; unspent outputs.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; This allows for much better concurrency, as not only blocks, but also&lt;br/&gt;&amp;gt; &amp;gt; individual inputs can be verified fully in parallel.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; I explain the approach at &lt;a href=&#34;https://bitcrust.org&#34;&gt;https://bitcrust.org&lt;/a&gt;, source code is available&lt;br/&gt;&amp;gt; &amp;gt; at &lt;a href=&#34;https://github.com/tomasvdw/bitcrust&#34;&gt;https://github.com/tomasvdw/bitcrust&lt;/a&gt;&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; I am sharing this not only to ask for your feedback, but also to call&lt;br/&gt;&amp;gt; &amp;gt; for a clear separation of protocol and implementations: As this&lt;br/&gt;&amp;gt; &amp;gt; solution, reversing the costs of outputs and inputs, seems to have&lt;br/&gt;&amp;gt; &amp;gt; excellent performance characteristics (as shown in the test results),&lt;br/&gt;&amp;gt; &amp;gt; updates to the protocol addressing the UTXO growth, might not be worth&lt;br/&gt;&amp;gt; &amp;gt; considering *protocol improvements* and it might be best to address&lt;br/&gt;&amp;gt; &amp;gt; these concerns as implementation details.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Kind regards,&lt;br/&gt;&amp;gt; &amp;gt; Tomas van der Wansem&lt;br/&gt;&amp;gt; &amp;gt; tomas at bitcrust.org&lt;br/&gt;&amp;gt; &amp;gt; Bitcrust&lt;br/&gt;&amp;gt; &amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; &amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; &amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&gt;&amp;gt; &amp;gt; &lt;a href=&#34;https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev&#34;&gt;https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev&lt;/a&gt;&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt;
    </content>
    <updated>2023-06-07T17:59:37Z</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsxvak4nhkkxttfspuarqnlr4gy7yvaquvwd7xsykg894xyp56unnczyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd67kqvwx</id>
    
      <title type="html">📅 Original date posted:2017-04-11 📝 Original message:On ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsxvak4nhkkxttfspuarqnlr4gy7yvaquvwd7xsykg894xyp56unnczyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd67kqvwx" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsdfgdmqgqpehcwz3xzg0vka7cn6hcx0sqgsgmk52f3dlute4lr0fg3wqsma&#39;&gt;nevent1q…qsma&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-11&lt;br/&gt;📝 Original message:On Tue, Apr 11, 2017, at 03:44, Eric Voskuil wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; As I understand it you would split tx inputs and outputs and send them&lt;br/&gt;&amp;gt; independently, and that you intend this to be a P2P network&lt;br/&gt;&amp;gt; optimization - not a consensus rule change. So my comments are based&lt;br/&gt;&amp;gt; on those inferences. If we are talking about consensus changes this&lt;br/&gt;&amp;gt; conversation will end up in an entirely different place.&lt;br/&gt;&lt;br/&gt;&amp;gt; I don&amp;#39;t agree with the input/output relevance statements above. When a&lt;br/&gt;&amp;gt; tx is announced the entire tx is relevant. It cannot be validated as&lt;br/&gt;&amp;gt; outputs only. If it cannot be validated it cannot be stored by the&lt;br/&gt;&amp;gt; node. Validating the outputs only would require the node store invalid&lt;br/&gt;&amp;gt; transactions.&lt;br/&gt;&lt;br/&gt;Splitting transactions only happens *on storage* and is just a minor&lt;br/&gt;optimization compared to storing them in full. (actually a very recent&lt;br/&gt;change with only marginally better results). This is simply because the&lt;br/&gt;output scripts are read on script validation, and storing the outputs of&lt;br/&gt;the transaction separately ensures better spatial locality of reference&lt;br/&gt;(the inputs are just &amp;#34;in the way&amp;#34;). This is not relevant when using a&lt;br/&gt;UTXO-index, because the outputs are then directly stored in the index,&lt;br/&gt;where bitcrust has to read them from the transaction data.&lt;br/&gt;&lt;br/&gt;It is not my intention to send them independently.&lt;br/&gt; &lt;br/&gt;&amp;gt; I do accept that a double-spend detection is not an optimal criteria&lt;br/&gt;&amp;gt; by which to discard a tx. One also needs fee information. But without&lt;br/&gt;&amp;gt; double-spend knowledge the node has no rational way to defend itself&lt;br/&gt;&amp;gt; against an infinity of transactions that spend the minimal fee but&lt;br/&gt;&amp;gt; also have conflicting inputs (i.e. risking the fee only once). So tx&lt;br/&gt;&amp;gt; (pool) validation requires double-spend knowledge and at least a&lt;br/&gt;&amp;gt; summary from outputs.&lt;br/&gt;&lt;br/&gt;Double spent information is still available to the network node and&lt;br/&gt;could still be used for DoS protection, although I do believe&lt;br/&gt;alternatives may exist.&lt;br/&gt; &lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; A reorg is conceptual and cannot be engineered out. What you are&lt;br/&gt;&amp;gt; referring to is a restructuring of stored information as a consequence&lt;br/&gt;&amp;gt; of a reorg. I don&amp;#39;t see this as related to the above. The ability to&lt;br/&gt;&amp;gt; perform reorganization via a branch pointer swap is based not on the&lt;br/&gt;&amp;gt; order or factoring of validation but instead on the amount of&lt;br/&gt;&amp;gt; information stored. It requires more information to maintain multiple&lt;br/&gt;&amp;gt; branches.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; Transactions have confirmation states, validation contexts and spender&lt;br/&gt;&amp;gt; heights for potentially each branch of an unbounded number of&lt;br/&gt;&amp;gt; branches. It is this requirement to maintain that state for each&lt;br/&gt;&amp;gt; branch that makes this design goal a very costly trade-off of space&lt;br/&gt;&amp;gt; and complexity for reorg speed. As I mentioned earlier, it&amp;#39;s the&lt;br/&gt;&amp;gt; optimization for this scenario that I find questionable.&lt;br/&gt;&lt;br/&gt;Sure, we can still call switching tips a &amp;#34;reorg&amp;#34;. And it is indeed a&lt;br/&gt;trade off as orphan blocks are stored, but a block in the spend tree&lt;br/&gt;takes only ~12kb and contains  the required state information. &lt;br/&gt;&lt;br/&gt;I believe this trade off  reduced complexity. For the earlier tree this&lt;br/&gt;could be pruned.&lt;br/&gt;&lt;br/&gt;&amp;gt; Because choosing the lesser amount of work is non-consensus behavior.&lt;br/&gt;&amp;gt; Under the same circumstances (i.e. having seen the same set of blocks)&lt;br/&gt;&amp;gt; two nodes will disagree on whether there is one confirmation or no&lt;br/&gt;&amp;gt; confirmations for a given tx. This disagreement will persist (i.e. why&lt;br/&gt;&amp;gt; take the weaker block only to turn around and replace it with the&lt;br/&gt;&amp;gt; stronger block that arrives a few seconds or minutes later). It stands&lt;br/&gt;&amp;gt; to reason that if one rejects a stronger block under a race condition,&lt;br/&gt;&amp;gt; one would reorg out a stronger block when a weaker block arrives a&lt;br/&gt;&amp;gt; little after the stronger block. Does this &amp;#34;optimization&amp;#34; then apply&lt;br/&gt;&amp;gt; to chains of blocks too?&lt;br/&gt;&lt;br/&gt;The blockchain is - by design - only eventually consistent across nodes.&lt;br/&gt;Even if nodes would use the same &amp;#34;tip-selection&amp;#34; rules, you cannot rely&lt;br/&gt;on all blocks being propagated and hence each transaction having the&lt;br/&gt;same number of confirmations across all nodes.&lt;br/&gt;&lt;br/&gt;As a simpler example, if two miners both mine a block at approximately&lt;br/&gt;the same time and send it to each other, then surely they would want to&lt;br/&gt;continue mining on their own block. Otherwise they would be throwing&lt;br/&gt;away their own reward.  &lt;br/&gt;&lt;br/&gt;And yes, this can also happen over multiple blocks, but the chances of&lt;br/&gt;consistency are vastly increased with each confirmation.&lt;br/&gt;&lt;br/&gt;&amp;gt; Accepting a block that all previous implementations would have&lt;br/&gt;&amp;gt; rejected under the same circumstance could be considered a hard fork,&lt;br/&gt;&amp;gt; but you may be right.&lt;br/&gt;&lt;br/&gt;I am not talking about rejecting blocks, I am only talking choosing on&lt;br/&gt;which tip to mine.&lt;br/&gt;&lt;br/&gt;&amp;gt; &amp;gt; Frankly, I think this is a bit of an exaggeration. Soft forks are &lt;br/&gt;&amp;gt; &amp;gt; counted on a hand, and I don&amp;#39;t think there are many - if any - &lt;br/&gt;&amp;gt; &amp;gt; transactions in the current chain that have changed compliance &lt;br/&gt;&amp;gt; &amp;gt; based on height.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; Hope is a bug.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; If you intend this to be useful it has to help build the chain, not&lt;br/&gt;&amp;gt; just rely on hardwiring checkpoints once rule changes are presumed to&lt;br/&gt;&amp;gt; be buried deeply enough to do so (as the result of other implementations&lt;br/&gt;&amp;gt; ).&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; I understand this approach, it was ours at one time. There is a&lt;br/&gt;&amp;gt; significant difference, and your design is to some degree based on a&lt;br/&gt;&amp;gt; failure to fully consider this. I encourage you to not assume any&lt;br/&gt;&amp;gt; consensus-related detail is too small.&lt;br/&gt;&lt;br/&gt;I am not failing to consider this, and I don&amp;#39;t consider this too small .&lt;br/&gt;But ensuring contextual transaction validity by &amp;#34;validate =&amp;gt;  valid with&lt;br/&gt;rules X,Y,Z&amp;#34; and then checking the active rules (softfork activation) on&lt;br/&gt;order validation, will give logically the same results as &amp;#34;validate with&lt;br/&gt;X,Y,Z =&amp;gt; valid&amp;#34;. This is not &amp;#34;hardwiring checkpoints&amp;#34; at all.&lt;br/&gt;&lt;br/&gt;&amp;gt; You cannot have a useful performance measure without full compliance.&lt;br/&gt;&lt;br/&gt;I agree that the results are preliminary and I will post more if the&lt;br/&gt;product reaches later stages.&lt;br/&gt;&lt;br/&gt;&amp;gt; It&amp;#39;s worth noting that many of your stated objectives, including&lt;br/&gt;&amp;gt; modularity, developer platform, store isolation, consensus rule&lt;br/&gt;&amp;gt; isolation (including optional use of libbitcoinconsensus) are implemente&lt;br/&gt;&amp;gt; d.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; It seems like you are doing some good work and it&amp;#39;s not my intent to&lt;br/&gt;&amp;gt; discourage that. Libbitcoin is open source, I don&amp;#39;t get paid and I&amp;#39;m&lt;br/&gt;&amp;gt; not selling anything. But if you are going down this path you should&lt;br/&gt;&amp;gt; be aware of it and may benefit from our successes as well as some of&lt;br/&gt;&amp;gt; the other stuff :). And hopefully we can get the benefit of your&lt;br/&gt;&amp;gt; insights as well.&lt;br/&gt; &lt;br/&gt;&lt;br/&gt;Thank you, I will definitely further dive into libbitcoin, and see what&lt;br/&gt;insights I can use for Bitcrust.&lt;br/&gt;&lt;br/&gt;Tomas
    </content>
    <updated>2023-06-07T17:59:36Z</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsdwnct90u44t3zlcj4fvdjn23y88spgj7tztf3qtlcf086t92lupczyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6w6rfzf</id>
    
      <title type="html">📅 Original date posted:2017-04-08 📝 Original message:Thank ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsdwnct90u44t3zlcj4fvdjn23y88spgj7tztf3qtlcf086t92lupczyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6w6rfzf" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsv6wcnhax97vv0q6gmuq58a3t6t6p00yye3gzkxge55evhrpc0kvc2evamq&#39;&gt;nevent1q…vamq&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-08&lt;br/&gt;📝 Original message:Thank you for your elaborate response Eric,&lt;br/&gt;&lt;br/&gt;On Sun, Apr 9, 2017, at 00:37, Eric Voskuil wrote:&lt;br/&gt;&amp;gt; My point was that &amp;#34;Using a storage engine without UTXO-index&amp;#34; has been&lt;br/&gt;&amp;gt; done, and may be a useful reference, not that implementation details&lt;br/&gt;&amp;gt; are the same.&lt;br/&gt;&lt;br/&gt;I haven&amp;#39;t dived into libbitcoin V2/V3 enough to  fully grasp it and&lt;br/&gt;though your comments help, I still not fully do.  I will answer below&lt;br/&gt;what is related to bitcrust itself.&lt;br/&gt;&lt;br/&gt;My post wasn&amp;#39;t posted to claim innovation; I merely try to explain how&lt;br/&gt;Bitcrust works and why   it performs well. &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&amp;gt; First, I remain confused on your comments pertaining to UTXO growth&lt;br/&gt;&amp;gt; and network protocol. I followed your conversation with Greg and it&lt;br/&gt;&amp;gt; remains unclear to me. From what I understand you have isolated order&lt;br/&gt;&amp;gt; (double spend) from script validation. I think we all understand that&lt;br/&gt;&amp;gt; script validation requires inputs and outputs while double spend&lt;br/&gt;&amp;gt; detection requires correlation of inputs. What I do not understand is&lt;br/&gt;&amp;gt; your choice of optimization axis.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; Detection of double spend is not useful in isolation. One must also&lt;br/&gt;&amp;gt; validate scripts, which requires outputs. I can see that there is an&lt;br/&gt;&amp;gt; opportunity to reject blocks (within the same branch) faster by&lt;br/&gt;&amp;gt; validating for double spends before validating script. But unconfirmed&lt;br/&gt;&amp;gt; transactions do not exist in a branch, and are therefore not truly&lt;br/&gt;&amp;gt; conflicting, until they are mined. And even after they are mined&lt;br/&gt;&amp;gt; conflicting txs remain potentially valid in other branches. So&lt;br/&gt;&amp;gt; rejecting txs due to conflict comes down to a denial of service&lt;br/&gt;&amp;gt; policy, which ultimately must be based on fee increment (e.g. RBF).&lt;br/&gt;&amp;gt; But fees are based on the amount of the output value that remains&lt;br/&gt;&amp;gt; unspent in the transaction. So this in turn requires the retrieval of&lt;br/&gt;&amp;gt; outputs.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; And yet the remaining scenario of fast rejection of invalid blocks is&lt;br/&gt;&amp;gt; not a meaningful optimization. Optimizing for the case where a block&lt;br/&gt;&amp;gt; has valid and sufficient PoW and yet is invalid (for double spend) is&lt;br/&gt;&amp;gt; counterproductive. And even so, the txs within the invalid block may&lt;br/&gt;&amp;gt; be entirely valid independent of the block, so you are back to looking&lt;br/&gt;&amp;gt; up their outputs to obtain fees in the case of a double spend or to&lt;br/&gt;&amp;gt; validate script otherwise. In all cases you need to get the outputs.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; &amp;gt; Bitcrust simply scans the tree. Although earlier designs used a &lt;br/&gt;&amp;gt; &amp;gt; skip-list, it turns out that accompanied by a spent-index lagging a&lt;br/&gt;&amp;gt; &amp;gt; few blocks behind, raw scanning is faster then anything even though&lt;br/&gt;&amp;gt; &amp;gt; it needs to scan ~5 blocks times ~4000 inputs before reaching the&lt;br/&gt;&amp;gt; &amp;gt; first spent-index,  the actual scan is highly cache efficient and&lt;br/&gt;&amp;gt; &amp;gt; little more then a &amp;#34;REP SCASQ&amp;#34;, reaching sub-microsecond per input&lt;br/&gt;&amp;gt; &amp;gt; on each core *including* the lookup in the spend index.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; I realize that you see the implementation of the ordering validation&lt;br/&gt;&amp;gt; as interesting detail, but I find it hard to justify contemplating the&lt;br/&gt;&amp;gt; implementation in isolation from the output lookup requirement. And if&lt;br/&gt;&amp;gt; one must looking up both outputs and spends for each validation, it&lt;br/&gt;&amp;gt; makes more sense to co-locate that data.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; Recovering in one step all data necessary to validate a tx has real&lt;br/&gt;&amp;gt; advantages over either interleaving queries and validation or&lt;br/&gt;&amp;gt; splitting input vs. output validation queries into two steps. It is a&lt;br/&gt;&amp;gt; significantly more test-friendly approach, has better performance&lt;br/&gt;&amp;gt; characteristics, and simplifies code. I cannot see any reason to&lt;br/&gt;&amp;gt; perform the data read for double spend validation in isolation of that&lt;br/&gt;&amp;gt; for script validation.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;You seem to ignore here the difference between base load and peak load.&lt;br/&gt;If Compact blocks/XThin with further optimizations can presync nearly&lt;br/&gt;100% of the transactions, and nodes can do as much as possible when a&lt;br/&gt;transaction comes in, the time spent when a block comes in can be&lt;br/&gt;minimized and a lot more transactions can be handled with the same&lt;br/&gt;resources.&lt;br/&gt;&lt;br/&gt;The reason for &amp;#34;splitting&amp;#34; is that for an incoming transaction the&lt;br/&gt;spent-state of the outputs being spent isn&amp;#39;t particularly relevant as&lt;br/&gt;you seem to acknowledge. When the block comes in, the actual output data&lt;br/&gt;isn&amp;#39;t relevant.&lt;br/&gt;&lt;br/&gt;The *only* thing that needs to be checked when a block comes in is the&lt;br/&gt;order, and the spend-tree approach absolves the need to access outputs&lt;br/&gt;here.&lt;br/&gt;&lt;br/&gt;As it also absolves the need for reorgs this greatly simplifies the&lt;br/&gt;design. I am not sure why you say that a one-step approach is more&lt;br/&gt;&amp;#34;test-friendly&amp;#34; as this seems to be unrelated.&lt;br/&gt;&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; If by results you are referring to performance numbers, it&amp;#39;s very hard&lt;br/&gt;&amp;gt; to draw any conclusions without a full benchmark. It&amp;#39;s great that if&lt;br/&gt;&amp;gt; you are able to boost Core, but from my perspective the numbers aren&amp;#39;t&lt;br/&gt;&amp;gt; especially compelling.&lt;br/&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;I fully agree and hopefully do not pretend to hide that my numbers are&lt;br/&gt;premature without a full implementation. I just think they are promising&lt;br/&gt;enough to  convince at least myself to move on with this model.&lt;br/&gt; &lt;br/&gt;&amp;gt; Despite the site&amp;#39;s explanation I cannot think of any reason to ever&lt;br/&gt;&amp;gt; validate two blocks at the same time. You would always prioritize the&lt;br/&gt;&amp;gt; block with the greatest PoW. Doing otherwise just slows down the net&lt;br/&gt;&amp;gt; validation in all but the pathological case where a miner has produced&lt;br/&gt;&amp;gt; an *invalid* block with *more* PoW than another valid block which&lt;br/&gt;&amp;gt; arrived at the node within the same second. Rejecting a *valid* block&lt;br/&gt;&amp;gt; with more PoW in favor of one with *less* &amp;#34;processing&amp;#34; is a hard fork,&lt;br/&gt;&amp;gt; so you probably wouldn&amp;#39;t want to do that either. But with compact&lt;br/&gt;&amp;gt; block validation times approaching 25ms it&amp;#39;s hard to justify stopping&lt;br/&gt;&amp;gt; a block validation for any reason.&lt;br/&gt;&lt;br/&gt;I don&amp;#39;t get what you are saying. Why pick the greatest PoW of two&lt;br/&gt;competing blocks? If two blocks come in, an implementation is free to&lt;br/&gt;choose whichever block to build on. Choosing so is not a &amp;#34;hardfork&amp;#34;.&lt;br/&gt;Parallel validation simply makes it easier to make an optimal choice,&lt;br/&gt;for if two blocks come in, the one that is validated fastest can be&lt;br/&gt;build upon without the risk of validationless mining.&lt;br/&gt;&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; That&amp;#39;s not to say parallel block validation difficult to do. If you&lt;br/&gt;&amp;gt; can validate one block&amp;#39;s full set of inputs in parallel (which is not&lt;br/&gt;&amp;gt; novel) doing the same with additional blocks has trivial additional&lt;br/&gt;&amp;gt; complexity.&lt;br/&gt;&lt;br/&gt;I am not trying to claim novelty here.&lt;br/&gt;&lt;br/&gt;&amp;gt; I am also interested in your previous comments about soft forks. These&lt;br/&gt;&amp;gt; are material considerations that Greg touched on but it doesn&amp;#39;t sound&lt;br/&gt;&amp;gt; like you fully appreciate just yet. When a tx is pre-validated the&lt;br/&gt;&amp;gt; rules applied must be the same rules as those of some future block.&lt;br/&gt;&amp;gt; Yet a tx can be included in more than one block (different branches).&lt;br/&gt;&amp;gt; Across branches and even in one branch, validation rules change, and&lt;br/&gt;&amp;gt; can change back. The changes are based on accumulated branch history.&lt;br/&gt;&amp;gt; Pre-validation can later become invalidated, and differently in&lt;br/&gt;&amp;gt; different branches. And maintaining proper context requires either&lt;br/&gt;&amp;gt; storing state that you are apparently not storing, or invalidating&lt;br/&gt;&amp;gt; optimizations. Based on your comments you do not seem to be accounting&lt;br/&gt;&amp;gt; for this in your storage assumptions or in your results. A recent post&lt;br/&gt;&amp;gt; by Greg highlights the complexity and consensus criticality of these&lt;br/&gt;&amp;gt; considerations.&lt;br/&gt;&lt;br/&gt;Frankly, I think this is a bit of an exaggeration. Soft forks are&lt;br/&gt;counted on a hand, and I don&amp;#39;t think there are many - if any -&lt;br/&gt;transactions in the current chain that have changed compliance based on&lt;br/&gt;height. This makes this a compliance issue and not a performance issue&lt;br/&gt;and the solution I have explained, to add height-based compliance as&lt;br/&gt;meta data of validation seems to &lt;br/&gt;be adequate and safe.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&amp;gt; The hash table store that I described can fully navigate the block&lt;br/&gt;&amp;gt; tree and transaction DAG, since the stored tx, parent and point hashes&lt;br/&gt;&amp;gt; are also natural keys and each link is navigable in constant time. It&lt;br/&gt;&amp;gt; is also lock-free, can concurrently write any number of blocks during&lt;br/&gt;&amp;gt; initial block download and supports read/write concurrency. It has&lt;br/&gt;&amp;gt; successfully indexed and stored the entire blockchain from the P2P&lt;br/&gt;&amp;gt; network in 16 minutes (locally). It also stores both confirmed and&lt;br/&gt;&amp;gt; unconfirmed transactions in the same store, so there is nothing to&lt;br/&gt;&amp;gt; write when a block is confirmed except for the block header/hashes and&lt;br/&gt;&amp;gt; updates to spender heights for any output spent by the new block&amp;#39;s&lt;br/&gt;&amp;gt; txs. It is similarly capable of storage in the block table of weak&lt;br/&gt;&amp;gt; chain blocks...&lt;br/&gt;&amp;gt; &lt;br/&gt;&lt;br/&gt;I think I get the gist of your approach and it sounds very interesting&lt;br/&gt;and I will definitely dive in deeper.&lt;br/&gt;&lt;br/&gt;It also seems sufficiently different from Bitcrust to merit competing on&lt;br/&gt;(eventual) results instead of the complicated theory alone.&lt;br/&gt;&lt;br/&gt;Best,&lt;br/&gt;Tomas
    </content>
    <updated>2023-06-07T17:59:34Z</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsxyra24nkjm75wwdcvzhxtp987th9qaku9wdv2qrev82jq9s2ualqzyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6t063wp</id>
    
      <title type="html">📅 Original date posted:2017-04-06 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsxyra24nkjm75wwdcvzhxtp987th9qaku9wdv2qrev82jq9s2ualqzyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd6t063wp" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvhfcgqlg56j8vcz73fa0ff5csxzv4dddw97hdqznjmkmkzpjhtpglj2jhc&#39;&gt;nevent1q…2jhc&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-06&lt;br/&gt;📝 Original message:Hi Eric,&lt;br/&gt;&lt;br/&gt;Thanks, but I get the impression that the similarity is rather&lt;br/&gt;superficial.  &lt;br/&gt;&lt;br/&gt;To address your points:&lt;br/&gt;&lt;br/&gt;&amp;gt; (1) higher than necessary storage space requirement due to storing the&lt;br/&gt;&amp;gt; indexing data required for correlate the spends, and&lt;br/&gt;&lt;br/&gt;Hmm. No. Spends are simply scanned in the spend-tree (full tree,&lt;br/&gt;prunable, fully 5.6gb), or caught by the spend-index (bit index,&lt;br/&gt;non-prunable, fully 180mb). Neither impose significant storage&lt;br/&gt;requirements.&lt;br/&gt;&lt;br/&gt;&amp;gt; 2) higher than necessary validation complexity and cost in terms of&lt;br/&gt;&amp;gt; computing the spent-ness (including spender height) of an output.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; With the exception of de-linking (not deleted) in the case of reorgs, the&lt;br/&gt;&amp;gt; entire store is append only, implemented in a small set of memory&lt;br/&gt;&amp;gt; mapped file&lt;br/&gt;&lt;br/&gt;I guess this is the key difference. As the spend-tree stores the spend&lt;br/&gt;information in a tree structure, no reorgs are required, and the&lt;br/&gt;resulting code is actually much less complex.&lt;br/&gt;&lt;br/&gt;Bitcrust simply scans the tree. Although earlier designs used a&lt;br/&gt;skip-list, it turns out that accompanied by a spent-index lagging a few&lt;br/&gt;blocks behind, raw scanning is faster then anything even though it needs&lt;br/&gt;to scan ~5 blocks times ~4000 inputs before reaching the first&lt;br/&gt;spent-index,  the actual scan is highly cache efficient and little more&lt;br/&gt;then a &amp;#34;REP SCASQ&amp;#34;, reaching sub-microsecond per input on each core&lt;br/&gt;*including* the lookup in the spend index.&lt;br/&gt;&lt;br/&gt; &amp;gt; I don&amp;#39;t follow this part, maybe you could clarify. A spends index&lt;br/&gt;&amp;gt; grows with the size of the spend set (forever) as it cannot be pruned,&lt;br/&gt;&amp;gt; which certainly exceeds the size of the UTXO set (unless nothing is&lt;br/&gt;&amp;gt; spent). The advantage is that you don&amp;#39;t have to keep rewriting the&lt;br/&gt;&amp;gt; store when you use a spends set (because the store can be append only).&lt;br/&gt;&lt;br/&gt;My point is, that the spend tree grows per *input* of a transaction&lt;br/&gt;instead of per *output* of a transaction, because this is what is&lt;br/&gt;scanned on order validation.&lt;br/&gt;&lt;br/&gt;The spend tree can be pruned because the spend index (~200mb) catches&lt;br/&gt;early spends.&lt;br/&gt;&lt;br/&gt;Disregarding the baseload script validation, the peak load order&lt;br/&gt;validation of bitcrust is more negatively effected by a transaction with&lt;br/&gt;many inputs than by a transaction of many outputs.&lt;br/&gt;&lt;br/&gt;I encourage you to check out the results at &lt;a href=&#34;https://bitcrust.org&#34;&gt;https://bitcrust.org&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Regards,&lt;br/&gt;Tomas&lt;br/&gt;&lt;br/&gt;On Fri, Apr 7, 2017, at 01:38, Eric Voskuil wrote:&lt;br/&gt;&amp;gt; -----BEGIN PGP SIGNED MESSAGE-----&lt;br/&gt;&amp;gt; Hash: SHA256&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; On 04/06/2017 03:12 PM, Tomas via bitcoin-dev wrote:&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; Hi Tomas,&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; &amp;gt; I have been working on a bitcoin implementation that uses a&lt;br/&gt;&amp;gt; &amp;gt; different approach to indexing for verifying the order of&lt;br/&gt;&amp;gt; &amp;gt; transactions. Instead of using an index of unspent outputs, double&lt;br/&gt;&amp;gt; &amp;gt; spends are verified by using a spend-tree where spends are scanned&lt;br/&gt;&amp;gt; &amp;gt; against spent outputs instead of unspent outputs.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; This is the approach that genjix used in libbitcoin version2. With the&lt;br/&gt;&amp;gt; exception of de-linking (not deleted) in the case of reorgs, the&lt;br/&gt;&amp;gt; entire store is append only, implemented in a small set of memory&lt;br/&gt;&amp;gt; mapped files. The downsides to the approach are:&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; (1) higher than necessary storage space requirement due to storing the&lt;br/&gt;&amp;gt; indexing data required for correlate the spends, and&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; (2) higher than necessary validation complexity and cost in terms of&lt;br/&gt;&amp;gt; computing the spent-ness (including spender height) of an output.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; His implementation used a hash table, so performance-wise it did quite&lt;br/&gt;&amp;gt; well and would theoretically outperform a tree, O(1) vs. O(log2(N)).&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; &amp;gt; This allows for much better concurrency, as not only blocks, but&lt;br/&gt;&amp;gt; &amp;gt; also individual inputs can be verified fully in parallel.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; I was successful in parallelizing input validation (across the inputs&lt;br/&gt;&amp;gt; of an unconfirmed tx and across the set of all inputs in a block)&lt;br/&gt;&amp;gt; using the v2 store. However, it is not the case that the spends&lt;br/&gt;&amp;gt; approach is necessary for concurrency.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; To resolve the above two problems the version3 store does not use a&lt;br/&gt;&amp;gt; spends table/index. Nor does it store any table of UTXOs. Yet&lt;br/&gt;&amp;gt; validation is highly parallelized. Instead of additional indexes it&lt;br/&gt;&amp;gt; uses the tx hash table, augmented with 32 bits per output for spender&lt;br/&gt;&amp;gt; height. So there is a O(1) cost of finding the tx and a O(N) cost of&lt;br/&gt;&amp;gt; finding the spender height where N is the number of outputs in the tx.&lt;br/&gt;&amp;gt; But because the number of outputs in a tx is bounded (by block size)&lt;br/&gt;&amp;gt; this is constant time in the number of transactions.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; This works out much faster than the spends table, and without the&lt;br/&gt;&amp;gt; storage cost or complexity disadvantages. It also scales with&lt;br/&gt;&amp;gt; available hardware, as the memory mapped files become in-memory hash&lt;br/&gt;&amp;gt; tables. For low memory machines we found it was important to implement&lt;br/&gt;&amp;gt; an opaque UTXO cache to limit paging, but for higher end systems zero&lt;br/&gt;&amp;gt; cache is optimal.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; &amp;gt; I am sharing this not only to ask for your feedback, but also to&lt;br/&gt;&amp;gt; &amp;gt; call for a clear separation of protocol and implementations: As&lt;br/&gt;&amp;gt; &amp;gt; this solution, reversing the costs of outputs and inputs, seems to&lt;br/&gt;&amp;gt; &amp;gt; have excellent performance characteristics (as shown in the test&lt;br/&gt;&amp;gt; &amp;gt; results), updates to the protocol addressing the UTXO growth, might&lt;br/&gt;&amp;gt; &amp;gt; not be worth considering *protocol improvements* and it might be&lt;br/&gt;&amp;gt; &amp;gt; best to address these concerns as implementation details.&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; I don&amp;#39;t follow this part, maybe you could clarify. A spends index&lt;br/&gt;&amp;gt; grows with the size of the spend set (forever) as it cannot be pruned,&lt;br/&gt;&amp;gt; which certainly exceeds the size of the UTXO set (unless nothing is&lt;br/&gt;&amp;gt; spent). The advantage is that you don&amp;#39;t have to keep rewriting the&lt;br/&gt;&amp;gt; store when you use a spends set (because the store can be append only).&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; Feel free to message me if you&amp;#39;d like to discuss in more detail, or to&lt;br/&gt;&amp;gt; continue on the libbitcoin mailing list (copied).&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; e&lt;br/&gt;&amp;gt; -----BEGIN PGP SIGNATURE-----&lt;br/&gt;&amp;gt; Version: GnuPG v2.0.22 (GNU/Linux)&lt;br/&gt;&amp;gt; &lt;br/&gt;&amp;gt; iQEcBAEBCAAGBQJY5tFpAAoJEDzYwH8LXOFOcMgH/2mw5iOvUYNwvZ2z0KKTSUOA&lt;br/&gt;&amp;gt; Pd8d5mKoWvd94QxhQ&#43;RyTbkEkMhHl75&#43;zcBgRsfUTtZlBIe/Z0&#43;OgVIN6ibEw&#43;WD&lt;br/&gt;&amp;gt; w7k3HqgQi9gLgydEelxTAX&#43;z3dJ24n4kCCdKAmZbBuK&#43;Yr/7AViugbEqYemKepku&lt;br/&gt;&amp;gt; pRWZZS74MUvrYesc0xPn4Ao3DTzMjjY0K2mkuqV8jlwdfZjlAQX9pTx&#43;iSCuMhkd&lt;br/&gt;&amp;gt; HJ8w7s8QnjVnUeOlLe29mZwaFJPyOTLJMqgDE6s2sXacAy5QQbVCatygvDQ8A/wC&lt;br/&gt;&amp;gt; ktBnKPFb2lGX3bGKu/KwABegBy/hyec&#43;NP0wFR&#43;0MVivCwTK1&#43;SjeHu5MNOSVlM=&lt;br/&gt;&amp;gt; =tfVj&lt;br/&gt;&amp;gt; -----END PGP SIGNATURE-----
    </content>
    <updated>2023-06-07T17:59:33Z</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsy7z049llruc4rkl2uxe7qy82p7ltvhh524fy52em5q6z6maaa37qzyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd63mahr8</id>
    
      <title type="html">📅 Original date posted:2017-04-06 📝 Original message:I have ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsy7z049llruc4rkl2uxe7qy82p7ltvhh524fy52em5q6z6maaa37qzyqwqx46ngd246yfj5csuf9rxryxksrdy5vrt4zue969c0cn8vzwd63mahr8" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsdff5zhc0kvqlsl7re33ftwgju43j4fcsl8tkmpjqw04qu7uvc8tglvw8pm&#39;&gt;nevent1q…w8pm&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2017-04-06&lt;br/&gt;📝 Original message:I have been working on a bitcoin implementation that uses a different&lt;br/&gt;approach to indexing for verifying the order of transactions. Instead of&lt;br/&gt;using an index of unspent outputs, double spends are verified by using a&lt;br/&gt;spend-tree where spends are scanned against spent outputs instead of&lt;br/&gt;unspent outputs.&lt;br/&gt;&lt;br/&gt;This allows for much better concurrency, as not only blocks, but also&lt;br/&gt;individual inputs can be verified fully in parallel.&lt;br/&gt;&lt;br/&gt;I explain the approach at &lt;a href=&#34;https://bitcrust.org&#34;&gt;https://bitcrust.org&lt;/a&gt;, source code is available&lt;br/&gt;at &lt;a href=&#34;https://github.com/tomasvdw/bitcrust&#34;&gt;https://github.com/tomasvdw/bitcrust&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;I am sharing this not only to ask for your feedback, but also to call&lt;br/&gt;for a clear separation of protocol and implementations: As this&lt;br/&gt;solution, reversing the costs of outputs and inputs, seems to have&lt;br/&gt;excellent performance characteristics (as shown in the test results),&lt;br/&gt;updates to the protocol addressing the UTXO growth, might not be worth&lt;br/&gt;considering *protocol improvements* and it might be best to address&lt;br/&gt;these concerns as implementation details.&lt;br/&gt;&lt;br/&gt;Kind regards,&lt;br/&gt;Tomas van der Wansem&lt;br/&gt;tomas at bitcrust.org&lt;br/&gt;Bitcrust
    </content>
    <updated>2023-06-07T17:59:32Z</updated>
  </entry>

</feed>