<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <updated>2023-06-07T02:01:02Z</updated>
  <generator>https://njump.me</generator>

  <title>Nostr notes by Zac Greenwood [ARCHIVE]</title>
  <author>
    <name>Zac Greenwood [ARCHIVE]</name>
  </author>
  <link rel="self" type="application/atom+xml" href="https://njump.me/npub1gymmksd9tgwzc5w33umlx08sc2ggys3v2cucmpvl7yy9720wh49s8dvff7.rss" />
  <link href="https://njump.me/npub1gymmksd9tgwzc5w33umlx08sc2ggys3v2cucmpvl7yy9720wh49s8dvff7" />
  <id>https://njump.me/npub1gymmksd9tgwzc5w33umlx08sc2ggys3v2cucmpvl7yy9720wh49s8dvff7</id>
  <icon></icon>
  <logo></logo>




  <entry>
    <id>https://njump.me/nevent1qqs2gysdkzcr6tmfx9gupsrhdn2r5j3094ag47jhd7qtp06ujcl22ygzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kzqtkq5</id>
    
      <title type="html">📅 Original date posted:2023-03-30 🗒️ Summary of this ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqs2gysdkzcr6tmfx9gupsrhdn2r5j3094ag47jhd7qtp06ujcl22ygzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kzqtkq5" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqy7f7h06g8vycftngwqcmlrzavqxthcjes4vqcfaqws3wx3ruaccxa66xz&#39;&gt;nevent1q…66xz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2023-03-30&lt;br/&gt;🗒️ Summary of this message: Bitcoin should not add functionality to support private businesses relying on on-chain storage. Such businesses contribute little fees and increase costs for node operators.&lt;br/&gt;📝 Original message:Hi alicexbtc,&lt;br/&gt;&lt;br/&gt;Under no circumstance should Bitcoin add any functionality intended to&lt;br/&gt;support private businesses that rely on on-chain storage for their business&lt;br/&gt;model.&lt;br/&gt;&lt;br/&gt;Regarding “Fees paid: 150 BTC” (uh, *citation needed*):&lt;br/&gt;&lt;br/&gt;To optimize for profitability a business would generally attempt to operate&lt;br/&gt;using zero- or low-fee transactions. Therefore they tend to contribute&lt;br/&gt; comparatively little fees but are depriving public use of these cheap&lt;br/&gt;transactions. Worse, they exert a constant upward pressure on fee levels,&lt;br/&gt;making it more expensive for everyone else to transact.&lt;br/&gt;&lt;br/&gt;Unlike miners, node operators do not receive any compensation. They however&lt;br/&gt;incur additional cost for bandwidth, electricity and processing time to not&lt;br/&gt;only support some current business but all businesses in the past that ever&lt;br/&gt;tried to turn a profit at their expense, so also after such business failed&lt;br/&gt;and has been long gone. They foot the bill.&lt;br/&gt;&lt;br/&gt;Lastly, I don’t believe there is any value in having for instance Ordinals&lt;br/&gt;spam the blockchain with images of wojaks, bored apes and other crap but&lt;br/&gt;perhaps you wish to clarify why this might be something to be “excited&lt;br/&gt;about”.&lt;br/&gt;&lt;br/&gt;Your other arguments are nonsensical so excuse me for ignoring them.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Thu, 30 Mar 2023 at 03:57, alicexbt &amp;lt;alicexbt at protonmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Hi Zac,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Let me share what those parasites achieved:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; - Fees paid: 150 BTC&lt;br/&gt;&amp;gt; - Lot of users and developers trying bitcoin that either never tried or&lt;br/&gt;&amp;gt; gave up early in 2013-15&lt;br/&gt;&amp;gt; - Mempools of nodes of being busy on weekends and got lots of transactions&lt;br/&gt;&amp;gt; - PSBT became cool and application devs are trying their best to use it in&lt;br/&gt;&amp;gt; different ways&lt;br/&gt;&amp;gt; - Some developers exploring taproot and multisig&lt;br/&gt;&amp;gt; - AJ shared things how covenants could help in fair, non-custodial,&lt;br/&gt;&amp;gt; on-chain auction of ordinals that is MEV resistant although I had shared it&lt;br/&gt;&amp;gt; earlier which involves more steps:&lt;br/&gt;&amp;gt; &lt;a href=&#34;https://twitter.com/1440000bytes/status/1634368411760476161&#34;&gt;https://twitter.com/1440000bytes/status/1634368411760476161&lt;/a&gt;&lt;br/&gt;&amp;gt; - Investors exploring about funding projects&lt;br/&gt;&amp;gt; - Bitcoin more than Bitcoin and people excited about it&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; We can have difference of opinion, however I want bitcoin to be money and&lt;br/&gt;&amp;gt; money means different things for people in this world. Please respect that&lt;br/&gt;&amp;gt; else it will become like Linux, something used by 1% of world.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; /dev/fd0&lt;br/&gt;&amp;gt; floppy disk guy&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Sent with Proton Mail secure email.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; ------- Original Message -------&lt;br/&gt;&amp;gt; On Wednesday, March 29th, 2023 at 12:40 PM, Zac Greenwood via bitcoin-dev &amp;lt;&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; I’m not sure why any effort should be spent on theorizing how new&lt;br/&gt;&amp;gt; opcodes might be used to facilitate parasitical use cases of the blockchain.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; If anything, business models relying on the ability to abuse the&lt;br/&gt;&amp;gt; blockchain as a data store must be made less feasible, not more.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Zac&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; On Fri, 24 Mar 2023 at 20:10, Anthony Towns via bitcoin-dev &amp;lt;&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; On Tue, Mar 07, 2023 at 10:45:34PM &#43;1000, Anthony Towns via&lt;br/&gt;&amp;gt; bitcoin-dev wrote:&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; I think there are perhaps four opcodes that are interesting in this&lt;br/&gt;&amp;gt; class:&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; idx sPK OP_FORWARD_TARGET&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; -- sends the value to a particular output (given by idx), and&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; requires that output have a particular scriptPubKey (given&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; by sPK).&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; idx [...] n script OP_FORWARD_LEAF_UPDATE&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; -- sends the value to a particular output (given by idx), and&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; requires that output to have almost the same scriptPubKey as this&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; input, _except_ that the current leaf is replaced by &amp;#34;script&amp;#34;,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; with that script prefixed by &amp;#34;n&amp;#34; pushes (of values given by [...])&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; idx OP_FORWARD_SELF&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; -- sends the value to a particular output (given by idx), and&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; requires that output to have the same scriptPubKey as this input&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; amt OP_FORWARD_PARTIAL&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; -- modifies the next OP_FORWARD_* opcode to only affect &amp;#34;amt&amp;#34;,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; rather than the entire balance. opcodes after that affect the&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; remaining balance, after &amp;#34;amt&amp;#34; has been subtracted. if &amp;#34;amt&amp;#34; is&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; 0, the next OP_FORWARD_* becomes a no-op.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; The BIP 345 draft has been updated [0] [1] and now pretty much defines&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; OP_VAULT to have the behaviour specced for OP_FORWARD_LEAF_UPDATE&lt;br/&gt;&amp;gt; above,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; and OP_VAULT_RECOVER to behave as OP_FORWARD_TARGET above. Despite&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; that, for this email I&amp;#39;m going to continue using the OP_FORWARD_*&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; naming convention.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; Given the recent controversy over the Yuga labs ordinal auction [2],&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; perhaps it&amp;#39;s interesting to consider that these proposed opcodes come&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; close to making it possible to do a fair, non-custodial, on-chain&lt;br/&gt;&amp;gt; auction&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; of ordinals [3].&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; The idea here is that you create a utxo on chain that contains the&lt;br/&gt;&amp;gt; ordinal&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; in question, which commits to the address of the current leading&lt;br/&gt;&amp;gt; bidder,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; and can be spent in two ways:&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 1) it can be updated to a new bidder, if the bid is raised by at least&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; K satoshis, in which case the previous bidder is refunded their&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; bid; or,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 2) if there have been no new bids for a day, the current high bidder&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; wins, and the ordinal is moved to their address, while the funds&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; from their winning bid are sent to the original vendor&amp;#39;s address.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; I believe this can be implemented in script as follows,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; assuming the opcodes OP_FORWARD_TARGET(OP_VAULT_RECOVER),&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; OP_FORWARD_LEAF_UPDATE(OP_VAULT), OP_FORWARD_PARTIAL (as specced&lt;br/&gt;&amp;gt; above),&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; and OP_PUSHCURRENTINPUTINDEX (as implemented in liquid/elements [4])&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; are all available.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; First, figure out the parameters:&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; * Set VENDOR to the scriptPubKey corresponding to the vendor&amp;#39;s address.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; * Set K to the minimum bid increment [5].&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; * Initially, set X equal to VENDOR.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; * Initially, set V to just below the reserve price (V&#43;K is the&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; minimum initial bid).&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; Then construct the following script:&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; [X] [V] [SSS] TOALT TOALT TOALT&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 0 PUSHCURRENTINPUTINDEX EQUALVERIFY&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; DEPTH NOT IF&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 0 10000 FORWARD_PARTIAL&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 0 FROMALT FORWARD_TARGET&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 1 [VENDOR] FWD_TARGET&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 144&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; ELSE&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; FROMALT SWAP TUCK FROMALT&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; [K] ADD GREATERTHANOREQUAL VERIFY&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 1 SWAP FORWARD_TARGET&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; DUP FORWARD_PARTIAL&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 0 ROT ROT&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; FROMALT DUP 3 SWAP FORWARD_LEAF_UPDATE&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 0&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; ENDIF&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; CSV&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 1ADD&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; where &amp;#34;SSS&amp;#34; is a pushdata of the rest of the script (&amp;#34;TOALT TOALT TOALT&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; .. 1ADD&amp;#34;).&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; Finally, make that script the sole tapleaf, accompanied by a NUMS point&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; as the internal public key, calculate the taproot address corresponding&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; to that, and send the ordinal to that address as the first satoshi.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; There are two ways to spend that script. With an empty witness stack,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; the following will be executed:&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; [X] [V] [SSS] TOALT TOALT TOALT&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- altstack now contains [SSS V X]&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 0 PUSHCURRENTINPUTINDEX EQUALVERIFY&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- this input is the first, so the ordinal will move to the first&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; output&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; DEPTH NOT IF&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- take this branch: the auction is over!&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 1 [VENDOR] FWD_TARGET&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- output 1 gets the entire value of this input, and pays to&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; the vendor&amp;#39;s hardcoded scriptPubKey&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 0 10000 FORWARD_PARTIAL&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 0 FROMALT FORWARD_TARGET&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- we forward at least 10k sats to output 0 (if there were 0 sats,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; the ordinal would end up in output 1 instead, which would be a&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; bug), and output 0 pays to scriptPubKey &amp;#34;X&amp;#34;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 144&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; ELSE .. ENDIF&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- skip over the other branch&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; CSV&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- check that this input has baked for 144 blocks (~1 day)&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 1ADD&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- leave 145 on the stack, which is true. success!&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; Alternatively, if you want to increase the bid you provide a stack with&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; two items: your scriptPubKey and the new bid [X&amp;#39; V&amp;#39;]. Execution this&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; time looks like:&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; [X] [V] [SSS] TOALT TOALT TOALT&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- stack contains [X&amp;#39; V&amp;#39;], altstack now contains [SSS V X]&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 0 PUSHCURRENTINPUTINDEX EQUALVERIFY&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- this input is the first, so the ordinal will move to the first&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; output&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; DEPTH NOT IF ... ELSE&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- skip over the other branch (without violating minimalif rules)&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; FROMALT SWAP TUCK FROMALT&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- stack contains [X&amp;#39; V&amp;#39; X V&amp;#39; V], altstack contains [SSS]&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; [K] ADD GREATERTHANOREQUAL VERIFY&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- check V&amp;#39; &amp;gt;= V&#43;K, stack contains [X&amp;#39; V&amp;#39; X]&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 1 SWAP FORWARD_TARGET&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- output 1 pays to X (previous bidder&amp;#39;s scriptPubKey), and the&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; entire value of this input goes there; stack contains [X&amp;#39; V&amp;#39;]&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; DUP FORWARD_PARTIAL&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- execute &amp;#34;V&amp;#39; FORWARD_PARTIAL&amp;#34;, stack contains [X&amp;#39; V&amp;#39;]&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 0 ROT ROT&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- stack contains [0 X&amp;#39; V&amp;#39;]&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; FROMALT DUP 3 SWAP FORWARD_LEAF_UPDATE&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- execute &amp;#34;0 X&amp;#39; V&amp;#39; SSS 3 SSS FORWARD_LEAF_UPDATE&amp;#34; which checks&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; that output 0 spends at least V&amp;#39; satoshis back to the same&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; script (because that&amp;#39;s how we defined SSS), except the first&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; three pushes (previously X V SSS) are replaced by X&amp;#39; V&amp;#39; SSS.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 0&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; ENDIF&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; CSV&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- &amp;#34;0 CSV&amp;#34; requires nSequnce to be set, which makes the tx rbf&amp;#39;able,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; which hopefully makes it harder to pin&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; 1ADD&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; -- ends with 1 on the stack; success!&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; (The &amp;#34;SSS n SSS FORWARD_LEAF_UPDATE&amp;#34; construct is more or less a quine,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; ie a program that outputs its own source code)&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; I think that script is about 211 witness bytes, with an additional 40&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; witness bytes for X&amp;#39;/V&amp;#39;, so when making a bid, your tx would be&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; something like:&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; tx header, 10vb&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; input 0: 103vb for the old bid including witness and control block&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; input 1: 58vb for a taproot key path spend&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; output 0: 43vb for the new bid&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; output 1: 43vb for your change&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; for a total of about 257vb -- slightly larger than a regular 2-in-2-out&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; transaction, but not terribly much. Mostly because input 0 doesn&amp;#39;t&lt;br/&gt;&amp;gt; require&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; a signature -- it&amp;#39;s size is effectively 6 pubkeys: X, X&amp;#39; VENDOR twice,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; and the script code twice, along with a little extra to encode the&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; various numbers (10000, 144, K, V, V&amp;#39;).&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; This approach seems pretty &amp;#34;MEV&amp;#34; resistant: you pay fees via input 1 if&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; your bid succeeds; if it doesn&amp;#39;t, you don&amp;#39;t pay any fees. A potential&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; scalper might want to put in an early low ball bid, then prevent&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; higher bidders from winning the auction, take control of the ordinal,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; and resell it later, but unless they can prevent another miner from&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; mining alternative bids for 144 blocks, they will fail at that. The bid&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; is fixed by the bidder and committed to by the signature on input 1, so&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; frontrunning a bid can&amp;#39;t do anything beyond invalidate the bid&lt;br/&gt;&amp;gt; entirely.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; Obviously, this is a pretty limited auction mechanism in various ways;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; eg maybe you&amp;#39;d rather specify K as a percentage than an absoute&lt;br/&gt;&amp;gt; increment;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; maybe you&amp;#39;d like to have the auction definitely finish by some&lt;br/&gt;&amp;gt; particular&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; time; maybe you&amp;#39;d like to be able to have the auction be able to&lt;br/&gt;&amp;gt; continue&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; above 21.47 BTC (2**31 sats); maybe you&amp;#39;d like to do a dutch auction&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; rather than an english auction. I think you can probably do all those&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; things with this set of opcodes and clever scripting, though it&lt;br/&gt;&amp;gt; probably&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; gets ugly.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; I don&amp;#39;t think this is easily extensible to taro or rgb style assets,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; as rather than being able to ensure the asset is transferred by&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; controlling the input/output positions, I think you&amp;#39;d need to build&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; up merkle trees and do point tweaks beyond what&amp;#39;s supported by&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; OP_FORWARD_LEAF_UPDATE/OP_VAULT. Of course, without something like&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; OP_PUSHCURRENTINPUTINDEX I don&amp;#39;t think you could do it for ordinals&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; either.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; Cheers,&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; aj&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; [0]&lt;br/&gt;&amp;gt; &lt;a href=&#34;https://github.com/bitcoin/bips/blob/7f747fba82675f28c239df690a07b75529bd0960/bip-0345.mediawiki&#34;&gt;https://github.com/bitcoin/bips/blob/7f747fba82675f28c239df690a07b75529bd0960/bip-0345.mediawiki&lt;/a&gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; [1] &lt;a href=&#34;https://twitter.com/jamesob/status/1639019107432513537&#34;&gt;https://twitter.com/jamesob/status/1639019107432513537&lt;/a&gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; [2]&lt;br/&gt;&amp;gt; &lt;a href=&#34;https://cointelegraph.com/news/scammers-dream-yuga-s-auction-model-for-bitcoin-nfts-sees-criticism&#34;&gt;https://cointelegraph.com/news/scammers-dream-yuga-s-auction-model-for-bitcoin-nfts-sees-criticism&lt;/a&gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; [3] Inscriptions remain a wasteful way of publishing/committing&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; to content, however!&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; [4]&lt;br/&gt;&amp;gt; &lt;a href=&#34;https://github.com/ElementsProject/elements/blob/master/doc/tapscript_opcodes.md&#34;&gt;https://github.com/ElementsProject/elements/blob/master/doc/tapscript_opcodes.md&lt;/a&gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; [5] Setting K too low probably invites griefing, where a bidder may be&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; able to use rbf pinning vectors to prevent people who would be willing&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; to bid substantially higher from getting their bid confirmed on&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; chain.&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&amp;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/20230330/00fa836d/attachment-0001.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20230330/00fa836d/attachment-0001.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:20:06Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsqa533q2wyephnd2pj237r29huv5qd428uj9327knutswggx5xgkszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675ktfe7zy</id>
    
      <title type="html">📅 Original date posted:2023-03-29 🗒️ Summary of this ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsqa533q2wyephnd2pj237r29huv5qd428uj9327knutswggx5xgkszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675ktfe7zy" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8fa0k90lhgqmc92saljflagznf33qextn66c7enppznnmjcs5mjg8xcpcc&#39;&gt;nevent1q…cpcc&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2023-03-29&lt;br/&gt;🗒️ Summary of this message: Efforts should not be made to facilitate parasitical use cases of the blockchain. Business models relying on blockchain abuse must be made less feasible.&lt;br/&gt;📝 Original message:I’m not sure why any effort should be spent on theorizing how new opcodes&lt;br/&gt;might be used to facilitate parasitical use cases of the blockchain.&lt;br/&gt;&lt;br/&gt;If anything, business models relying on the ability to abuse the blockchain&lt;br/&gt;as a data store must be made less feasible, not more.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Fri, 24 Mar 2023 at 20:10, Anthony Towns via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; On Tue, Mar 07, 2023 at 10:45:34PM &#43;1000, Anthony Towns via bitcoin-dev&lt;br/&gt;&amp;gt; wrote:&lt;br/&gt;&amp;gt; &amp;gt; I think there are perhaps four opcodes that are interesting in this&lt;br/&gt;&amp;gt; class:&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt;    idx sPK OP_FORWARD_TARGET&lt;br/&gt;&amp;gt; &amp;gt;      -- sends the value to a particular output (given by idx), and&lt;br/&gt;&amp;gt; &amp;gt;         requires that output have a particular scriptPubKey (given&lt;br/&gt;&amp;gt; &amp;gt;         by sPK).&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt;    idx [...] n script OP_FORWARD_LEAF_UPDATE&lt;br/&gt;&amp;gt; &amp;gt;      -- sends the value to a particular output (given by idx), and&lt;br/&gt;&amp;gt; &amp;gt;       requires that output to have almost the same scriptPubKey as this&lt;br/&gt;&amp;gt; &amp;gt;       input, _except_ that the current leaf is replaced by &amp;#34;script&amp;#34;,&lt;br/&gt;&amp;gt; &amp;gt;       with that script prefixed by &amp;#34;n&amp;#34; pushes (of values given by [...])&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt;    idx OP_FORWARD_SELF&lt;br/&gt;&amp;gt; &amp;gt;      -- sends the value to a particular output (given by idx), and&lt;br/&gt;&amp;gt; &amp;gt;         requires that output to have the same scriptPubKey as this input&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt;    amt OP_FORWARD_PARTIAL&lt;br/&gt;&amp;gt; &amp;gt;      -- modifies the next OP_FORWARD_* opcode to only affect &amp;#34;amt&amp;#34;,&lt;br/&gt;&amp;gt; &amp;gt;         rather than the entire balance. opcodes after that affect the&lt;br/&gt;&amp;gt; &amp;gt;       remaining balance, after &amp;#34;amt&amp;#34; has been subtracted. if &amp;#34;amt&amp;#34; is&lt;br/&gt;&amp;gt; &amp;gt;       0, the next OP_FORWARD_* becomes a no-op.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; The BIP 345 draft has been updated [0] [1] and now pretty much defines&lt;br/&gt;&amp;gt; OP_VAULT to have the behaviour specced for OP_FORWARD_LEAF_UPDATE above,&lt;br/&gt;&amp;gt; and OP_VAULT_RECOVER to behave as OP_FORWARD_TARGET above. Despite&lt;br/&gt;&amp;gt; that, for this email I&amp;#39;m going to continue using the OP_FORWARD_*&lt;br/&gt;&amp;gt; naming convention.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Given the recent controversy over the Yuga labs ordinal auction [2],&lt;br/&gt;&amp;gt; perhaps it&amp;#39;s interesting to consider that these proposed opcodes come&lt;br/&gt;&amp;gt; close to making it possible to do a fair, non-custodial, on-chain auction&lt;br/&gt;&amp;gt; of ordinals [3].&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; The idea here is that you create a utxo on chain that contains the ordinal&lt;br/&gt;&amp;gt; in question, which commits to the address of the current leading bidder,&lt;br/&gt;&amp;gt; and can be spent in two ways:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;   1) it can be updated to a new bidder, if the bid is raised by at least&lt;br/&gt;&amp;gt;      K satoshis, in which case the previous bidder is refunded their&lt;br/&gt;&amp;gt;      bid; or,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;   2) if there have been no new bids for a day, the current high bidder&lt;br/&gt;&amp;gt;      wins, and the ordinal is moved to their address, while the funds&lt;br/&gt;&amp;gt;      from their winning bid are sent to the original vendor&amp;#39;s address.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I believe this can be implemented in script as follows,&lt;br/&gt;&amp;gt; assuming the opcodes OP_FORWARD_TARGET(OP_VAULT_RECOVER),&lt;br/&gt;&amp;gt; OP_FORWARD_LEAF_UPDATE(OP_VAULT), OP_FORWARD_PARTIAL (as specced above),&lt;br/&gt;&amp;gt; and OP_PUSHCURRENTINPUTINDEX (as implemented in liquid/elements [4])&lt;br/&gt;&amp;gt; are all available.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; First, figure out the parameters:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;  * Set VENDOR to the scriptPubKey corresponding to the vendor&amp;#39;s address.&lt;br/&gt;&amp;gt;  * Set K to the minimum bid increment [5].&lt;br/&gt;&amp;gt;  * Initially, set X equal to VENDOR.&lt;br/&gt;&amp;gt;  * Initially, set V to just below the reserve price (V&#43;K is the&lt;br/&gt;&amp;gt;    minimum initial bid).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Then construct the following script:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;  [X] [V] [SSS] TOALT TOALT TOALT&lt;br/&gt;&amp;gt;  0 PUSHCURRENTINPUTINDEX EQUALVERIFY&lt;br/&gt;&amp;gt;  DEPTH NOT IF&lt;br/&gt;&amp;gt;    0 10000 FORWARD_PARTIAL&lt;br/&gt;&amp;gt;    0 FROMALT FORWARD_TARGET&lt;br/&gt;&amp;gt;    1 [VENDOR] FWD_TARGET&lt;br/&gt;&amp;gt;    144&lt;br/&gt;&amp;gt;  ELSE&lt;br/&gt;&amp;gt;    FROMALT SWAP TUCK FROMALT&lt;br/&gt;&amp;gt;    [K] ADD GREATERTHANOREQUAL VERIFY&lt;br/&gt;&amp;gt;    1 SWAP FORWARD_TARGET&lt;br/&gt;&amp;gt;    DUP FORWARD_PARTIAL&lt;br/&gt;&amp;gt;    0 ROT ROT&lt;br/&gt;&amp;gt;    FROMALT DUP 3 SWAP FORWARD_LEAF_UPDATE&lt;br/&gt;&amp;gt;    0&lt;br/&gt;&amp;gt;  ENDIF&lt;br/&gt;&amp;gt;  CSV&lt;br/&gt;&amp;gt;  1ADD&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; where &amp;#34;SSS&amp;#34; is a pushdata of the rest of the script (&amp;#34;TOALT TOALT TOALT&lt;br/&gt;&amp;gt; .. 1ADD&amp;#34;).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Finally, make that script the sole tapleaf, accompanied by a NUMS point&lt;br/&gt;&amp;gt; as the internal public key, calculate the taproot address corresponding&lt;br/&gt;&amp;gt; to that, and send the ordinal to that address as the first satoshi.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; There are two ways to spend that script. With an empty witness stack,&lt;br/&gt;&amp;gt; the following will be executed:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;  [X] [V] [SSS] TOALT TOALT TOALT&lt;br/&gt;&amp;gt;    -- altstack now contains [SSS V X]&lt;br/&gt;&amp;gt;  0 PUSHCURRENTINPUTINDEX EQUALVERIFY&lt;br/&gt;&amp;gt;    -- this input is the first, so the ordinal will move to the first&lt;br/&gt;&amp;gt;       output&lt;br/&gt;&amp;gt;  DEPTH NOT IF&lt;br/&gt;&amp;gt;    -- take this branch: the auction is over!&lt;br/&gt;&amp;gt;    1 [VENDOR] FWD_TARGET&lt;br/&gt;&amp;gt;    -- output 1 gets the entire value of this input, and pays to&lt;br/&gt;&amp;gt;       the vendor&amp;#39;s hardcoded scriptPubKey&lt;br/&gt;&amp;gt;    0 10000 FORWARD_PARTIAL&lt;br/&gt;&amp;gt;    0 FROMALT FORWARD_TARGET&lt;br/&gt;&amp;gt;    -- we forward at least 10k sats to output 0 (if there were 0 sats,&lt;br/&gt;&amp;gt;       the ordinal would end up in output 1 instead, which would be a&lt;br/&gt;&amp;gt;       bug), and output 0 pays to scriptPubKey &amp;#34;X&amp;#34;&lt;br/&gt;&amp;gt;    144&lt;br/&gt;&amp;gt;  ELSE .. ENDIF&lt;br/&gt;&amp;gt;    -- skip over the other branch&lt;br/&gt;&amp;gt;  CSV&lt;br/&gt;&amp;gt;    -- check that this input has baked for 144 blocks (~1 day)&lt;br/&gt;&amp;gt;  1ADD&lt;br/&gt;&amp;gt;    -- leave 145 on the stack, which is true. success!&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Alternatively, if you want to increase the bid you provide a stack with&lt;br/&gt;&amp;gt; two items: your scriptPubKey and the new bid [X&amp;#39; V&amp;#39;]. Execution this&lt;br/&gt;&amp;gt; time looks like:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;  [X] [V] [SSS] TOALT TOALT TOALT&lt;br/&gt;&amp;gt;    -- stack contains [X&amp;#39; V&amp;#39;], altstack now contains [SSS V X]&lt;br/&gt;&amp;gt;  0 PUSHCURRENTINPUTINDEX EQUALVERIFY&lt;br/&gt;&amp;gt;    -- this input is the first, so the ordinal will move to the first&lt;br/&gt;&amp;gt;       output&lt;br/&gt;&amp;gt;  DEPTH NOT IF ... ELSE&lt;br/&gt;&amp;gt;    -- skip over the other branch (without violating minimalif rules)&lt;br/&gt;&amp;gt;    FROMALT SWAP TUCK FROMALT&lt;br/&gt;&amp;gt;    -- stack contains [X&amp;#39; V&amp;#39; X V&amp;#39; V], altstack contains [SSS]&lt;br/&gt;&amp;gt;    [K] ADD GREATERTHANOREQUAL VERIFY&lt;br/&gt;&amp;gt;    -- check V&amp;#39; &amp;gt;= V&#43;K, stack contains [X&amp;#39; V&amp;#39; X]&lt;br/&gt;&amp;gt;    1 SWAP FORWARD_TARGET&lt;br/&gt;&amp;gt;    -- output 1 pays to X (previous bidder&amp;#39;s scriptPubKey), and the&lt;br/&gt;&amp;gt;       entire value of this input goes there; stack contains [X&amp;#39; V&amp;#39;]&lt;br/&gt;&amp;gt;    DUP FORWARD_PARTIAL&lt;br/&gt;&amp;gt;    -- execute &amp;#34;V&amp;#39; FORWARD_PARTIAL&amp;#34;, stack contains [X&amp;#39; V&amp;#39;]&lt;br/&gt;&amp;gt;    0 ROT ROT&lt;br/&gt;&amp;gt;    -- stack contains [0 X&amp;#39; V&amp;#39;]&lt;br/&gt;&amp;gt;    FROMALT DUP 3 SWAP FORWARD_LEAF_UPDATE&lt;br/&gt;&amp;gt;    -- execute &amp;#34;0 X&amp;#39; V&amp;#39; SSS 3 SSS FORWARD_LEAF_UPDATE&amp;#34; which checks&lt;br/&gt;&amp;gt;       that output 0 spends at least V&amp;#39; satoshis back to the same&lt;br/&gt;&amp;gt;       script (because that&amp;#39;s how we defined SSS), except the first&lt;br/&gt;&amp;gt;       three pushes (previously X V SSS) are replaced by X&amp;#39; V&amp;#39; SSS.&lt;br/&gt;&amp;gt;    0&lt;br/&gt;&amp;gt;  ENDIF&lt;br/&gt;&amp;gt;  CSV&lt;br/&gt;&amp;gt;    -- &amp;#34;0 CSV&amp;#34; requires nSequnce to be set, which makes the tx rbf&amp;#39;able,&lt;br/&gt;&amp;gt;       which hopefully makes it harder to pin&lt;br/&gt;&amp;gt;  1ADD&lt;br/&gt;&amp;gt;    -- ends with 1 on the stack; success!&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; (The &amp;#34;SSS n SSS FORWARD_LEAF_UPDATE&amp;#34; construct is more or less a quine,&lt;br/&gt;&amp;gt; ie a program that outputs its own source code)&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I think that script is about 211 witness bytes, with an additional 40&lt;br/&gt;&amp;gt; witness bytes for X&amp;#39;/V&amp;#39;, so when making a bid, your tx would be&lt;br/&gt;&amp;gt; something like:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;    tx header, 10vb&lt;br/&gt;&amp;gt;    input 0: 103vb for the old bid including witness and control block&lt;br/&gt;&amp;gt;    input 1: 58vb for a taproot key path spend&lt;br/&gt;&amp;gt;    output 0: 43vb for the new bid&lt;br/&gt;&amp;gt;    output 1: 43vb for your change&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; for a total of about 257vb -- slightly larger than a regular 2-in-2-out&lt;br/&gt;&amp;gt; transaction, but not terribly much. Mostly because input 0 doesn&amp;#39;t require&lt;br/&gt;&amp;gt; a signature -- it&amp;#39;s size is effectively 6 pubkeys: X, X&amp;#39; VENDOR twice,&lt;br/&gt;&amp;gt; and the script code twice, along with a little extra to encode the&lt;br/&gt;&amp;gt; various numbers (10000, 144, K, V, V&amp;#39;).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; This approach seems pretty &amp;#34;MEV&amp;#34; resistant: you pay fees via input 1 if&lt;br/&gt;&amp;gt; your bid succeeds; if it doesn&amp;#39;t, you don&amp;#39;t pay any fees. A potential&lt;br/&gt;&amp;gt; scalper might want to put in an early low ball bid, then prevent&lt;br/&gt;&amp;gt; higher bidders from winning the auction, take control of the ordinal,&lt;br/&gt;&amp;gt; and resell it later, but unless they can prevent another miner from&lt;br/&gt;&amp;gt; mining alternative bids for 144 blocks, they will fail at that. The bid&lt;br/&gt;&amp;gt; is fixed by the bidder and committed to by the signature on input 1, so&lt;br/&gt;&amp;gt; frontrunning a bid can&amp;#39;t do anything beyond invalidate the bid entirely.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Obviously, this is a pretty limited auction mechanism in various ways;&lt;br/&gt;&amp;gt; eg maybe you&amp;#39;d rather specify K as a percentage than an absoute increment;&lt;br/&gt;&amp;gt; maybe you&amp;#39;d like to have the auction definitely finish by some particular&lt;br/&gt;&amp;gt; time; maybe you&amp;#39;d like to be able to have the auction be able to continue&lt;br/&gt;&amp;gt; above 21.47 BTC (2**31 sats); maybe you&amp;#39;d like to do a dutch auction&lt;br/&gt;&amp;gt; rather than an english auction. I think you can probably do all those&lt;br/&gt;&amp;gt; things with this set of opcodes and clever scripting, though it probably&lt;br/&gt;&amp;gt; gets ugly.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I don&amp;#39;t think this is easily extensible to taro or rgb style assets,&lt;br/&gt;&amp;gt; as rather than being able to ensure the asset is transferred by&lt;br/&gt;&amp;gt; controlling the input/output positions, I think you&amp;#39;d need to build&lt;br/&gt;&amp;gt; up merkle trees and do point tweaks beyond what&amp;#39;s supported by&lt;br/&gt;&amp;gt; OP_FORWARD_LEAF_UPDATE/OP_VAULT. Of course, without something like&lt;br/&gt;&amp;gt; OP_PUSHCURRENTINPUTINDEX I don&amp;#39;t think you could do it for ordinals&lt;br/&gt;&amp;gt; either.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Cheers,&lt;br/&gt;&amp;gt; aj&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; [0]&lt;br/&gt;&amp;gt; &lt;a href=&#34;https://github.com/bitcoin/bips/blob/7f747fba82675f28c239df690a07b75529bd0960/bip-0345.mediawiki&#34;&gt;https://github.com/bitcoin/bips/blob/7f747fba82675f28c239df690a07b75529bd0960/bip-0345.mediawiki&lt;/a&gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; [1] &lt;a href=&#34;https://twitter.com/jamesob/status/1639019107432513537&#34;&gt;https://twitter.com/jamesob/status/1639019107432513537&lt;/a&gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; [2]&lt;br/&gt;&amp;gt; &lt;a href=&#34;https://cointelegraph.com/news/scammers-dream-yuga-s-auction-model-for-bitcoin-nfts-sees-criticism&#34;&gt;https://cointelegraph.com/news/scammers-dream-yuga-s-auction-model-for-bitcoin-nfts-sees-criticism&lt;/a&gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; [3] Inscriptions remain a wasteful way of publishing/committing&lt;br/&gt;&amp;gt;     to content, however!&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; [4]&lt;br/&gt;&amp;gt; &lt;a href=&#34;https://github.com/ElementsProject/elements/blob/master/doc/tapscript_opcodes.md&#34;&gt;https://github.com/ElementsProject/elements/blob/master/doc/tapscript_opcodes.md&lt;/a&gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; [5] Setting K too low probably invites griefing, where a bidder may be&lt;br/&gt;&amp;gt;     able to use rbf pinning vectors to prevent people who would be willing&lt;br/&gt;&amp;gt;     to bid substantially higher from getting their bid confirmed on&lt;br/&gt;&amp;gt;     chain.&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20230329/66e43c91/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20230329/66e43c91/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:20:03Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsrje3h0fs37kyw2fyj6xnxvlmal3et46nvd7yl97ks22rdwctqrtczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675k5gwshf</id>
    
      <title type="html">📅 Original date posted:2022-07-13 📝 Original message:&amp;gt; ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsrje3h0fs37kyw2fyj6xnxvlmal3et46nvd7yl97ks22rdwctqrtczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675k5gwshf" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs02z7ru55lxj8qfac84zyluw2tkha390gm7x4czfmkr832nuurnes4d5x5p&#39;&gt;nevent1q…5x5p&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2022-07-13&lt;br/&gt;📝 Original message:&amp;gt; your proof is incorrect (or, rather, relies on a highly unrealistic&lt;br/&gt;assumption)&lt;br/&gt;&lt;br/&gt;The assumption that coin are lost ar a constant rate is not required. Tail&lt;br/&gt;emission will asymptotically decrease the rate of inflation to zero, at&lt;br/&gt;which point the increase in coin exactly matches the amount of coin lost.&lt;br/&gt;The rate at which coin are lost is irrelevant.&lt;br/&gt;&lt;br/&gt;This is easy to see. Consider no coin are ever lost. The rate of inflation&lt;br/&gt;will slowly decline to zero as the amount of coin grows to infinity.&lt;br/&gt;However, lost coin ensures that the point at which the rate of inflation&lt;br/&gt;becomes zero will be reached sooner.&lt;br/&gt;&lt;br/&gt;If a black swan event destroys 90% of all coin, the constant tail emission&lt;br/&gt;will instantly begin to inflate the supply at a 10x higher percentage. The&lt;br/&gt;inflation expressed as a percentage will also immediately start to decline&lt;br/&gt;because each new coin will inflate the total supply with a slightly smaller&lt;br/&gt;percentage than the previous new coin. The rate of inflation will continue&lt;br/&gt;to decline until zero, at which point it again matches the coin-loss&lt;br/&gt;induced deflation rate.&lt;br/&gt;&lt;br/&gt;Another scenario. Suppose that the number of coin lost becomes&lt;br/&gt;significantly less for instance because better wallets and a more mature&lt;br/&gt;ecosystem prevent many common coin loss events. A constant issuance of new&lt;br/&gt;coin would increase the total supply, but each new coin would add less to&lt;br/&gt;the total supply when expressed as a percentage. The rate of inflation&lt;br/&gt;would decline to zero, at which point it again has matched the rate of&lt;br/&gt;deflation due to coin loss.&lt;br/&gt;&lt;br/&gt;Even when the rate at which coin are lost will not be constant, a tail&lt;br/&gt;emission will tend to an equilibrium.&lt;br/&gt;&lt;br/&gt;It must be observed that tail emission causes the total *potential* supply&lt;br/&gt;to vary greatly depending on the deflation rate. In a low-deflation&lt;br/&gt;scenario, the supply will have to grow much larger before an equilibrium&lt;br/&gt;can be reached than in a scenario with moderate deflation rate. Not being&lt;br/&gt;able to predict the ultimate total supply of coin is however seems&lt;br/&gt;undesirable. But is it really?&lt;br/&gt;&lt;br/&gt;The rate of inflation required for keeping Bitcoin useful highly depends on&lt;br/&gt;the value of the token. At US$100k, a tail emission of 1 BTC per block&lt;br/&gt;ensures safety within a few blocks for even large amounts. Continuing this&lt;br/&gt;example, 1 BTC per block would mean 5.25m extra coin per 100 years. At 21m&lt;br/&gt;coins and 1 BTC perpetual reward per block, the rate of inflation would be&lt;br/&gt;0.25% per year.&lt;br/&gt;&lt;br/&gt;This should put things a bit into perspective.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Tue, 12 Jul 2022 at 01:58, Anthony Towns via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; On Mon, Jul 11, 2022 at 08:56:04AM -0400, Erik Aronesty via bitcoin-dev&lt;br/&gt;&amp;gt; wrote:&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; Alternatively, losses could be at a predictable rate that&amp;#39;s entirely&lt;br/&gt;&amp;gt; &amp;gt; &amp;gt; different to the one Peter assumes.&lt;br/&gt;&amp;gt; &amp;gt; No, peter only assumes that there *is* a rate.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; No, he assumes it&amp;#39;s a constant rate. His integration step gives a&lt;br/&gt;&amp;gt; different result if lambda changes with t:&lt;br/&gt;&amp;gt; &lt;a href=&#34;https://www.wolframalpha.com/input?i=dN%2Fdt&#43;%3D&#43;k&#43;-&#43;lambda%28t%29*N&#34;&gt;https://www.wolframalpha.com/input?i=dN%2Fdt&#43;%3D&#43;k&#43;-&#43;lambda%28t%29*N&lt;/a&gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; On Mon, Jul 11, 2022 at 12:59:53PM -0400, Peter Todd via bitcoin-dev wrote:&lt;br/&gt;&amp;gt; &amp;gt; Give me an example of an *actual* inflation rate you expect to see,&lt;br/&gt;&amp;gt; given a&lt;br/&gt;&amp;gt; &amp;gt; disaster of a given magnitude.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; All I was doing was saying your proof is incorrect (or, rather, relies&lt;br/&gt;&amp;gt; on a highly unrealistic assumption), since I hadn&amp;#39;t seen anybody else&lt;br/&gt;&amp;gt; point that out already.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; But even if the proof were correct, I don&amp;#39;t think it provides a useful&lt;br/&gt;&amp;gt; mechanism (since there&amp;#39;s no reason to think miners gaining all the coins&lt;br/&gt;&amp;gt; lost in a year will be sufficient for anything), and I don&amp;#39;t really&lt;br/&gt;&amp;gt; think the &amp;#34;security budget&amp;#34; framework (ie, that the percentage of total&lt;br/&gt;&amp;gt; supply given to miners each year is what&amp;#39;s important for security)&lt;br/&gt;&amp;gt; you&amp;#39;re implicitly relying on is particularly meaningful.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; So no, not particularly interested in diving into it any deeper.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Cheers,&lt;br/&gt;&amp;gt; aj&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20220713/37d7c521/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20220713/37d7c521/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:11:37Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsqkwa2sg6zv55yw44hl650yyptgy2yf89ytj36ltrndq0gc90asugzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675krtj5kr</id>
    
      <title type="html">📅 Original date posted:2022-07-09 📝 Original ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsqkwa2sg6zv55yw44hl650yyptgy2yf89ytj36ltrndq0gc90asugzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675krtj5kr" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsxl9u7xq670zfgfgrre5fz924tle422ljdqduxkwkjan3kz9updecn5w3wy&#39;&gt;nevent1q…w3wy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2022-07-09&lt;br/&gt;📝 Original message:Sorting a seed alphabetically reduces entropy by ~29 bits.&lt;br/&gt;&lt;br/&gt;A 12-word seed has (12, 12) permutations or 479 million, which is ln(469m)&lt;br/&gt;/ ln(2) ~= 29 bits of entropy. Sorting removes this entropy entirely,&lt;br/&gt;reducing the seed entropy from 128 to 99 bits.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Fri, 8 Jul 2022 at 16:09, James MacWhyte via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; What do you do if the &amp;#34;first&amp;#34; word (of 12), happens to be the last word in&lt;br/&gt;&amp;gt;&amp;gt; the list alphabetically?&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; That couldn&amp;#39;t happen. If one word is the very last from the wordlist, it&lt;br/&gt;&amp;gt; would end up at the end of your mnemonic once you rearrange your 12 words&lt;br/&gt;&amp;gt; alphabetically.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; However!&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; (@vjudeu) Choosing 11 random words and then sorting them alphabetically&lt;br/&gt;&amp;gt; before assigning a checksum would reduce entropy considerably. If you think&lt;br/&gt;&amp;gt; about it, to bruteforce the entire keyspace one would only need to come up&lt;br/&gt;&amp;gt; with every possible combination of 11 words &#43; 1 checksum. I&amp;#39;m not the best&lt;br/&gt;&amp;gt; at napkin math, but I think that leaves you with around 10 trillion&lt;br/&gt;&amp;gt; combinations, which would only take a couple months to exhaust with&lt;br/&gt;&amp;gt; hardware that can do 1 million guesses per second.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; James&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20220709/fade4b82/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20220709/fade4b82/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:11:17Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsxmyw0zeh9mq46kekyfsnevzk2lgcy4e8xewhuez9nqd7yn22h35czypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kklns23</id>
    
      <title type="html">📅 Original date posted:2022-04-25 📝 Original message:On ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsxmyw0zeh9mq46kekyfsnevzk2lgcy4e8xewhuez9nqd7yn22h35czypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kklns23" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs23shp6cg6ys2l4y8kt85vmpkh4cn9jwxvzw032e6r8d0d47szr6cq29r2s&#39;&gt;nevent1q…9r2s&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2022-04-25&lt;br/&gt;📝 Original message:On Mon, 25 Apr 2022 at 07:36, ZmnSCPxj &amp;lt;ZmnSCPxj at protonmail.com&amp;gt; wrote&lt;br/&gt;&lt;br/&gt;CTV *can* benefit layer 2 users, which is why I switched from vaguely&lt;br/&gt;&amp;gt; apathetic to CTV, to vaguely supportive of it.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Other proposals exist that also benefit L2 solutions. What makes you&lt;br/&gt;support CTV specifically?&lt;br/&gt;&lt;br/&gt;Centrally documenting the implications of each side by side and point by&lt;br/&gt;point might be a useful next step. This would enable a larger part of the&lt;br/&gt;community to understand each proposal and may reduce repetition and&lt;br/&gt;misunderstandings on this list.&lt;br/&gt;&lt;br/&gt;Once a common understanding of the implications of each proposal is in&lt;br/&gt;place, their tradeoffs can be considered, facilitating creating consensus&lt;br/&gt;on which proposal benefits a maximum of users.&lt;br/&gt;&lt;br/&gt;Zac&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/20220425/8855a181/attachment-0001.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20220425/8855a181/attachment-0001.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:07:52Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqszdsmsz7lc09whurl5dk3ncxqm74u3r9xm7qnp738s9755q08v5nczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675k6yf2g7</id>
    
      <title type="html">📅 Original date posted:2022-04-22 📝 Original message:On ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqszdsmsz7lc09whurl5dk3ncxqm74u3r9xm7qnp738s9755q08v5nczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675k6yf2g7" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8qs6n40syz8hnft2zydqq8g57g3wvfmuuxa8z2k258ulstr2eqjqzrnszn&#39;&gt;nevent1q…nszn&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2022-04-22&lt;br/&gt;📝 Original message:On Fri, 22 Apr 2022 at 09:56, Keagan McClelland via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; I think that trying to find ways to activate non-invasive changes should&lt;br/&gt;&amp;gt; be everyone&amp;#39;s goal, *even if* they personally may not have an immediate use&lt;br/&gt;&amp;gt; case&lt;br/&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;A change that increases the number of use cases of Bitcoin affects all&lt;br/&gt;users and is *not* non-invasive. More use cases means more blockchain usage&lt;br/&gt;which increases the price of a transaction for *everyone*.&lt;br/&gt;&lt;br/&gt;I like the maxim of Peter Todd: any change of Bitcoin must benefit *all*&lt;br/&gt;users. This means that every change must have well-defined and transparent&lt;br/&gt;benefits. Personally I believe that the only additions to the protocol that&lt;br/&gt;would still be acceptable are those that clearly benefit layer 2 solutions&lt;br/&gt;such as LN *and* do not carry the dangerous potential of getting abused by&lt;br/&gt;freeloaders selling commercial services on top of “free” eternal storage on&lt;br/&gt;the blockchain.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&amp;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/20220422/0fd0ef11/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20220422/0fd0ef11/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:07:50Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqswe3ve80jqc2uud5pv6w8cwcwrtddpzsng39epf520820a7vxjepqzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kznf6pg</id>
    
      <title type="html">📅 Original date posted:2022-04-21 📝 Original message:On ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqswe3ve80jqc2uud5pv6w8cwcwrtddpzsng39epf520820a7vxjepqzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kznf6pg" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsd5psuuhq9zy0mhq78va8j49n9xs09hzg4mt9edq57svyt9n8435cqhq3a2&#39;&gt;nevent1q…q3a2&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2022-04-21&lt;br/&gt;📝 Original message:On Wed, 20 Apr 2022 at 15:49, Michael Folkson via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;Assuming 90 percent of miners don&amp;#39;t signal for it in one of the Speedy&lt;br/&gt;&amp;gt; Trial windows then the activation attempt will have failed and it will be&lt;br/&gt;&amp;gt; back in Jeremy&amp;#39;s court whether he tries again with a different activation&lt;br/&gt;&amp;gt; attempt.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Assuming 90 percent of miners do signal for it (unlikely in my opinion but&lt;br/&gt;&amp;gt; presumably still a possibility) then the CTV soft fork could activate&lt;br/&gt;&amp;gt; unless full nodes resist it.&lt;br/&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;This is wrong. Miners do not have the mandate to decide the faith of&lt;br/&gt;softforks. The MO of softforks is that once a softfork has been merged, it&lt;br/&gt;already has consensus and must be activated by miners eventually. The&lt;br/&gt;various activation methods exist to ensure miners cannot sabotage a&lt;br/&gt;softfork that has consensus.&lt;br/&gt;&lt;br/&gt;The way you phrase it, makes it sound like miners have any say over&lt;br/&gt;softforks. This is not the case.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&amp;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/20220421/c3b767ba/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20220421/c3b767ba/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:07:21Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqstprmqcah75k42nv6c5mykj80k58cypu36c0c7mmrfkrujc9vp0ygzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kx5c9tf</id>
    
      <title type="html">📅 Original date posted:2022-02-25 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqstprmqcah75k42nv6c5mykj80k58cypu36c0c7mmrfkrujc9vp0ygzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kx5c9tf" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszdfr849099pwrq6mtauepcvmp6e5p9tfwxvfr7ljujxawt7ytcksva8kre&#39;&gt;nevent1q…8kre&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2022-02-25&lt;br/&gt;📝 Original message:Hi ZmnSCPxj,&lt;br/&gt;&lt;br/&gt;To me it seems that more space can be saved.&lt;br/&gt;&lt;br/&gt;The data-“transaction” need not specify any output. The network could&lt;br/&gt;subtract the fee amount of the transaction directly from the specified&lt;br/&gt;UTXO. A fee also need not to be specified. It can be calculated in advance&lt;br/&gt;both by the network and the transaction sender based on the size of the&lt;br/&gt;data.&lt;br/&gt;&lt;br/&gt;The calculation of the fee should be such that it only marginally cheaper&lt;br/&gt;to use this new construct over using one or more transactions. For&lt;br/&gt;instance, sending 81 bytes should cost as much as two OP_RETURN&lt;br/&gt;transactions (minus some marginal discount to incentivize the use of this&lt;br/&gt;more efficient way to store data).&lt;br/&gt;&lt;br/&gt;If the balance of the selected UTXO is insufficient to pay for the data&lt;br/&gt;then the transaction will be invalid.&lt;br/&gt;&lt;br/&gt;I can’t judge whether this particular approach would require a hardfork,&lt;br/&gt;sadly.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Fri, 25 Feb 2022 at 04:19, ZmnSCPxj &amp;lt;ZmnSCPxj at protonmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Good morning Zac,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Hi ZmnSCPxj,&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Any benefits of my proposal depend on my presumption that using a&lt;br/&gt;&amp;gt; standard transaction for storing data must be inefficient. Presumably a&lt;br/&gt;&amp;gt; transaction takes up significantly more on-chain space than the data it&lt;br/&gt;&amp;gt; carries within its OP_RETURN. Therefore, not requiring a standard&lt;br/&gt;&amp;gt; transaction for data storage should be more efficient. Facilitating data&lt;br/&gt;&amp;gt; storage within some specialized, more space-efficient data structure at&lt;br/&gt;&amp;gt; marginally lower fee per payload-byte should enable reducing the footprint&lt;br/&gt;&amp;gt; of storing data on-chain.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; In case storing data through OP_RETURN embedded within a transaction is&lt;br/&gt;&amp;gt; optimal in terms of on-chain footprint then my proposal doesn’t seem useful.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; You need to have some assurance that, if you pay a fee, this data gets on&lt;br/&gt;&amp;gt; the blockchain.&lt;br/&gt;&amp;gt; And you also need to pay a fee for the blockchain space.&lt;br/&gt;&amp;gt; In order to do that, you need to indicate an existing UTXO, and of course&lt;br/&gt;&amp;gt; you have to provably authorize the spend of that UTXO.&lt;br/&gt;&amp;gt; But that is already an existing transaction structure, the transaction&lt;br/&gt;&amp;gt; input.&lt;br/&gt;&amp;gt; If you are not going to pay an entire UTXO for it, you need a transaction&lt;br/&gt;&amp;gt; output as well to store the change.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Your signature needs to cover the data being published, and it is more&lt;br/&gt;&amp;gt; efficient to have a single signature that covers the transaction input, the&lt;br/&gt;&amp;gt; transaction output, and the data being published.&lt;br/&gt;&amp;gt; We already have a structure for that, the transaction.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; So an `OP_RETURN` transaction output is added and you put published data&lt;br/&gt;&amp;gt; there, and existing constructions make everything Just Work (TM).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Now I admit we can shave off some bytes.&lt;br/&gt;&amp;gt; Pure published data does not need an amount, and using a transaction&lt;br/&gt;&amp;gt; output means there is always an amount field.&lt;br/&gt;&amp;gt; We do not want the `OP_RETURN` opcode itself, though if the data is&lt;br/&gt;&amp;gt; variable-size we do need an equivalent to the `OP_PUSH` opcode (which has&lt;br/&gt;&amp;gt; many variants depending on the size of the data).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; But that is not really a lot of bytes, and adding a separate field to the&lt;br/&gt;&amp;gt; transaction would require a hardfork.&lt;br/&gt;&amp;gt; We cannot use the SegWit technique of just adding a new field that is not&lt;br/&gt;&amp;gt; serialized for `txid` and `wtxid` calculations, but is committed in a new&lt;br/&gt;&amp;gt; id, let us call it `dtxid`, and a new Merkle Tree added to the coinbase.&lt;br/&gt;&amp;gt; If we *could*, then a separate field for data publication would be&lt;br/&gt;&amp;gt; softforkable, but the technique does not apply here.&lt;br/&gt;&amp;gt; The reason we cannot use that technique is that we want to save bytes by&lt;br/&gt;&amp;gt; having the signature cover the data to be published, and signatures need to&lt;br/&gt;&amp;gt; be validated by pre-softfork nodes looking at just the data committed to in&lt;br/&gt;&amp;gt; `wtxid`.&lt;br/&gt;&amp;gt; If you have a separate signature that is in the `dtxid`, then you spend&lt;br/&gt;&amp;gt; more actual bytes to save a few bytes.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Saving a few bytes for an application that is arguably not the &amp;#34;job&amp;#34; of&lt;br/&gt;&amp;gt; Bitcoin (Bitcoin is supposed to be for value transfer, not data archiving)&lt;br/&gt;&amp;gt; is not enough to justify a **hard**fork.&lt;br/&gt;&amp;gt; And any softfork seems likely to spend more bytes than what it could save.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Regards,&lt;br/&gt;&amp;gt; ZmnSCPxj&lt;br/&gt;&amp;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/20220225/f0f711c1/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20220225/f0f711c1/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:04:54Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsgt3gadkej0wkh0ks6ue6gh7s5244y0ue4mhuu4qel3k88sd6cd4czypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675k0ff5qv</id>
    
      <title type="html">📅 Original date posted:2022-02-25 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsgt3gadkej0wkh0ks6ue6gh7s5244y0ue4mhuu4qel3k88sd6cd4czypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675k0ff5qv" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsxgde2nqadfnayrhxk4y0vqncutnqppnrnylwd8x0rz0w2ltvuwgcs2n7e9&#39;&gt;nevent1q…n7e9&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2022-02-25&lt;br/&gt;📝 Original message:Hi ZmnSCPxj,&lt;br/&gt;&lt;br/&gt;&amp;gt; Either you consume the entire UTXO (take away the &amp;#34;U&amp;#34; from the &amp;#34;UTXO&amp;#34;)&lt;br/&gt;completely and in full, or you do not touch the UTXO&lt;br/&gt;&lt;br/&gt;Ok, so enabling spending a UTXO partly would be a significant departure&lt;br/&gt;from the systems’ design philosophy.&lt;br/&gt;&lt;br/&gt;I have been unclear about the fee part. In my proposal there’s only one&lt;br/&gt;input and zero outputs, so normally there would be no way to set any fee.&lt;br/&gt;One could add a fee field although that would be slightly wasteful — it may&lt;br/&gt;be sufficient to just specify the fee *rate*, for instance 0-255&lt;br/&gt;sat/payload_byte, requiring only one byte for the fee. The calculation of&lt;br/&gt;the actual fee can be performed by both the network and the sender. The fee&lt;br/&gt;equals payload_size*feerate &#43;&lt;br/&gt;an-amount-calculated-by-preset-rules-such-that-it-raises-the-cost-of-the-transaction-to-only-marginally-less-than-what-it&lt;br/&gt;would-have-cost-to-store-the-same-amount-of-data-using-one-or-more-OP_RETURN-transactions.&lt;br/&gt;&lt;br/&gt;However explicitly specifying the fee amount is probably preferable for the&lt;br/&gt;sake of transparency.&lt;br/&gt;&lt;br/&gt;I wonder if this proposal could technically work. I fully recognize though&lt;br/&gt;that even if it would, it has close to zero chances becoming reality as it&lt;br/&gt;breaks the core design based on *U*TXOs (and likely also a lot of existing&lt;br/&gt;software) — thank you for pointing that out and for your helpful feedback.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Fri, 25 Feb 2022 at 13:48, ZmnSCPxj &amp;lt;ZmnSCPxj at protonmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Good morning Zac,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Hi ZmnSCPxj,&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; To me it seems that more space can be saved.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; The data-“transaction” need not specify any output. The network could&lt;br/&gt;&amp;gt; subtract the fee amount of the transaction directly from the specified UTXO.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; That is not how UTXO systems like Bitcoin work.&lt;br/&gt;&amp;gt; Either you consume the entire UTXO (take away the &amp;#34;U&amp;#34; from the &amp;#34;UTXO&amp;#34;)&lt;br/&gt;&amp;gt; completely and in full, or you do not touch the UTXO (and cannot get fees&lt;br/&gt;&amp;gt; from it).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; A fee also need not to be specified.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Fees are never explicit in Bitcoin; it is always the difference between&lt;br/&gt;&amp;gt; total input amount minus the total output amount.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; It can be calculated in advance both by the network and the transaction&lt;br/&gt;&amp;gt; sender based on the size of the data.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; It is already implicitly calculated by the difference between the total&lt;br/&gt;&amp;gt; input amount minus the total output amount.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; You seem to misunderstand as well.&lt;br/&gt;&amp;gt; Fee rate is computed from the fee (computed from total input minus total&lt;br/&gt;&amp;gt; output) divided by the transaction weight.&lt;br/&gt;&amp;gt; Nodes do not compute fees from feerate and weight.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; The calculation of the fee should be such that it only marginally&lt;br/&gt;&amp;gt; cheaper to use this new construct over using one or more transactions. For&lt;br/&gt;&amp;gt; instance, sending 81 bytes should cost as much as two OP_RETURN&lt;br/&gt;&amp;gt; transactions (minus some marginal discount to incentivize the use of this&lt;br/&gt;&amp;gt; more efficient way to store data).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Do you want to change weight calculations?&lt;br/&gt;&amp;gt; *reducing* weight calculations is a hardfork, increasing it is a softfork.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; If the balance of the selected UTXO is insufficient to pay for the data&lt;br/&gt;&amp;gt; then the transaction will be invalid.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; I can’t judge whether this particular approach would require a hardfork,&lt;br/&gt;&amp;gt; sadly.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; See above note, if you want to somehow reduce the weight of the data so as&lt;br/&gt;&amp;gt; to reduce the cost of data relative to `OP_RETURN`, that is a hardfork.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Regards,&lt;br/&gt;&amp;gt; ZmnSCPxj&lt;br/&gt;&amp;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/20220225/f60e1849/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20220225/f60e1849/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:04:54Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqszf26gsfw2vx3wr8e43rld2fc07j0d472j3kf4va8zu76wwgz7nfszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kyn388k</id>
    
      <title type="html">📅 Original date posted:2022-02-24 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqszf26gsfw2vx3wr8e43rld2fc07j0d472j3kf4va8zu76wwgz7nfszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kyn388k" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvcu45x6se9xeamgd4n92052ahhn2522txtzm47znnextkem6etug7pzs3k&#39;&gt;nevent1q…zs3k&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2022-02-24&lt;br/&gt;📝 Original message:Hi ZmnSCPxj,&lt;br/&gt;&lt;br/&gt;Any benefits of my proposal depend on my presumption that using a standard&lt;br/&gt;transaction for storing data must be inefficient. Presumably a transaction&lt;br/&gt;takes up significantly more on-chain space than the data it carries within&lt;br/&gt;its OP_RETURN. Therefore, not requiring a standard transaction for data&lt;br/&gt;storage should be more efficient. Facilitating data storage within some&lt;br/&gt;specialized, more space-efficient data structure at marginally lower fee&lt;br/&gt;per payload-byte should enable reducing the footprint of storing data&lt;br/&gt;on-chain.&lt;br/&gt;&lt;br/&gt;In case storing data through OP_RETURN embedded within a transaction is&lt;br/&gt;optimal in terms of on-chain footprint then my proposal doesn’t seem useful.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;On Fri, 25 Feb 2022 at 01:05, ZmnSCPxj &amp;lt;ZmnSCPxj at protonmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Good morning Zac,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Reducing the footprint of storing data on-chain might better be achieved&lt;br/&gt;&amp;gt; by *supporting* it.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Currently storing data is wasteful because it is embedded inside an&lt;br/&gt;&amp;gt; OP_RETURN within a transaction structure. As an alternative, by supporting&lt;br/&gt;&amp;gt; storing of raw data without creating a transaction, waste can be reduced.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; If the data is not embedded inside a transaction, how would I be able to&lt;br/&gt;&amp;gt; pay a miner to include the data on the blockchain?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I need a transaction in order to pay a miner anyway, so why not just embed&lt;br/&gt;&amp;gt; it into the same transaction I am using to pay the miner?&lt;br/&gt;&amp;gt; (i.e. the current design)&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Regards,&lt;br/&gt;&amp;gt; ZmnSCPxj&lt;br/&gt;&amp;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/20220225/6ee277d1/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20220225/6ee277d1/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:04:53Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsps3z3hqefd3phg2zr6ma35wg5q8lkehwp9xhlxl53vakwz78424gzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kmj4xdm</id>
    
      <title type="html">📅 Original date posted:2022-02-24 📝 Original ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsps3z3hqefd3phg2zr6ma35wg5q8lkehwp9xhlxl53vakwz78424gzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kmj4xdm" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvc6p7953sxhp5x0xlxxnrtsclvdhxpafh6hn94ard98am9rw5alghp2h9c&#39;&gt;nevent1q…2h9c&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2022-02-24&lt;br/&gt;📝 Original message:Reducing the footprint of storing data on-chain might better be achieved by&lt;br/&gt;*supporting* it.&lt;br/&gt;&lt;br/&gt;Currently storing data is wasteful because it is embedded inside an&lt;br/&gt;OP_RETURN within a transaction structure. As an alternative, by supporting&lt;br/&gt;storing of raw data without creating a transaction, waste can be reduced.&lt;br/&gt;&lt;br/&gt;Storing data in this way must only be marginally cheaper per on-chain byte&lt;br/&gt;than the current method  using OP_RETURN by applying the appropriate&lt;br/&gt;weight-per-byte for on-chain data.&lt;br/&gt;&lt;br/&gt;The intended result is a smaller footprint for on-chain data without making&lt;br/&gt;it cheaper (except marginally in order to disincentivize the use of&lt;br/&gt;OP_RETURN).&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Thu, 24 Feb 2022 at 10:19, vjudeu via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Since Taproot was activated, we no longer need separate OP_RETURN outputs&lt;br/&gt;&amp;gt; to be pushed on-chain. If we want to attach any data to a transaction, we&lt;br/&gt;&amp;gt; can create &amp;#34;OP_RETURN &amp;lt;anything&amp;gt;&amp;#34; as a branch in the TapScript. In this&lt;br/&gt;&amp;gt; way, we can store that data off-chain and we can always prove that they are&lt;br/&gt;&amp;gt; connected with some taproot address, that was pushed on-chain. Also, we can&lt;br/&gt;&amp;gt; store more than 80 bytes for &amp;#34;free&amp;#34;, because no such taproot branch will be&lt;br/&gt;&amp;gt; ever pushed on-chain and used as an input. That means we can use &amp;#34;OP_RETURN&lt;br/&gt;&amp;gt; &amp;lt;1.5 GB of data&amp;gt;&amp;#34;, create some address having that taproot branch, and&lt;br/&gt;&amp;gt; later prove to anyone that such &amp;#34;1.5 GB of data&amp;#34; is connected with our&lt;br/&gt;&amp;gt; taproot address.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Currently in Bitcoin Core we have &amp;#34;data&amp;#34; field in &amp;#34;createrawtransaction&amp;#34;.&lt;br/&gt;&amp;gt; Should the implementation be changed to place that data in a TapScript&lt;br/&gt;&amp;gt; instead of creating separate OP_RETURN output? What do you think?&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20220224/da19f3fb/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20220224/da19f3fb/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:04:53Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqs0wfqnptaykezxlejms4l3tmq0r09haghcrl5hp38jx8ndajzvkxszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675k6tl8m4</id>
    
      <title type="html">📅 Original date posted:2022-01-21 📝 Original message:The ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqs0wfqnptaykezxlejms4l3tmq0r09haghcrl5hp38jx8ndajzvkxszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675k6tl8m4" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs9h0sa6f5xde9xvtsd9snvll9lmdjxsvjke93zexnlygxc80xzgdgqhcwn0&#39;&gt;nevent1q…cwn0&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2022-01-21&lt;br/&gt;📝 Original message:The name of the fund should ideally unambiguously clarify its scope, i.e.,&lt;br/&gt;Bitcoin &amp;amp; development. So maybe “Bitcoin Developers Community LDF”. Or&lt;br/&gt;perhaps “Bitcoin Technical Community LDF” which nicely abbreviates to&lt;br/&gt;BTCLDF.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Thu, 13 Jan 2022 at 19:49, jack via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Hi Prayank,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; On 13 Jan 2022, at 10:13, Prayank &amp;lt;prayank at tutanota.de&amp;gt; wrote:&lt;br/&gt;&amp;gt; &amp;gt; I had few suggestions and feel free to ignore them if they do not make&lt;br/&gt;&amp;gt; sense:&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; 1.Name of this fund could be anything and &amp;#39;The Bitcoin Legal Defense&lt;br/&gt;&amp;gt; Fund&amp;#39; can be confusing or misleading for newbies. There is nothing official&lt;br/&gt;&amp;gt; in Bitcoin however people believe things written in news articles and some&lt;br/&gt;&amp;gt; of them might consider it as an official bitcoin legal fund.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Excellent point. Will come up with a better name.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Open to ideas and suggestions on all.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; jack&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20220121/c16855a6/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20220121/c16855a6/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T23:02:13Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqs8dsxhymqwhyalr5edlrf9y44xzwmr0py0myffgl4uexu5gznlweczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675klnqzr2</id>
    
      <title type="html">📅 Original date posted:2021-09-01 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqs8dsxhymqwhyalr5edlrf9y44xzwmr0py0myffgl4uexu5gznlweczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675klnqzr2" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0tldxkjzcntkrakmyrcxzu9345aprgky6gkjqxnwtxsz4q6lqzts3reghu&#39;&gt;nevent1q…eghu&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-09-01&lt;br/&gt;📝 Original message:Hi ZmnSCPxj,&lt;br/&gt;&lt;br/&gt;The rate-limiting algorithm would be relatively straightforward. I&lt;br/&gt;documented the rate-limiting part of the algorithm below, perhaps they can&lt;br/&gt;evoke new ideas of how to make this MAST-able or otherwise implement this&lt;br/&gt;in a privacy preserving way.&lt;br/&gt;&lt;br/&gt;Something like the following:&lt;br/&gt;&lt;br/&gt;=&amp;gt; Create an output at block height [h0] with the following properties:&lt;br/&gt;&lt;br/&gt;Serving as input at any block height, the maximum amount is limited to&lt;br/&gt;[limit] sats;  // This rule introduces [limit] and is permanent and always&lt;br/&gt;copied over to a change output&lt;br/&gt;Serving as input at a block height &amp;lt; [h0 &#43; window], the maximum amount is&lt;br/&gt;limited to [limit - 0] sats;  // [limit - 0] to emphasize that nothing was&lt;br/&gt;spent yet and no window has started.&lt;br/&gt;&lt;br/&gt;=&amp;gt; A transaction occurs at block height [h1], spending [h1_spent].&lt;br/&gt;The payment output created at [h1] is not encumbered and of value&lt;br/&gt;[h1_spent]; // Note, this is the first encumbered transaction so [h1] is&lt;br/&gt;the first block of the first window&lt;br/&gt;&lt;br/&gt;The change output created at block height [h1] must be encumbered as&lt;br/&gt;follows:&lt;br/&gt;Serving as input at any block height, the maximum amount is limited to&lt;br/&gt;[limit] sats;  // Permanent rule repeats&lt;br/&gt;Serving as input at a block height &amp;lt; [h1 &#43; window], the maximum amount is&lt;br/&gt;limited to [limit - h1_spent]  // Second permanent rule reduces spendable&lt;br/&gt;amount until height [h1 &#43; window] by [h1_spent]&lt;br/&gt;&lt;br/&gt;=&amp;gt; A second transaction occurs at block height [h2], spending [h2_spent].&lt;br/&gt;The payment output created at [h2] is not encumbered and of value&lt;br/&gt;[h2_spent]; // Second transaction, so a second window starts at [h2]&lt;br/&gt;&lt;br/&gt;The change output created at block height [h2] must be encumbered as&lt;br/&gt;follows:&lt;br/&gt;Serving as input at any block height, the maximum amount is limited to&lt;br/&gt;[limit] sats;  // Permanent rule repeats&lt;br/&gt;Serving as input at a block height &amp;lt; [h1 &#43; window], the max amount is&lt;br/&gt;limited to [limit - h1_spent - h2_spent] // Reduce spendable amount between&lt;br/&gt;[h1] and [h1 &#43; window] by an additional [h2_spent]&lt;br/&gt;Serving as input in range [h1 &#43; window] &amp;lt;= block height &amp;lt; [h2 &#43; window],&lt;br/&gt;the max amount is limited to [limit - h2_spent]  // First payment no longer&lt;br/&gt;inside this window so [h1_spent] no longer subtracted&lt;br/&gt;&lt;br/&gt;... and so on. A rule that pertains to a block height &amp;lt; the current block&lt;br/&gt;height can be abandoned, keeping the number of rules equal to the number of&lt;br/&gt;transactions that exist within the oldest still active window.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Tue, Aug 31, 2021 at 4:22 PM ZmnSCPxj &amp;lt;ZmnSCPxj at protonmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Good morning Zac,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Hi ZmnSCPxj,&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Thank you for your helpful response. We&amp;#39;re on the same page concerning&lt;br/&gt;&amp;gt; privacy so I&amp;#39;ll focus on that. I understand from your mail that privacy&lt;br/&gt;&amp;gt; would be reduced by this proposal because:&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; * It requires the introduction of a new type of transaction that is&lt;br/&gt;&amp;gt; different from a &amp;#34;standard&amp;#34; transaction (would that be P2TR in the&lt;br/&gt;&amp;gt; future?), reducing the anonymity set for everyone;&lt;br/&gt;&amp;gt; &amp;gt; * The payment and change output will be identifiable because the change&lt;br/&gt;&amp;gt; output must be marked encumbered on-chain;&lt;br/&gt;&amp;gt; &amp;gt; * The specifics of how the output is encumbered must be visible on-chain&lt;br/&gt;&amp;gt; as well reducing privacy even further.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; I don&amp;#39;t have the technical skills to judge whether these issues can&lt;br/&gt;&amp;gt; somehow be resolved. In functional terms, the output should be spendable in&lt;br/&gt;&amp;gt; a way that does not reveal that the output is encumbered, and produce a&lt;br/&gt;&amp;gt; change output that cannot be distinguished from a non-change output while&lt;br/&gt;&amp;gt; still being encumbered. Perhaps some clever MAST-fu could somehow help?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I believe some of the covenant efforts may indeed have such clever MAST-fu&lt;br/&gt;&amp;gt; integrated into them, which is why I pointed you to them --- the people&lt;br/&gt;&amp;gt; developing these (aj I think? RubenSomsen?) might be able to accommodate&lt;br/&gt;&amp;gt; this or some subset of the desired feature in a sufficiently clever&lt;br/&gt;&amp;gt; covenant scheme.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; There are a number of such proposals, though, so I cannot really point you&lt;br/&gt;&amp;gt; to one that seems likely to have a lot of traction.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Regards,&lt;br/&gt;&amp;gt; ZmnSCPxj&lt;br/&gt;&amp;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/20210901/cf80c2eb/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210901/cf80c2eb/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:58:26Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsg8tlzpfmpapn658fc4mr7z9mpy22fa3ecfdkzsdlek9jkzuucmzczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kyzy9gt</id>
    
      <title type="html">📅 Original date posted:2021-08-30 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsg8tlzpfmpapn658fc4mr7z9mpy22fa3ecfdkzsdlek9jkzuucmzczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kyzy9gt" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsdhszuyzuxzrwzpzys337jm8qpvyhz29p58y2y3pm4d3lv2lg8qfqhd7gjs&#39;&gt;nevent1q…7gjs&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-08-30&lt;br/&gt;📝 Original message:Hi ZmnSCPxj,&lt;br/&gt;&lt;br/&gt;&amp;gt; I suggest looking into the covenant opcodes and supporting those instead&lt;br/&gt;of your own proposal, as your application is very close to one of the&lt;br/&gt;motivating examples for covenants in the first place.&lt;br/&gt;&lt;br/&gt;I believe it is not the right approach to take a proposal, chop off key&lt;br/&gt;aspects of its functionality, and rely to some future change in Bitcoin&lt;br/&gt;that may perhaps enable implementing some watered down version of the&lt;br/&gt;intended functionality. In my opinion the right order would be to first&lt;br/&gt;discuss the unmodified proposal on a functional level and gauge community&lt;br/&gt;interest, then move forward to discuss technical challenges for the&lt;br/&gt;*unmodified* proposal instead of first knee-capping the proposal in order&lt;br/&gt;to (presumably) reduce cost of implementation.&lt;br/&gt;&lt;br/&gt;I believe that we both recognize that the proposed functionality would be&lt;br/&gt;beneficial. I believe that your position is that functionality close to&lt;br/&gt;what I have in mind can be implemented using covenants, albeit with some&lt;br/&gt;gaps. For me personally however these gaps would not be acceptable because&lt;br/&gt;they severely hurt the predictability and intuitiveness of the behavior of&lt;br/&gt;the functionality for the end-user. But as noted, I believe at this point&lt;br/&gt;it is premature to have this discussion.&lt;br/&gt;&lt;br/&gt;Perhaps you could help me understand what would be required to implement&lt;br/&gt;the *unmodified* proposal. That way, the community will be able to better&lt;br/&gt;assess the cost (in terms of effort and risk) and weigh it against the&lt;br/&gt;perceived benefits. Perhaps *then* we find that the cost could be&lt;br/&gt;significantly reduced without any significant reduction of the benefits,&lt;br/&gt;for instance by slightly compromising on the functionality such that no&lt;br/&gt;changes to consensus would be required for its implementation. (I am&lt;br/&gt;skeptical that this would be possible though). The cost reduction must be&lt;br/&gt;carefully weighed against the functional gaps it creates.&lt;br/&gt;&lt;br/&gt;I am aware that my proposal must be well-defined functionally before being&lt;br/&gt;able to reason about its benefits and implementational aspects. I believe&lt;br/&gt;that the proposed functionality is pretty straightforward, but I am happy&lt;br/&gt;to come up with a more precise functional spec. However, such effort would&lt;br/&gt;be wasted if there is no community interest for this functionality. So far&lt;br/&gt;only few people have engaged with this thread, and I am not sure that this&lt;br/&gt;is because there is no interest in the proposal or because most people just&lt;br/&gt;lurk here and do not feel like giving their opinion on random proposals. It&lt;br/&gt;would be great however to learn about more people&amp;#39;s opinions.&lt;br/&gt;&lt;br/&gt;As a reminder, the proposed functionality is to enable a user to limit the&lt;br/&gt;amount that they able to spent from an address within a certain time-frame&lt;br/&gt;or window (defined in number of blocks) while retaining the ability to&lt;br/&gt;spend arbitrary amounts using a secondary private key (or set of private&lt;br/&gt;keys). The general use case is to prevent theft of large amounts while&lt;br/&gt;still allowing a user to spend small amounts over time. Hodlers as well as&lt;br/&gt;exchanges dealing with cold, warm and hot wallets come to mind as users who&lt;br/&gt;could materially benefit from this functionality.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Mon, Aug 16, 2021 at 1:48 PM ZmnSCPxj &amp;lt;ZmnSCPxj at protonmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Good morning Zac,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Thank you for your counterproposal. I fully agree that as a first step&lt;br/&gt;&amp;gt; we must establish whether the proposed functionality can be implemented&lt;br/&gt;&amp;gt; without making any changes to consensus.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Your counterproposal is understandably more technical in nature because&lt;br/&gt;&amp;gt; it explores an implementation on top of Bitcoin as-is. However I feel that&lt;br/&gt;&amp;gt; for a fair comparison of the functionality of both proposals a purely&lt;br/&gt;&amp;gt; functional description of your proposal is essential.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; If I understand your proposal correctly, then I believe there are some&lt;br/&gt;&amp;gt; major gaps between yours and mine:&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Keys for unrestricted spending: in my proposal, they never have to come&lt;br/&gt;&amp;gt; online unless spending more than the limit is desired. In your proposal,&lt;br/&gt;&amp;gt; these keys are required to come online in several situations.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Correct, that is indeed a weakness.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; It is helpful to see &lt;a href=&#34;https://zmnscpxj.github.io/bitcoin/unchained.html&#34;&gt;https://zmnscpxj.github.io/bitcoin/unchained.html&lt;/a&gt;&lt;br/&gt;&amp;gt; Basically: any quorum of signers can impose any rules that are not&lt;br/&gt;&amp;gt; implementable on the base layer, including the rules you desire.&lt;br/&gt;&amp;gt; That quorum is the &amp;#34;offline keyset&amp;#34; in my proposal.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Presigning transactions: not required in my proposal. Wouldn’t such&lt;br/&gt;&amp;gt; presigning requirement be detrimental for the usability of your proposal?&lt;br/&gt;&amp;gt; Does it mean that for instance the amount and window in which the&lt;br/&gt;&amp;gt; transaction can be spent is determined at the time of signing? In my&lt;br/&gt;&amp;gt; proposal, there is no limit in the number of transactions per window.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; No.&lt;br/&gt;&amp;gt; Remember, the output is a simple 1-of-1 or k-of-n of the online keyset.&lt;br/&gt;&amp;gt; The online keyset can spend that wherever and however, including paying it&lt;br/&gt;&amp;gt; out to N parties, or paying part of the limit to 1 party and then paying&lt;br/&gt;&amp;gt; the remainder back to the same onchain keyset so it can access the funds in&lt;br/&gt;&amp;gt; the future.&lt;br/&gt;&amp;gt; Both cases are also available in your proposal, and the latter case (pay&lt;br/&gt;&amp;gt; out part of the limit to a single output, then keep the rest back to the&lt;br/&gt;&amp;gt; same onchain keyset) can be used to add an indefinite number of&lt;br/&gt;&amp;gt; transactions per window.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Number of windows: limited in your proposal, unlimited in mine.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Correct, though you can always have a fairly large number of windows&lt;br/&gt;&amp;gt; (&amp;#34;640kB ought to be enough for anybody&amp;#34;).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; There are probably additional gaps that I am currently not technically&lt;br/&gt;&amp;gt; able to recognize.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; It requires a fair amount of storage for the signatures at minimum, though&lt;br/&gt;&amp;gt; that may be as small as 64 bytes per window.&lt;br/&gt;&amp;gt; 1Mb of storage for signatures would allow 16,384 windows, assuming you use&lt;br/&gt;&amp;gt; 1-day windows that is about 44.88 years, probably more than enough that a&lt;br/&gt;&amp;gt; one-time onlining of the offline keys (or just print out the signatures on&lt;br/&gt;&amp;gt; paper or display as a QR code, whatever) is acceptable.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; I feel that the above gaps are significant enough to state that your&lt;br/&gt;&amp;gt; proposal does not meet the basic requirements of my proposal.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Next to consider is whether the gap is acceptable, weighing the effort&lt;br/&gt;&amp;gt; to implement the required consensus changes against the effort and&lt;br/&gt;&amp;gt; feasibility of implementing your counterproposal.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; I feel that your counterproposal has little chance of being implemented&lt;br/&gt;&amp;gt; because of the still considerable effort required and the poor result in&lt;br/&gt;&amp;gt; functional terms. I also wonder if your proposal is feasible considering&lt;br/&gt;&amp;gt; wallet operability.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; See above, particularly the gap that does not, in fact, exist.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Considering all the above, I believe that implementing consensus changes&lt;br/&gt;&amp;gt; in order to support the proposed functionality would preferable  over your&lt;br/&gt;&amp;gt; counterproposal.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; I acknowledge that a consensus change takes years and is difficult to&lt;br/&gt;&amp;gt; achieve, but that should not be any reason to stop exploring the appetite&lt;br/&gt;&amp;gt; for the proposed functionality and perhaps start looking at possible&lt;br/&gt;&amp;gt; technical solutions.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; You can also look into the &amp;#34;covenant&amp;#34; opcodes (`OP_CHECKSIGFROMSTACK`,&lt;br/&gt;&amp;gt; `OP_CHECKTEMPLATEVERIFY`, etc.), I think JeremyRubin has a bunch of them&lt;br/&gt;&amp;gt; listed somewhere, which may be used to implement something similar without&lt;br/&gt;&amp;gt; requiring presigning.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Since the basic &amp;#34;just use `nSequence`&amp;#34; scheme already implements what you&lt;br/&gt;&amp;gt; need, what the covenant opcodes buy you is that you do not need the offline&lt;br/&gt;&amp;gt; keyset to be onlined and there is no need to keep signatures, removing the&lt;br/&gt;&amp;gt; remaining gaps you identified.&lt;br/&gt;&amp;gt; With a proper looping covenant opcode, there is also no limit on the&lt;br/&gt;&amp;gt; number of windows.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; The issue with the covenant opcodes is that there are several proposals&lt;br/&gt;&amp;gt; with overlapping abilities and different tradeoffs.&lt;br/&gt;&amp;gt; This is the sort of thing that invites bikeshed-painting.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I suggest looking into the covenant opcodes and supporting those instead&lt;br/&gt;&amp;gt; of your own proposal, as your application is very close to one of the&lt;br/&gt;&amp;gt; motivating examples for covenants in the first place.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Regards,&lt;br/&gt;&amp;gt; ZmnSCPxj&lt;br/&gt;&amp;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/20210830/0da8e013/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210830/0da8e013/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:57:31Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqs0u9j3m8q3s8whfhlwl62l4hefupxue6hl4ct27yzaynw0e3ngzyczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675krj77zz</id>
    
      <title type="html">📅 Original date posted:2021-08-16 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqs0u9j3m8q3s8whfhlwl62l4hefupxue6hl4ct27yzaynw0e3ngzyczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675krj77zz" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8ys74h8fga855vvlwd4qu0xrd67stsxu9vwueezhrvvn3060xp5chyd3yu&#39;&gt;nevent1q…d3yu&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-08-16&lt;br/&gt;📝 Original message:Hi ZmnSCPxj,&lt;br/&gt;&lt;br/&gt;Thank you for your counterproposal. I fully agree that as a first step we&lt;br/&gt;must establish whether the proposed functionality can be implemented&lt;br/&gt;without making any changes to consensus.&lt;br/&gt;&lt;br/&gt;Your counterproposal is understandably more technical in nature because it&lt;br/&gt;explores an implementation on top of Bitcoin as-is. However I feel that for&lt;br/&gt;a fair comparison of the functionality of both proposals a purely&lt;br/&gt;functional description of your proposal is essential.&lt;br/&gt;&lt;br/&gt;If I understand your proposal correctly, then I believe there are some&lt;br/&gt;major gaps between yours and mine:&lt;br/&gt;&lt;br/&gt;Keys for unrestricted spending: in my proposal, they never have to come&lt;br/&gt;online unless spending more than the limit is desired. In your proposal,&lt;br/&gt;these keys are required to come online in several situations.&lt;br/&gt;&lt;br/&gt;Presigning transactions: not required in my proposal. Wouldn’t such&lt;br/&gt;presigning requirement be detrimental for the usability of your proposal?&lt;br/&gt;Does it mean that for instance the amount and window in which the&lt;br/&gt;transaction can be spent is determined at the time of signing? In my&lt;br/&gt;proposal, there is no limit in the number of transactions per window.&lt;br/&gt;&lt;br/&gt;Number of windows: limited in your proposal, unlimited in mine.&lt;br/&gt;&lt;br/&gt;There are probably additional gaps that I am currently not technically able&lt;br/&gt;to recognize.&lt;br/&gt;&lt;br/&gt;I feel that the above gaps are significant enough to state that your&lt;br/&gt;proposal does not meet the basic requirements of my proposal.&lt;br/&gt;&lt;br/&gt;Next to consider is whether the gap is acceptable, weighing the effort to&lt;br/&gt;implement the required consensus changes against the effort and feasibility&lt;br/&gt;of implementing your counterproposal.&lt;br/&gt;&lt;br/&gt;I feel that your counterproposal has little chance of being implemented&lt;br/&gt;because of the still considerable effort required and the poor result in&lt;br/&gt;functional terms. I also wonder if your proposal is feasible considering&lt;br/&gt;wallet operability.&lt;br/&gt;&lt;br/&gt;Considering all the above, I believe that implementing consensus changes in&lt;br/&gt;order to support the proposed functionality would preferable  over your&lt;br/&gt;counterproposal.&lt;br/&gt;&lt;br/&gt;I acknowledge that a consensus change takes years and is difficult to&lt;br/&gt;achieve, but that should not be any reason to stop exploring the appetite&lt;br/&gt;for the proposed functionality and perhaps start looking at possible&lt;br/&gt;technical solutions.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Sat, 14 Aug 2021 at 03:50, ZmnSCPxj &amp;lt;ZmnSCPxj at protonmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Good morning Zac,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Hi ZmnSCPxj,&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Thank you for your insightful response.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Perhaps I should take a step back and take a strictly functional angle.&lt;br/&gt;&amp;gt; Perhaps the list could help me to establish whether the proposed&lt;br/&gt;&amp;gt; functionality is:&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Desirable;&lt;br/&gt;&amp;gt; &amp;gt; Not already possible;&lt;br/&gt;&amp;gt; &amp;gt; Feasible to implement.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; The proposed functionality is as follows:&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; The ability to control some coin with two private keys (or two sets of&lt;br/&gt;&amp;gt; private keys) such that spending is limited over time for one private key&lt;br/&gt;&amp;gt; (i.e., it is for instance not possible to spend all coin in a single&lt;br/&gt;&amp;gt; transaction) while spending is unrestricted for the other private key (no&lt;br/&gt;&amp;gt; limits apply). No limits must apply to coin transacted to a third party.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Also, it must be possible never having to bring the unrestricted private&lt;br/&gt;&amp;gt; key online unless more than the limit imposed on the restrictive private&lt;br/&gt;&amp;gt; key is desired to be spent.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Less generally, taking the perspective of a hodler: the user must be&lt;br/&gt;&amp;gt; able to keep one key offline and one key online. The offline key allows&lt;br/&gt;&amp;gt; unrestricted spending, the online key is limited in how much it is allowed&lt;br/&gt;&amp;gt; to spend over time.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Furthermore, the spending limit must be intuitive. Best candidate I&lt;br/&gt;&amp;gt; believe would be a maximum spend per some fixed number of blocks. For&lt;br/&gt;&amp;gt; instance, the restrictive key may allow a maximum of 100k sats per any&lt;br/&gt;&amp;gt; window of 144 blocks. Ofcourse the user must be able to set these&lt;br/&gt;&amp;gt; parameters freely.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; My proposal does not *quite* implement a window.&lt;br/&gt;&amp;gt; However, that is because it uses `nLockTime`.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; With the use of `nSequence` in relative-locktime mode, however, it *does*&lt;br/&gt;&amp;gt; implement a window, sort of.&lt;br/&gt;&amp;gt; More specifically, it implements a timeout on spending --- if you spend&lt;br/&gt;&amp;gt; using a presigned transaction (which creates an unencumbered&lt;br/&gt;&amp;gt; specific-valued TXO that can be arbitrarily spent with your online keyset)&lt;br/&gt;&amp;gt; then you cannot get another &amp;#34;batch&amp;#34; of funds until the `nSequence` relative&lt;br/&gt;&amp;gt; locktime passes.&lt;br/&gt;&amp;gt; However, this *does* implement a window that limits a maximum value&lt;br/&gt;&amp;gt; spendable per any window of the relative timelock you select.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; The disadvantage is that `nSequence` use is a lot more obvious and&lt;br/&gt;&amp;gt; discernible than `nLockTime` use.&lt;br/&gt;&amp;gt; Many wallets today use non-zero `nLockTime` for anti-fee-sniping, and that&lt;br/&gt;&amp;gt; is a good cover for `nLockTime` transactions.&lt;br/&gt;&amp;gt; I believe Dave Harding proposed that wallets should also use, at random,&lt;br/&gt;&amp;gt; (say 50-50) `nSequence`-in-relative-locktime-mode as an alternate&lt;br/&gt;&amp;gt; anti-fee-sniping mechanism.&lt;br/&gt;&amp;gt; This alternate anti-fee-sniping would help cover `nSequence` use.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Note that my proposal does impose a maximum limit on the number of windows.&lt;br/&gt;&amp;gt; With `nSequence`-in-relative-locktime-mode the limit is the number of&lt;br/&gt;&amp;gt; times that the online keyset can spend.&lt;br/&gt;&amp;gt; After spending that many windows, the offline keyset has to be put back&lt;br/&gt;&amp;gt; online to generate a new set of transactions.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; It has the massive massive advantage that you can implement it today&lt;br/&gt;&amp;gt; without any consensus change, and I think you can expect that consensus&lt;br/&gt;&amp;gt; change will take a LONG time (xref SegWit, Taproot).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Certainly the functionality is desirable.&lt;br/&gt;&amp;gt; But it seems it can be implemented with Bitcoin today.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Regards,&lt;br/&gt;&amp;gt; ZmnSCPxj&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;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/20210816/298ee64f/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210816/298ee64f/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:57:30Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsp5g6dx2dykfe75fvglj66wh0pkksm4h7qwn7mwrkdsylmpm6q83szypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kyym0tq</id>
    
      <title type="html">📅 Original date posted:2021-08-13 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsp5g6dx2dykfe75fvglj66wh0pkksm4h7qwn7mwrkdsylmpm6q83szypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kyym0tq" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrjjutpwmd8yn72m4yzcdncpc7vu6j5jcmjcx488cke7z8dhna8yc7mq3sq&#39;&gt;nevent1q…q3sq&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-08-13&lt;br/&gt;📝 Original message:Hi ZmnSCPxj,&lt;br/&gt;&lt;br/&gt;Thank you for your insightful response.&lt;br/&gt;&lt;br/&gt;Perhaps I should take a step back and take a strictly functional angle.&lt;br/&gt;Perhaps the list could help me to establish whether the proposed&lt;br/&gt;functionality is:&lt;br/&gt;&lt;br/&gt;Desirable;&lt;br/&gt;Not already possible;&lt;br/&gt;Feasible to implement.&lt;br/&gt;&lt;br/&gt;The proposed functionality is as follows:&lt;br/&gt;&lt;br/&gt;The ability to control some coin with two private keys (or two sets of&lt;br/&gt;private keys) such that spending is limited over time for one private key&lt;br/&gt;(i.e., it is for instance not possible to spend all coin in a single&lt;br/&gt;transaction) while spending is unrestricted for the other private key (no&lt;br/&gt;limits apply). No limits must apply to coin transacted to a third party.&lt;br/&gt;&lt;br/&gt;Also, it must be possible never having to bring the unrestricted private&lt;br/&gt;key online unless more than the limit imposed on the restrictive private&lt;br/&gt;key is desired to be spent.&lt;br/&gt;&lt;br/&gt;Less generally, taking the perspective of a hodler: the user must be able&lt;br/&gt;to keep one key offline and one key online. The offline key allows&lt;br/&gt;unrestricted spending, the online key is limited in how much it is allowed&lt;br/&gt;to spend over time.&lt;br/&gt;&lt;br/&gt;Furthermore, the spending limit must be intuitive. Best candidate I believe&lt;br/&gt;would be a maximum spend per some fixed number of blocks. For instance, the&lt;br/&gt;restrictive key may allow a maximum of 100k sats per any window of 144&lt;br/&gt;blocks. Ofcourse the user must be able to set these parameters freely.&lt;br/&gt;&lt;br/&gt;I look forward to any feedback you may have.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Tue, 10 Aug 2021 at 04:17, ZmnSCPxj &amp;lt;ZmnSCPxj at protonmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt;  fromGood morning Zac,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; With some work, what you want can be implemented, to some extent, today,&lt;br/&gt;&amp;gt; without changes to consensus.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; The point you want, I believe, is to have two sets of keys:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; * A long-term-storage keyset, in &amp;#34;cold&amp;#34; storage.&lt;br/&gt;&amp;gt; * A short-term-spending keyset, in &amp;#34;warm&amp;#34; storage, controlling only a&lt;br/&gt;&amp;gt; small amount of funds.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; What you can do would be:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; * Put all your funds in a single UTXO, with an k-of-n of your cold keys&lt;br/&gt;&amp;gt; (ideally P2TR, or some P2WSH k-of-n).&lt;br/&gt;&amp;gt; * Put your cold keys online, and sign a transaction spending the above&lt;br/&gt;&amp;gt; UTXO, and spending most of it to a new address that is a tweaked k-of-n of&lt;br/&gt;&amp;gt; your cold keys, and a smaller output (up to the limit you want) controlled&lt;br/&gt;&amp;gt; by the k-of-n of your warm keys.&lt;br/&gt;&amp;gt;   * Keep this transaction offchain, in your warm storage.&lt;br/&gt;&amp;gt; * Put your cold keys back offline.&lt;br/&gt;&amp;gt; * When you need to spend using your warm keys, bring the above transaction&lt;br/&gt;&amp;gt; onchain, then spend from the budget as needed.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; If you need to have some estimated amount of usable funds for every future&lt;br/&gt;&amp;gt; unit of time, just create a chain of transactions with future `nLockTime`.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;                                   nLocktime &#43;1day  nLockTime &#43;2day&lt;br/&gt;&amp;gt;                   &#43;------------&#43;   &#43;------------&#43;   &#43;------------&#43;&lt;br/&gt;&amp;gt;      cold UTXO --&amp;gt;|    cold TXO|--&amp;gt;|    cold TXO|--&amp;gt;|    cold TXO|--&amp;gt; etc.&lt;br/&gt;&amp;gt;                   |            |   |            |   |            |&lt;br/&gt;&amp;gt;                   |    warm TXO|   |    warm TXO|   |    warm TXO|&lt;br/&gt;&amp;gt;                   &#43;------------&#43;   &#43;------------&#43;   &#43;------------&#43;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Pre-sign the above transactions, store the pre-signed transactions in warm&lt;br/&gt;&amp;gt; storage together with your warm keys.&lt;br/&gt;&amp;gt; Then put the cold keys back offline.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Then from today to tomorrow, you can spend only the first warm TXO.&lt;br/&gt;&amp;gt; From tomorrow to the day after, you can spend only the first two warm TXOs.&lt;br/&gt;&amp;gt; And so on.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; If tomorrow your warm keys are stolen, you can bring the cold keys online&lt;br/&gt;&amp;gt; to claim the second cold TXO and limit your fund loss to only just the&lt;br/&gt;&amp;gt; first two warm TXOs.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; The above is bulky, but it has the advantage of not using any special&lt;br/&gt;&amp;gt; opcodes or features (improving privacy, especially with P2TR which would in&lt;br/&gt;&amp;gt; theory allow k-of-n/n-of-n to be indistinguishable from 1-of-1), and using&lt;br/&gt;&amp;gt; just `nLockTime`, which is much easier to hide since most modern wallets&lt;br/&gt;&amp;gt; will set `nLockTime` to recent block heights.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Regards,&lt;br/&gt;&amp;gt; ZmnSCPxj&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;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/20210813/35283ad0/attachment-0001.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210813/35283ad0/attachment-0001.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:57:29Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqs8979waz5mqse6e340nhune9032vz08kveuajtfj5qydaduurzntszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kww0h8l</id>
    
      <title type="html">📅 Original date posted:2021-08-05 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqs8979waz5mqse6e340nhune9032vz08kveuajtfj5qydaduurzntszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kww0h8l" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsg8e3tq3mezu6wmda6nx3wkvu3328r8cefg5skkr5quacjpdwjv3qj7tssw&#39;&gt;nevent1q…tssw&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-08-05&lt;br/&gt;📝 Original message:Hi Billy,&lt;br/&gt;&lt;br/&gt;&amp;gt; It sounds like you&amp;#39;re proposing an opcode&lt;br/&gt;&lt;br/&gt;No. I don’t have enough knowledge of Bitcoin to be able to tell how (and&lt;br/&gt;if) rate-limiting can be implemented as I suggested. I am not able to&lt;br/&gt;reason about opcodes, so I kept my description at a more functional level.&lt;br/&gt;&lt;br/&gt;&amp;gt; I still don&amp;#39;t understand why its useful to specify those as absolute&lt;br/&gt;block heights&lt;br/&gt;&lt;br/&gt;I feel that this a rather uninteresting data representation aspect that’s&lt;br/&gt;not worth going back and forth about. Sure, specifying the length of the&lt;br/&gt;epoch may also be an option, although at the price of giving up some&lt;br/&gt;functionality, and without much if any gains.&lt;br/&gt;&lt;br/&gt;By explicitly specifying the start and end block of an epoch, the user has&lt;br/&gt;more flexibility in shifting the epoch (using alternate values for&lt;br/&gt;epochStart and epochEnd) and simultaneously increasing the length of an&lt;br/&gt;epoch. These seem rather exotic features, but there’s no harm in retaining&lt;br/&gt;them.&lt;br/&gt;&lt;br/&gt;&amp;gt; if you have a UTXO encumbered by rateLimit(epochStart = 800100, epochEnd&lt;br/&gt;= 800200, limit = 100k, remain = 100k), what happens if you don&amp;#39;t spend&lt;br/&gt;that UTXO before block 800200?&lt;br/&gt;&lt;br/&gt;The rate limit remains in place. So if this UTXO is spent in block 900000,&lt;br/&gt;then at most 100k may be spent. Also, the new epoch must be at least 100&lt;br/&gt;blocks and remain must correctly account for the actual amount spent.&lt;br/&gt;&lt;br/&gt;&amp;gt; This is how I&amp;#39;d imagine creating an opcode like this:&lt;br/&gt;&lt;br/&gt;&amp;gt; rateLimit(windowSize = 144 blocks, limit = 100k sats)&lt;br/&gt;&lt;br/&gt;This would require the system to bookkeep how much was spent since the&lt;br/&gt;first rate-limited output. It is a more intuitive way of rate-limiting but&lt;br/&gt;it may be much more difficult to implement, which is why I went with the&lt;br/&gt;epoch-based rate limiting solution. In terms of functionality, I believe&lt;br/&gt;the two solutions are nearly identical for all practical purposes.&lt;br/&gt;&lt;br/&gt;Your next section confuses me. As I understand it, using an address as&lt;br/&gt;input for a transaction will always spends the full amount at that address.&lt;br/&gt;That’s why change addresses are required, no? If Bitcoin were able to pay&lt;br/&gt;exact amounts then there wouldn’t be any need for change outputs.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Thu, 5 Aug 2021 at 08:39, Billy Tetrud &amp;lt;billy.tetrud at gmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; &amp;gt;   A maximum amount is allowed to be spent within EVERY epoch.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; It sounds like you&amp;#39;re proposing an opcode that takes in epochStart and&lt;br/&gt;&amp;gt; epochEnd as parameters. I still don&amp;#39;t understand why its useful to specify&lt;br/&gt;&amp;gt; those as absolute block heights. You mentioned that this enables more&lt;br/&gt;&amp;gt; straightforward validation logic, but I don&amp;#39;t see how. Eg, if you have a&lt;br/&gt;&amp;gt; UTXO encumbered by rateLimit(epochStart = 800100, epochEnd = 800200, limit&lt;br/&gt;&amp;gt; = 100k, remain = 100k), what happens if you don&amp;#39;t spend that UTXO before&lt;br/&gt;&amp;gt; block 800200? Is the output no longer rate limited then? Or is the opcode&lt;br/&gt;&amp;gt; calculating 800200-800100 = 100 and applying a rate limit for the next&lt;br/&gt;&amp;gt; epoch? If the first, then the UTXO must be spent within one epoch to remain&lt;br/&gt;&amp;gt; rate limited. If the second, then it seems nearly identical to simply&lt;br/&gt;&amp;gt; specifying window=100 as a parameter instead of epochStart and epochEnd.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; then there must be only a single (rate-limited) output&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; This rule would make transactions tricky if you&amp;#39;re sending money into&lt;br/&gt;&amp;gt; someone else&amp;#39;s wallet that may be rate limited. If the requirement is that&lt;br/&gt;&amp;gt; only you yourself can send money into a rate limited wallet, then this&lt;br/&gt;&amp;gt; point is moot but it would be ideal to not have such a requirement.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; This is how I&amp;#39;d imagine creating an opcode like this:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; rateLimit(windowSize = 144 blocks, limit = 100k sats)&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; This would define that the epoch is 1 day&amp;#39;s worth of blocks. This would&lt;br/&gt;&amp;gt; evenly divide bitcoin&amp;#39;s retarget period and so each window would start and&lt;br/&gt;&amp;gt; end at those dividing lines (eg the first 144 blocks of the retargetting&lt;br/&gt;&amp;gt; period, then the second, then the third, etc).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; When this output is spent, it ensures that there&amp;#39;s a maximum of 100k sats&lt;br/&gt;&amp;gt; is sent to addresses other than the originating address. It also records&lt;br/&gt;&amp;gt; the amount spent in the current 144 block window for that address (eg by&lt;br/&gt;&amp;gt; simply recording the already-spent amount on the resulting UTXO and having&lt;br/&gt;&amp;gt; an index that allows looking up UTXOs by address and adding them up). That&lt;br/&gt;&amp;gt; way, when any output from that address is spent again, if a new 144 block&lt;br/&gt;&amp;gt; window has started, the limit is reset, but if its still within the same&lt;br/&gt;&amp;gt; window, the already-spent amounts for UTXOs from that address are added up&lt;br/&gt;&amp;gt; and subtracted from the limit, and that number is the remaining limit a&lt;br/&gt;&amp;gt; subsequent transaction needs to adhere to.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; This way, 3rd party could send transactions into an address like this, and&lt;br/&gt;&amp;gt; multiple outputs can be combined and used to spend to arbitrary outputs (up&lt;br/&gt;&amp;gt; to the rate limit of course).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; On Wed, Aug 4, 2021 at 3:48 AM Zac Greenwood &amp;lt;zachgrw at gmail.com&amp;gt; wrote:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; Ah I see, this is all limited to within a single epoch.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; No, that wouldn&amp;#39;t be useful. A maximum amount is allowed to be spent&lt;br/&gt;&amp;gt;&amp;gt; within EVERY epoch.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Consider an epoch length of 100 blocks with a spend limit of 200k per&lt;br/&gt;&amp;gt;&amp;gt; epoch. The following is allowed:&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; epoch1 (800101 - 800200): spend 120k in block 800140. Remaining for&lt;br/&gt;&amp;gt;&amp;gt; epoch1: 80k;&lt;br/&gt;&amp;gt;&amp;gt; epoch1 (800101 - 800200): spend another 60k in block 800195. Remaining&lt;br/&gt;&amp;gt;&amp;gt; for epoch1: 20k;&lt;br/&gt;&amp;gt;&amp;gt; epoch2 (800201 - 800300): spend 160k in block 800201. Remaining for&lt;br/&gt;&amp;gt;&amp;gt; epoch2: 40k.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Since the limit pertains to each individual epoch, it is allowed to spend&lt;br/&gt;&amp;gt;&amp;gt; up to the full limit at the start of any new epoch. In this example, the&lt;br/&gt;&amp;gt;&amp;gt; spending was as follows:&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; 800140: 120k&lt;br/&gt;&amp;gt;&amp;gt; 800195: 60k&lt;br/&gt;&amp;gt;&amp;gt; 800201: 160k.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Note that in a span of 62 blocks a total of 340k sats was spent. This may&lt;br/&gt;&amp;gt;&amp;gt; seem to violate the 200k limit per 100 blocks, but this is the result of&lt;br/&gt;&amp;gt;&amp;gt; using a per-epoch limit. This allows a maximum of 400k to be spent in 2&lt;br/&gt;&amp;gt;&amp;gt; blocks llke so: 200k in the last block of an epoch and another 200k in the&lt;br/&gt;&amp;gt;&amp;gt; first block of the next epoch. However this is inconsequential for the&lt;br/&gt;&amp;gt;&amp;gt; intended goal of rate-limiting which is to enable small spends over time&lt;br/&gt;&amp;gt;&amp;gt; from a large amount and to prevent theft of a large amount with a single&lt;br/&gt;&amp;gt;&amp;gt; transaction.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; To explain the proposed design more clearly, I have renamed the params as&lt;br/&gt;&amp;gt;&amp;gt; follows:&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; epochStart: block height of first block of the current epoch (was: h0);&lt;br/&gt;&amp;gt;&amp;gt; epochEnd: block height of last block of the current epoch (was: h1);&lt;br/&gt;&amp;gt;&amp;gt; limit: the maximum total amount allowed to be spent within the current&lt;br/&gt;&amp;gt;&amp;gt; epoch (was: a);&lt;br/&gt;&amp;gt;&amp;gt; remain: the remaining amount allowed to be spent within the current epoch&lt;br/&gt;&amp;gt;&amp;gt; (was: a_remaining);&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Also, to illustrate that the params are specific to a transaction, I will&lt;br/&gt;&amp;gt;&amp;gt; hence precede the param with the transaction name like so:&lt;br/&gt;&amp;gt;&amp;gt; tx8_limit, tx31c_remain, tx42z_epochStart, ... etc.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; For simplicity, only transactions with no more than one rate-limited&lt;br/&gt;&amp;gt;&amp;gt; input are considered, and with no more than two outputs: one rate-limited&lt;br/&gt;&amp;gt;&amp;gt; change output, and a normal (not rate-limited) output.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Normally, a simple transaction generates two outputs: one for a payment&lt;br/&gt;&amp;gt;&amp;gt; to a third party and one for the change address. Again for simplicity, we&lt;br/&gt;&amp;gt;&amp;gt; demand that a transaction which introduces rate-limiting must have only a&lt;br/&gt;&amp;gt;&amp;gt; single, rate-limited output. The validation rule might be: if a transaction&lt;br/&gt;&amp;gt;&amp;gt; has rate-limiting params and none of its inputs are rate-limited, then&lt;br/&gt;&amp;gt;&amp;gt; there must be only a single (rate-limited) output (and no second or change&lt;br/&gt;&amp;gt;&amp;gt; output).&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Consider rate limiting transactions tx1 having one or more normal (non&lt;br/&gt;&amp;gt;&amp;gt; rate-limited) inputs:&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; tx1 gets included at block height 800004;&lt;br/&gt;&amp;gt;&amp;gt; The inputs of tx1 are not rate-limited =&amp;gt; tx1 must have only a single&lt;br/&gt;&amp;gt;&amp;gt; output which will become rate-limited;&lt;br/&gt;&amp;gt;&amp;gt; params: tx1_epochStart=800001, tx1_epochEnd=800100, tx1_limit=200k,&lt;br/&gt;&amp;gt;&amp;gt; tx1_remain=200k;&lt;br/&gt;&amp;gt;&amp;gt; =&amp;gt; This defines that an epoch has 100 blocks and no more than 200k sats&lt;br/&gt;&amp;gt;&amp;gt; may be spent in any one epoch. Within the current epoch, 200k sats may&lt;br/&gt;&amp;gt;&amp;gt; still be spent.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; This transaction begins to rate-limit a set of inputs, so it has a single&lt;br/&gt;&amp;gt;&amp;gt; rate-limited output.&lt;br/&gt;&amp;gt;&amp;gt; Let&amp;#39;s explore transactions that have the output of tx1 as their input. I&lt;br/&gt;&amp;gt;&amp;gt; will denote the output of tx1 as &amp;#34;out1&amp;#34;.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; tx2a has out1 as its only input;&lt;br/&gt;&amp;gt;&amp;gt; tx2a spends 50k sats and gets included at block height 803050;&lt;br/&gt;&amp;gt;&amp;gt; tx2a specifies the following params for its change output &amp;#34;chg2a&amp;#34;:&lt;br/&gt;&amp;gt;&amp;gt; chg2a_epochStart=803001, chg2a_epochEnd=803100;&lt;br/&gt;&amp;gt;&amp;gt; chg2a_limit=200k, chg2a_remain=150k.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; To enforce rate-limiting, the system must validate the params of the&lt;br/&gt;&amp;gt;&amp;gt; change output chg2a to ensure that overspending is not allowed.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; The above params are allowed because:&lt;br/&gt;&amp;gt;&amp;gt; =&amp;gt; 1. the epoch does not become smaller than 100 blocks [(chg2a_epochEnd&lt;br/&gt;&amp;gt;&amp;gt; - chg2a_epochStart) &amp;gt;= (tx1_epochEnd - tx1_epochStart)]&lt;br/&gt;&amp;gt;&amp;gt; =&amp;gt; 2. tx1_limit has not been increased (ch2a_limit &amp;lt;= tx1_limit)&lt;br/&gt;&amp;gt;&amp;gt; =&amp;gt; 3. the amount spent (50k sats) does not exceed tx1_remain AND does not&lt;br/&gt;&amp;gt;&amp;gt; exceed chg2a_limit;&lt;br/&gt;&amp;gt;&amp;gt; =&amp;gt; 4. chg2a_remain&amp;#34; is 50k sats less than chg2a_limit.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; A transaction may also further constrain further spending like so:&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; tx2b has out1as its only input;&lt;br/&gt;&amp;gt;&amp;gt; tx2b spends 8k sats and gets included at block height 808105;&lt;br/&gt;&amp;gt;&amp;gt; tx2b specifies the following params for its change output &amp;#34;chg2b&amp;#34;:&lt;br/&gt;&amp;gt;&amp;gt; chg2b_epochStart=808101, chg2b_epochEnd=808250;&lt;br/&gt;&amp;gt;&amp;gt; chg2b_limit=10k, chg2b_remain=0.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; These params are allowed because:&lt;br/&gt;&amp;gt;&amp;gt; =&amp;gt; 1. the epoch does not become smaller than100 blocks. It is fine to&lt;br/&gt;&amp;gt;&amp;gt; increase the epoch to 150 blocks because it does not enable exceeding the&lt;br/&gt;&amp;gt;&amp;gt; original rate-limit;&lt;br/&gt;&amp;gt;&amp;gt; =&amp;gt; 2. the limit (chg2b_limit) has been decreased to 10k sats, further&lt;br/&gt;&amp;gt;&amp;gt; restricting the maximum amount allowed to be spent within the current and&lt;br/&gt;&amp;gt;&amp;gt; any subsequent epochs;&lt;br/&gt;&amp;gt;&amp;gt; =&amp;gt; 3. the amount spent (10k sats) does not exceed tx1_remain AND does not&lt;br/&gt;&amp;gt;&amp;gt; exceed chg2b_limit;&lt;br/&gt;&amp;gt;&amp;gt; =&amp;gt; 4. chg2b_remain has been set to zero, meaning that within the current&lt;br/&gt;&amp;gt;&amp;gt; epoch (block height 808101 to and including 808250), tx2b cannot be used as&lt;br/&gt;&amp;gt;&amp;gt; a spending input to any transaction.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Starting from block height 808251, a new epoch will start and the&lt;br/&gt;&amp;gt;&amp;gt; rate-limited output of tx2b may again be used as an input for a subsequent&lt;br/&gt;&amp;gt;&amp;gt; rate-limited transaction tx3b. This transaction tx3b must again be&lt;br/&gt;&amp;gt;&amp;gt; accompanied by params that do not violate the rate-limit as defined by the&lt;br/&gt;&amp;gt;&amp;gt; params of tx2b and which are stored with output out2b. So, the epoch of&lt;br/&gt;&amp;gt;&amp;gt; tx3b must be at minimum 150 blocks, the maximum that is allowed to be spent&lt;br/&gt;&amp;gt;&amp;gt; per epoch is at most 10k sats, and chg3b_remain must be decreased by at&lt;br/&gt;&amp;gt;&amp;gt; least the amount spent by tx3b.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; From the above, the rate-limiting mechanics should hopefully be clear and&lt;br/&gt;&amp;gt;&amp;gt; full set of validation rules could be defined in a more generalized way&lt;br/&gt;&amp;gt;&amp;gt; with little additional effort.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Note that I conveniently avoided talking about how to represent the&lt;br/&gt;&amp;gt;&amp;gt; parameters within transactions or outputs, simply because I currently lack&lt;br/&gt;&amp;gt;&amp;gt; enough understanding to reason about this. I am hoping that others may&lt;br/&gt;&amp;gt;&amp;gt; offer help.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Zac&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; On Tue, Aug 3, 2021 at 8:12 PM Billy Tetrud &amp;lt;billy.tetrud at gmail.com&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; &amp;gt; To enable more straightforward validation logic.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; &amp;gt; within the current epoch&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Ah I see, this is all limited to within a single epoch. I think that&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; sufficiently limits the window of time in which nodes have to store&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; information for rate limited outputs. However, I don&amp;#39;t see how specifying&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; block ranges simplifies the logic - wouldn&amp;#39;t this complicate the logic with&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; additional user-specified constraints? It also prevents the output from&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; being able to be rate limited over the span of multiple epochs, which would&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; seem to make it a lot more difficult to use for certain types of wallets&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; (eg cold wallets).&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; I think I see the logic of your &amp;#39;remaining&amp;#39; parameter there. If you&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; start with a single rate-limited input, you can split that into many&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; outputs, only one of which have a &amp;#39;remaining&amp;#39; balance. The rest can simply&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; remain unspendable for the rest of the epoch. That way these things don&amp;#39;t&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; need to be tied together. However, that doesn&amp;#39;t solve the problem of 3rd&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; parties being able to send money into the wallet.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; &amp;gt; I don&amp;#39;t believe that the marginal added functionality would justify&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; the increased implementation complexity&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Perhaps, but I think there is a lot of benefit in allowing these kinds&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; of things to operate as similarly as possible to normal transactions, for&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; one because of usability reasons. If each opcode has its own quirks that&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; are not intuitively related to their purpose (eg if a rate-limited wallet&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; had no way to get a receiving address), it would confuse end-users (eg who&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; wonder how to get a receiving address and how they can ask people to send&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; money into their wallet) or require a lot of technical complexity in&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; applications (eg to support something like cooperatively connecting with&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; their wallet so that a transaction can be made that creates a new&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; single-output for the wallet). A little complexity in this opcode can save&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; a lot of external complexity here I think.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; &amp;gt; my understanding of Bitcoin is way too low to be able to write a BIP&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; and do the implementation&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; You might be able to find people willing to help. I would be willing to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; help write the BIP spec. I&amp;#39;m not the right person to help with the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; implementation, but perhaps you could find someone else who is. Even if the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; BIP isn&amp;#39;t adopted, it could be a starting point or inspiration for someone&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; else to write an improved version.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; On Mon, Aug 2, 2021 at 2:32 AM Zac Greenwood &amp;lt;zachgrw at gmail.com&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; [Note: I&amp;#39;ve moved your reply to the newly started thread]&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Hi Billy,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Thank you for your kind and encouraging feedback.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; I don&amp;#39;t quite understand why you&amp;#39;d want to define a specific span of&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; blocks for the rate limit. Why not just specify the size of the window (in&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; blocks) to rate limit within, and the limit?&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; To enable more straightforward validation logic.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; You mentioned change addresses, however, with the parameters you&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; defined, there would be no way to connect together the change address with&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; the original address, meaning they would have completely separate rate&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; limits, which wouldn&amp;#39;t work since the change output would ignore the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; previous rate limit.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; The rate-limiting parameters must be re-specified for each rate-limited&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; input. So, a transaction that has a rate-limited input is only valid if its&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; output is itself rate-limited such that it does not violate the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; rate-limiting constraints of its input.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; In my thread-starter, I gave the below example of a rate-limited&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; address a2 that serves as input for transaction t2:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; a2: 99.8 sats at height 800100;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate-limit params: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Transaction t2:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Included at block height 800200&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Spend: 400k &#43; fees.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate-limiting params: h0=800144, h1=800287, a=500k, a_remaining=100k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Note how transaction t2 re-specifies the rate-limiting parameters.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Validation must ensure that the re-specified parameters are within bounds,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; i.e., do not allow more spending per epoch than the rate-limiting&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; parameters of its input address a2. Re-specifying the rate-limiting&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; parameters offers the flexibility to further restrict spending, or to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; disable any additional spending within the current epoch by setting&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; a_remaining to zero.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Result:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Value at destination address: 400k sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params at destination address: none;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Value at change address a3: 99.4m sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params at change address a3: h0=800144, h1=800287,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; a=500k, a_remaining=100k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; As a design principle I believe it makes sense if the system is able to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; verify the validity of a transaction without having to consider any&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; transactions that precede its inputs. As a side-note, doing away with this&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; design principle would however enable more sophisticated rate-limiting&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; (such as rate-limiting per sliding window instead of rate-limiting per&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; epoch having a fixed start and end block), but while at the same time&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; reducing the size of per rate-limiting transaction (because it would enable&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; specifying the rate-limiting parameters more space-efficiently). To test&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; the waters and to keep things relatively simple, I chose not to go into&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; this enhanced form of rate-limiting.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; I haven&amp;#39;t gone into how to process a transaction having multiple&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; rate-limited inputs. The easiest way to handle this case is to not allow&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; any transaction having more than one rate-limited input. One could imagine&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; complex logic to handle transactions having multiple rate-limited inputs by&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; creating multiple rate-limited change addresses. However at first glance I&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; don&amp;#39;t believe that the marginal added functionality would justify the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; increased implementation complexity.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;  I&amp;#39;d be interested in seeing you write a BIP for this.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Thank you, but sadly my understanding of Bitcoin is way too low to be&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; able to write a BIP and do the implementation. However I see tremendous&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; value in this functionality. Favorable feedback of the list regarding the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; usefulness and the technical feasibility of rate-limiting functionality&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; would of course be an encouragement for me to descend further down the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; rabbit hole.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Zac&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Sun, Aug 1, 2021 at 10:09 AM Zac Greenwood &amp;lt;zachgrw at gmail.com&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; [Resubmitting to list with minor edits. My previous submission ended&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; up inside an existing thread, apologies.]&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Hi list,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; I&amp;#39;d like to explore whether it is feasible to implement new scripting&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; capabilities in Bitcoin that enable limiting the output amount of a&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; transaction based on the total value of its inputs. In other words, to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; implement the ability to limit the maximum amount that can be sent from an&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; address.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Two use cases come to mind:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; UC1: enable a user to add additional protection their funds by&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; rate-limiting the amount that they are allowed to send during a certain&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; period (measured in blocks). A typical use case might be a user that&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; intends to hodl their bitcoin, but still wishes to occasionally send small&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; amounts. Rate-limiting avoids an attacker from sweeping all the users&amp;#39;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; funds in a single transaction, allowing the user to become aware of the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; theft and intervene to prevent further thefts.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; UC2: exchanges may wish to rate-limit addresses containing large&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; amounts of bitcoin, adding warm- or hot-wallet functionality to a&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; cold-storage address. This would enable an exchange to drastically reduce&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; the number of times a cold wallet must be accessed with private keys that&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; give access to the full amount.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; In a typical setup, I&amp;#39;d envision using multisig such that the user has&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; two sets of private keys to their encumbered address (with a &amp;#34;set&amp;#34; of keys&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; meaning &amp;#34;one or more&amp;#34; keys). One set of private keys allows only for&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; sending with rate-limiting restrictions in place, and a second set of&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; private keys allowing for sending any amount without rate-limiting,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; effectively overriding such restriction.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; The parameters that define in what way an output is rate-limited might&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; be defined as follows:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Param 1: a block height &amp;#34;h0&amp;#34; indicating the first block height of an&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; epoch;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Param 2: a block height &amp;#34;h1&amp;#34; indicating the last block height of an&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; epoch;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Param 3: an amount &amp;#34;a&amp;#34; in satoshi indicating the maximum amount that&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; is allowed to be sent in any epoch;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Param 4: an amount &amp;#34;a_remaining&amp;#34; (in satoshi) indicating the maximum&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; amount that is allowed to be sent within the current epoch.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; For example, consider an input containing 100m sats (1 BTC) which has&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; been rate-limited with parameters (h0, h1, a, a_remaining) of (800000,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; 800143, 500k, 500k). These parameters define that the address is&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; rate-limited to sending a maximum of 500k sats in the current epoch that&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; starts at block height 800000 and ends at height 800143 (or about one day&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ignoring block time variance) and that the full amount of 500k is still&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; sendable. These rate-limiting parameters ensure that it takes at minimum&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; 100m / 500k = 200 transactions and 200 x 144 blocks or about 200 days to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; spend the full 100m sats. As noted earlier, in a typical setup a user&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; should retain the option to transact the entire amount using a second (set&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; of) private key(s).&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; For rate-limiting to work, any change output created by a transaction&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; from a rate-limited address must itself be rate-limited as well. For&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; instance, expanding on the above example, assume that the user spends 200k&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; sats from a rate-limited address a1 containing 100m sats:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Start situation:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; At block height 800000: rate-limited address a1 is created;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Value of a1: 100.0m sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params of a1: h0=800000, h1=800143, a=500k,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; a_remaining=500k;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Transaction t1:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Included at block height 800100;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Spend: 200k &#43; fee;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params: h0=800000, h1=800143, a=500k, a_remaining=300k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Result:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Value at destination address: 200k sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params at destination address: none;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Value at change address a2: 99.8m sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params at change address a2: h0=800000, h1=800143,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; a=500k, a_remaining=300k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; In order to properly enforce rate limiting, the change address must be&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; rate-limited such that the original rate limit of 500k sats per 144 blocks&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; cannot be exceeded. In this example, the change address a2 were given the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; same rate limiting parameters as the transaction that served as its input.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; As a result, from block 800100 up until and including block 800143, a&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; maximum amount of 300k sats is allowed to be spent from the change address.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Example continued:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; a2: 99.8 sats at height 800100;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate-limit params: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Transaction t2:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Included at block height 800200&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Spend: 400k &#43; fees.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate-limiting params: h0=800144, h1=800287, a=500k, a_remaining=100k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Result:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Value at destination address: 400k sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params at destination address: none;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Value at change address a3: 99.4m sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params at change address a3: h0=800144, h1=800287,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; a=500k, a_remaining=100k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Transaction t2 is allowed because it falls within the next epoch&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; (running from 800144 to 800287) so a spend of 400k does not violate the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; constraint of 500k per epoch.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; As could be seen, the rate limiting parameters are part of the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; transaction and chosen by the user (or their wallet). This means that the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; parameters must be validated to ensure that they do not violate the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; intended constraints.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; For instance, this transaction should not be allowed:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; a2: 99.8 sats at height 800100;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate-limit params of a2: h0=800000, h1=800143, a=500k,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; a_remaining=300k;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Transaction t2a:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Included at block height 800200;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Spend: 400k &#43; fees;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Rate-limit params: h0=800124, h1=800267, a=500k, a_remaining=100k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; This transaction t2a attempts to shift the epoch forward by 20 blocks&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; such that it starts at 800124 instead of 800144. Shifting the epoch forward&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; like this must not be allowed because it enables spending more that the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; rate limit allows, which is 500k in any epoch of 144 blocks. It would&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; enable overspending:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; t1: spend 200k at 800100 (epoch 1: total: 200k);&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; t2a: spend 400k at 800200 (epoch 2: total: 400k);&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; t3a: spend 100k at 800201 (epoch 2: total: 500k);&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; t4a: spend 500k at 800268 (epoch 2: total: 1000k, overspending for&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; epoch 2).&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Specifying the rate-limiting parameters explicitly at every&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; transaction allows the user to tighten the spending limit by setting&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; tighter limits or for instance by setting a_remainder to 0 if they wish to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; enforce not spending more during an epoch. A second advantage of explicitly&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; specifying the four rate-limiting parameters with each transaction is that&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; it allows the system to fully validate the transaction without having to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; consider any previous transactions within an epoch.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; I will stop here because I would like to gauge interest in this idea&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; first before continuing work on other aspects. Two main pieces of work jump&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; to mind:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Define all validations;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Describe aggregate behaviour of multiple (rate-limited) inputs, proof&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; that two rate-limited addresses cannot spend more than the sum of their&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; individual limits.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Zac&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;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/20210805/55d5d18c/attachment-0001.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210805/55d5d18c/attachment-0001.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:57:26Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqs9tfu3s4s5pevquytswep2tsvcxn7s7edq9269esfledphyfyh3zgzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kv3e78p</id>
    
      <title type="html">📅 Original date posted:2021-08-04 📝 Original message:&amp;gt; ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqs9tfu3s4s5pevquytswep2tsvcxn7s7edq9269esfledphyfyh3zgzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kv3e78p" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqnw7x4v6v8rrpecf30fmzruy83fexa9g43jgmr765gxckasvel5gutk624&#39;&gt;nevent1q…k624&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-08-04&lt;br/&gt;📝 Original message:&amp;gt; Ah I see, this is all limited to within a single epoch.&lt;br/&gt;&lt;br/&gt;No, that wouldn&amp;#39;t be useful. A maximum amount is allowed to be spent within&lt;br/&gt;EVERY epoch.&lt;br/&gt;&lt;br/&gt;Consider an epoch length of 100 blocks with a spend limit of 200k per&lt;br/&gt;epoch. The following is allowed:&lt;br/&gt;&lt;br/&gt;epoch1 (800101 - 800200): spend 120k in block 800140. Remaining for epoch1:&lt;br/&gt;80k;&lt;br/&gt;epoch1 (800101 - 800200): spend another 60k in block 800195. Remaining for&lt;br/&gt;epoch1: 20k;&lt;br/&gt;epoch2 (800201 - 800300): spend 160k in block 800201. Remaining for epoch2:&lt;br/&gt;40k.&lt;br/&gt;&lt;br/&gt;Since the limit pertains to each individual epoch, it is allowed to spend&lt;br/&gt;up to the full limit at the start of any new epoch. In this example, the&lt;br/&gt;spending was as follows:&lt;br/&gt;&lt;br/&gt;800140: 120k&lt;br/&gt;800195: 60k&lt;br/&gt;800201: 160k.&lt;br/&gt;&lt;br/&gt;Note that in a span of 62 blocks a total of 340k sats was spent. This may&lt;br/&gt;seem to violate the 200k limit per 100 blocks, but this is the result of&lt;br/&gt;using a per-epoch limit. This allows a maximum of 400k to be spent in 2&lt;br/&gt;blocks llke so: 200k in the last block of an epoch and another 200k in the&lt;br/&gt;first block of the next epoch. However this is inconsequential for the&lt;br/&gt;intended goal of rate-limiting which is to enable small spends over time&lt;br/&gt;from a large amount and to prevent theft of a large amount with a single&lt;br/&gt;transaction.&lt;br/&gt;&lt;br/&gt;To explain the proposed design more clearly, I have renamed the params as&lt;br/&gt;follows:&lt;br/&gt;&lt;br/&gt;epochStart: block height of first block of the current epoch (was: h0);&lt;br/&gt;epochEnd: block height of last block of the current epoch (was: h1);&lt;br/&gt;limit: the maximum total amount allowed to be spent within the current&lt;br/&gt;epoch (was: a);&lt;br/&gt;remain: the remaining amount allowed to be spent within the current epoch&lt;br/&gt;(was: a_remaining);&lt;br/&gt;&lt;br/&gt;Also, to illustrate that the params are specific to a transaction, I will&lt;br/&gt;hence precede the param with the transaction name like so:&lt;br/&gt;tx8_limit, tx31c_remain, tx42z_epochStart, ... etc.&lt;br/&gt;&lt;br/&gt;For simplicity, only transactions with no more than one rate-limited input&lt;br/&gt;are considered, and with no more than two outputs: one rate-limited change&lt;br/&gt;output, and a normal (not rate-limited) output.&lt;br/&gt;&lt;br/&gt;Normally, a simple transaction generates two outputs: one for a payment to&lt;br/&gt;a third party and one for the change address. Again for simplicity, we&lt;br/&gt;demand that a transaction which introduces rate-limiting must have only a&lt;br/&gt;single, rate-limited output. The validation rule might be: if a transaction&lt;br/&gt;has rate-limiting params and none of its inputs are rate-limited, then&lt;br/&gt;there must be only a single (rate-limited) output (and no second or change&lt;br/&gt;output).&lt;br/&gt;&lt;br/&gt;Consider rate limiting transactions tx1 having one or more normal (non&lt;br/&gt;rate-limited) inputs:&lt;br/&gt;&lt;br/&gt;tx1 gets included at block height 800004;&lt;br/&gt;The inputs of tx1 are not rate-limited =&amp;gt; tx1 must have only a single&lt;br/&gt;output which will become rate-limited;&lt;br/&gt;params: tx1_epochStart=800001, tx1_epochEnd=800100, tx1_limit=200k,&lt;br/&gt;tx1_remain=200k;&lt;br/&gt;=&amp;gt; This defines that an epoch has 100 blocks and no more than 200k sats may&lt;br/&gt;be spent in any one epoch. Within the current epoch, 200k sats may still be&lt;br/&gt;spent.&lt;br/&gt;&lt;br/&gt;This transaction begins to rate-limit a set of inputs, so it has a single&lt;br/&gt;rate-limited output.&lt;br/&gt;Let&amp;#39;s explore transactions that have the output of tx1 as their input. I&lt;br/&gt;will denote the output of tx1 as &amp;#34;out1&amp;#34;.&lt;br/&gt;&lt;br/&gt;tx2a has out1 as its only input;&lt;br/&gt;tx2a spends 50k sats and gets included at block height 803050;&lt;br/&gt;tx2a specifies the following params for its change output &amp;#34;chg2a&amp;#34;:&lt;br/&gt;chg2a_epochStart=803001, chg2a_epochEnd=803100;&lt;br/&gt;chg2a_limit=200k, chg2a_remain=150k.&lt;br/&gt;&lt;br/&gt;To enforce rate-limiting, the system must validate the params of the change&lt;br/&gt;output chg2a to ensure that overspending is not allowed.&lt;br/&gt;&lt;br/&gt;The above params are allowed because:&lt;br/&gt;=&amp;gt; 1. the epoch does not become smaller than 100 blocks [(chg2a_epochEnd -&lt;br/&gt;chg2a_epochStart) &amp;gt;= (tx1_epochEnd - tx1_epochStart)]&lt;br/&gt;=&amp;gt; 2. tx1_limit has not been increased (ch2a_limit &amp;lt;= tx1_limit)&lt;br/&gt;=&amp;gt; 3. the amount spent (50k sats) does not exceed tx1_remain AND does not&lt;br/&gt;exceed chg2a_limit;&lt;br/&gt;=&amp;gt; 4. chg2a_remain&amp;#34; is 50k sats less than chg2a_limit.&lt;br/&gt;&lt;br/&gt;A transaction may also further constrain further spending like so:&lt;br/&gt;&lt;br/&gt;tx2b has out1as its only input;&lt;br/&gt;tx2b spends 8k sats and gets included at block height 808105;&lt;br/&gt;tx2b specifies the following params for its change output &amp;#34;chg2b&amp;#34;:&lt;br/&gt;chg2b_epochStart=808101, chg2b_epochEnd=808250;&lt;br/&gt;chg2b_limit=10k, chg2b_remain=0.&lt;br/&gt;&lt;br/&gt;These params are allowed because:&lt;br/&gt;=&amp;gt; 1. the epoch does not become smaller than100 blocks. It is fine to&lt;br/&gt;increase the epoch to 150 blocks because it does not enable exceeding the&lt;br/&gt;original rate-limit;&lt;br/&gt;=&amp;gt; 2. the limit (chg2b_limit) has been decreased to 10k sats, further&lt;br/&gt;restricting the maximum amount allowed to be spent within the current and&lt;br/&gt;any subsequent epochs;&lt;br/&gt;=&amp;gt; 3. the amount spent (10k sats) does not exceed tx1_remain AND does not&lt;br/&gt;exceed chg2b_limit;&lt;br/&gt;=&amp;gt; 4. chg2b_remain has been set to zero, meaning that within the current&lt;br/&gt;epoch (block height 808101 to and including 808250), tx2b cannot be used as&lt;br/&gt;a spending input to any transaction.&lt;br/&gt;&lt;br/&gt;Starting from block height 808251, a new epoch will start and the&lt;br/&gt;rate-limited output of tx2b may again be used as an input for a subsequent&lt;br/&gt;rate-limited transaction tx3b. This transaction tx3b must again be&lt;br/&gt;accompanied by params that do not violate the rate-limit as defined by the&lt;br/&gt;params of tx2b and which are stored with output out2b. So, the epoch of&lt;br/&gt;tx3b must be at minimum 150 blocks, the maximum that is allowed to be spent&lt;br/&gt;per epoch is at most 10k sats, and chg3b_remain must be decreased by at&lt;br/&gt;least the amount spent by tx3b.&lt;br/&gt;&lt;br/&gt;&amp;gt;From the above, the rate-limiting mechanics should hopefully be clear and&lt;br/&gt;full set of validation rules could be defined in a more generalized way&lt;br/&gt;with little additional effort.&lt;br/&gt;&lt;br/&gt;Note that I conveniently avoided talking about how to represent the&lt;br/&gt;parameters within transactions or outputs, simply because I currently lack&lt;br/&gt;enough understanding to reason about this. I am hoping that others may&lt;br/&gt;offer help.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Tue, Aug 3, 2021 at 8:12 PM Billy Tetrud &amp;lt;billy.tetrud at gmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; &amp;gt; To enable more straightforward validation logic.&lt;br/&gt;&amp;gt; &amp;gt; within the current epoch&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Ah I see, this is all limited to within a single epoch. I think that&lt;br/&gt;&amp;gt; sufficiently limits the window of time in which nodes have to store&lt;br/&gt;&amp;gt; information for rate limited outputs. However, I don&amp;#39;t see how specifying&lt;br/&gt;&amp;gt; block ranges simplifies the logic - wouldn&amp;#39;t this complicate the logic with&lt;br/&gt;&amp;gt; additional user-specified constraints? It also prevents the output from&lt;br/&gt;&amp;gt; being able to be rate limited over the span of multiple epochs, which would&lt;br/&gt;&amp;gt; seem to make it a lot more difficult to use for certain types of wallets&lt;br/&gt;&amp;gt; (eg cold wallets).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I think I see the logic of your &amp;#39;remaining&amp;#39; parameter there. If you start&lt;br/&gt;&amp;gt; with a single rate-limited input, you can split that into many outputs,&lt;br/&gt;&amp;gt; only one of which have a &amp;#39;remaining&amp;#39; balance. The rest can simply remain&lt;br/&gt;&amp;gt; unspendable for the rest of the epoch. That way these things don&amp;#39;t need to&lt;br/&gt;&amp;gt; be tied together. However, that doesn&amp;#39;t solve the problem of 3rd parties&lt;br/&gt;&amp;gt; being able to send money into the wallet.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; I don&amp;#39;t believe that the marginal added functionality would justify the&lt;br/&gt;&amp;gt; increased implementation complexity&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Perhaps, but I think there is a lot of benefit in allowing these kinds of&lt;br/&gt;&amp;gt; things to operate as similarly as possible to normal transactions, for one&lt;br/&gt;&amp;gt; because of usability reasons. If each opcode has its own quirks that are&lt;br/&gt;&amp;gt; not intuitively related to their purpose (eg if a rate-limited wallet had&lt;br/&gt;&amp;gt; no way to get a receiving address), it would confuse end-users (eg who&lt;br/&gt;&amp;gt; wonder how to get a receiving address and how they can ask people to send&lt;br/&gt;&amp;gt; money into their wallet) or require a lot of technical complexity in&lt;br/&gt;&amp;gt; applications (eg to support something like cooperatively connecting with&lt;br/&gt;&amp;gt; their wallet so that a transaction can be made that creates a new&lt;br/&gt;&amp;gt; single-output for the wallet). A little complexity in this opcode can save&lt;br/&gt;&amp;gt; a lot of external complexity here I think.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; my understanding of Bitcoin is way too low to be able to write a BIP and&lt;br/&gt;&amp;gt; do the implementation&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; You might be able to find people willing to help. I would be willing to&lt;br/&gt;&amp;gt; help write the BIP spec. I&amp;#39;m not the right person to help with the&lt;br/&gt;&amp;gt; implementation, but perhaps you could find someone else who is. Even if the&lt;br/&gt;&amp;gt; BIP isn&amp;#39;t adopted, it could be a starting point or inspiration for someone&lt;br/&gt;&amp;gt; else to write an improved version.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; On Mon, Aug 2, 2021 at 2:32 AM Zac Greenwood &amp;lt;zachgrw at gmail.com&amp;gt; wrote:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; [Note: I&amp;#39;ve moved your reply to the newly started thread]&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Hi Billy,&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Thank you for your kind and encouraging feedback.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; I don&amp;#39;t quite understand why you&amp;#39;d want to define a specific span of&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; blocks for the rate limit. Why not just specify the size of the window (in&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; blocks) to rate limit within, and the limit?&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; To enable more straightforward validation logic.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; You mentioned change addresses, however, with the parameters you defined,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; there would be no way to connect together the change address with the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; original address, meaning they would have completely separate rate limits,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; which wouldn&amp;#39;t work since the change output would ignore the previous rate&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; limit.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; The rate-limiting parameters must be re-specified for each rate-limited&lt;br/&gt;&amp;gt;&amp;gt; input. So, a transaction that has a rate-limited input is only valid if its&lt;br/&gt;&amp;gt;&amp;gt; output is itself rate-limited such that it does not violate the&lt;br/&gt;&amp;gt;&amp;gt; rate-limiting constraints of its input.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; In my thread-starter, I gave the below example of a rate-limited address&lt;br/&gt;&amp;gt;&amp;gt; a2 that serves as input for transaction t2:&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; a2: 99.8 sats at height 800100;&lt;br/&gt;&amp;gt;&amp;gt; Rate-limit params: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Transaction t2:&lt;br/&gt;&amp;gt;&amp;gt; Included at block height 800200&lt;br/&gt;&amp;gt;&amp;gt; Spend: 400k &#43; fees.&lt;br/&gt;&amp;gt;&amp;gt; Rate-limiting params: h0=800144, h1=800287, a=500k, a_remaining=100k.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Note how transaction t2 re-specifies the rate-limiting parameters.&lt;br/&gt;&amp;gt;&amp;gt; Validation must ensure that the re-specified parameters are within bounds,&lt;br/&gt;&amp;gt;&amp;gt; i.e., do not allow more spending per epoch than the rate-limiting&lt;br/&gt;&amp;gt;&amp;gt; parameters of its input address a2. Re-specifying the rate-limiting&lt;br/&gt;&amp;gt;&amp;gt; parameters offers the flexibility to further restrict spending, or to&lt;br/&gt;&amp;gt;&amp;gt; disable any additional spending within the current epoch by setting&lt;br/&gt;&amp;gt;&amp;gt; a_remaining to zero.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Result:&lt;br/&gt;&amp;gt;&amp;gt; Value at destination address: 400k sats;&lt;br/&gt;&amp;gt;&amp;gt; Rate limiting params at destination address: none;&lt;br/&gt;&amp;gt;&amp;gt; Value at change address a3: 99.4m sats;&lt;br/&gt;&amp;gt;&amp;gt; Rate limiting params at change address a3: h0=800144, h1=800287, a=500k,&lt;br/&gt;&amp;gt;&amp;gt; a_remaining=100k.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; As a design principle I believe it makes sense if the system is able to&lt;br/&gt;&amp;gt;&amp;gt; verify the validity of a transaction without having to consider any&lt;br/&gt;&amp;gt;&amp;gt; transactions that precede its inputs. As a side-note, doing away with this&lt;br/&gt;&amp;gt;&amp;gt; design principle would however enable more sophisticated rate-limiting&lt;br/&gt;&amp;gt;&amp;gt; (such as rate-limiting per sliding window instead of rate-limiting per&lt;br/&gt;&amp;gt;&amp;gt; epoch having a fixed start and end block), but while at the same time&lt;br/&gt;&amp;gt;&amp;gt; reducing the size of per rate-limiting transaction (because it would enable&lt;br/&gt;&amp;gt;&amp;gt; specifying the rate-limiting parameters more space-efficiently). To test&lt;br/&gt;&amp;gt;&amp;gt; the waters and to keep things relatively simple, I chose not to go into&lt;br/&gt;&amp;gt;&amp;gt; this enhanced form of rate-limiting.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; I haven&amp;#39;t gone into how to process a transaction having multiple&lt;br/&gt;&amp;gt;&amp;gt; rate-limited inputs. The easiest way to handle this case is to not allow&lt;br/&gt;&amp;gt;&amp;gt; any transaction having more than one rate-limited input. One could imagine&lt;br/&gt;&amp;gt;&amp;gt; complex logic to handle transactions having multiple rate-limited inputs by&lt;br/&gt;&amp;gt;&amp;gt; creating multiple rate-limited change addresses. However at first glance I&lt;br/&gt;&amp;gt;&amp;gt; don&amp;#39;t believe that the marginal added functionality would justify the&lt;br/&gt;&amp;gt;&amp;gt; increased implementation complexity.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;  I&amp;#39;d be interested in seeing you write a BIP for this.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Thank you, but sadly my understanding of Bitcoin is way too low to be&lt;br/&gt;&amp;gt;&amp;gt; able to write a BIP and do the implementation. However I see tremendous&lt;br/&gt;&amp;gt;&amp;gt; value in this functionality. Favorable feedback of the list regarding the&lt;br/&gt;&amp;gt;&amp;gt; usefulness and the technical feasibility of rate-limiting functionality&lt;br/&gt;&amp;gt;&amp;gt; would of course be an encouragement for me to descend further down the&lt;br/&gt;&amp;gt;&amp;gt; rabbit hole.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Zac&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; On Sun, Aug 1, 2021 at 10:09 AM Zac Greenwood &amp;lt;zachgrw at gmail.com&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; [Resubmitting to list with minor edits. My previous submission ended up&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; inside an existing thread, apologies.]&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Hi list,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; I&amp;#39;d like to explore whether it is feasible to implement new scripting&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; capabilities in Bitcoin that enable limiting the output amount of a&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; transaction based on the total value of its inputs. In other words, to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; implement the ability to limit the maximum amount that can be sent from an&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; address.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Two use cases come to mind:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; UC1: enable a user to add additional protection their funds by&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; rate-limiting the amount that they are allowed to send during a certain&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; period (measured in blocks). A typical use case might be a user that&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; intends to hodl their bitcoin, but still wishes to occasionally send small&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; amounts. Rate-limiting avoids an attacker from sweeping all the users&amp;#39;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; funds in a single transaction, allowing the user to become aware of the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; theft and intervene to prevent further thefts.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; UC2: exchanges may wish to rate-limit addresses containing large amounts&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; of bitcoin, adding warm- or hot-wallet functionality to a cold-storage&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; address. This would enable an exchange to drastically reduce the number of&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; times a cold wallet must be accessed with private keys that give access to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; the full amount.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; In a typical setup, I&amp;#39;d envision using multisig such that the user has&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; two sets of private keys to their encumbered address (with a &amp;#34;set&amp;#34; of keys&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; meaning &amp;#34;one or more&amp;#34; keys). One set of private keys allows only for&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; sending with rate-limiting restrictions in place, and a second set of&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; private keys allowing for sending any amount without rate-limiting,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; effectively overriding such restriction.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; The parameters that define in what way an output is rate-limited might&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; be defined as follows:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Param 1: a block height &amp;#34;h0&amp;#34; indicating the first block height of an&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; epoch;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Param 2: a block height &amp;#34;h1&amp;#34; indicating the last block height of an&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; epoch;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Param 3: an amount &amp;#34;a&amp;#34; in satoshi indicating the maximum amount that is&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; allowed to be sent in any epoch;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Param 4: an amount &amp;#34;a_remaining&amp;#34; (in satoshi) indicating the maximum&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; amount that is allowed to be sent within the current epoch.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; For example, consider an input containing 100m sats (1 BTC) which has&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; been rate-limited with parameters (h0, h1, a, a_remaining) of (800000,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; 800143, 500k, 500k). These parameters define that the address is&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; rate-limited to sending a maximum of 500k sats in the current epoch that&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; starts at block height 800000 and ends at height 800143 (or about one day&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; ignoring block time variance) and that the full amount of 500k is still&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; sendable. These rate-limiting parameters ensure that it takes at minimum&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; 100m / 500k = 200 transactions and 200 x 144 blocks or about 200 days to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; spend the full 100m sats. As noted earlier, in a typical setup a user&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; should retain the option to transact the entire amount using a second (set&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; of) private key(s).&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; For rate-limiting to work, any change output created by a transaction&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; from a rate-limited address must itself be rate-limited as well. For&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; instance, expanding on the above example, assume that the user spends 200k&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; sats from a rate-limited address a1 containing 100m sats:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Start situation:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; At block height 800000: rate-limited address a1 is created;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Value of a1: 100.0m sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params of a1: h0=800000, h1=800143, a=500k,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; a_remaining=500k;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Transaction t1:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Included at block height 800100;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Spend: 200k &#43; fee;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params: h0=800000, h1=800143, a=500k, a_remaining=300k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Result:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Value at destination address: 200k sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params at destination address: none;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Value at change address a2: 99.8m sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params at change address a2: h0=800000, h1=800143, a=500k,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; a_remaining=300k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; In order to properly enforce rate limiting, the change address must be&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; rate-limited such that the original rate limit of 500k sats per 144 blocks&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; cannot be exceeded. In this example, the change address a2 were given the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; same rate limiting parameters as the transaction that served as its input.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; As a result, from block 800100 up until and including block 800143, a&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; maximum amount of 300k sats is allowed to be spent from the change address.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Example continued:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; a2: 99.8 sats at height 800100;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Rate-limit params: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Transaction t2:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Included at block height 800200&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Spend: 400k &#43; fees.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Rate-limiting params: h0=800144, h1=800287, a=500k, a_remaining=100k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Result:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Value at destination address: 400k sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params at destination address: none;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Value at change address a3: 99.4m sats;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Rate limiting params at change address a3: h0=800144, h1=800287, a=500k,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; a_remaining=100k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Transaction t2 is allowed because it falls within the next epoch&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; (running from 800144 to 800287) so a spend of 400k does not violate the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; constraint of 500k per epoch.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; As could be seen, the rate limiting parameters are part of the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; transaction and chosen by the user (or their wallet). This means that the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; parameters must be validated to ensure that they do not violate the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; intended constraints.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; For instance, this transaction should not be allowed:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; a2: 99.8 sats at height 800100;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Rate-limit params of a2: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Transaction t2a:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Included at block height 800200;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Spend: 400k &#43; fees;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Rate-limit params: h0=800124, h1=800267, a=500k, a_remaining=100k.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; This transaction t2a attempts to shift the epoch forward by 20 blocks&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; such that it starts at 800124 instead of 800144. Shifting the epoch forward&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; like this must not be allowed because it enables spending more that the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; rate limit allows, which is 500k in any epoch of 144 blocks. It would&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; enable overspending:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; t1: spend 200k at 800100 (epoch 1: total: 200k);&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; t2a: spend 400k at 800200 (epoch 2: total: 400k);&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; t3a: spend 100k at 800201 (epoch 2: total: 500k);&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; t4a: spend 500k at 800268 (epoch 2: total: 1000k, overspending for epoch&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; 2).&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Specifying the rate-limiting parameters explicitly at every transaction&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; allows the user to tighten the spending limit by setting tighter limits or&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; for instance by setting a_remainder to 0 if they wish to enforce not&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; spending more during an epoch. A second advantage of explicitly specifying&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; the four rate-limiting parameters with each transaction is that it allows&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; the system to fully validate the transaction without having to consider any&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; previous transactions within an epoch.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; I will stop here because I would like to gauge interest in this idea&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; first before continuing work on other aspects. Two main pieces of work jump&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; to mind:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Define all validations;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Describe aggregate behaviour of multiple (rate-limited) inputs, proof&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; that two rate-limited addresses cannot spend more than the sum of their&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; individual limits.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Zac&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;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/20210804/d529d396/attachment-0001.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210804/d529d396/attachment-0001.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:57:24Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsxnx3ffjlemmgerss66uk8xasn7ltdqr5jy4z98jt58artv7zu65szypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675khyqu2l</id>
    
      <title type="html">📅 Original date posted:2021-08-02 📝 Original message:[Note: ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsxnx3ffjlemmgerss66uk8xasn7ltdqr5jy4z98jt58artv7zu65szypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675khyqu2l" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8gpmkudv7598vzyd56ukgxmzxywn3f5xvkyxjlqcsr773crhatysa0e8cl&#39;&gt;nevent1q…e8cl&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-08-02&lt;br/&gt;📝 Original message:[Note: I&amp;#39;ve moved your reply to the newly started thread]&lt;br/&gt;&lt;br/&gt;Hi Billy,&lt;br/&gt;&lt;br/&gt;Thank you for your kind and encouraging feedback.&lt;br/&gt;&lt;br/&gt;I don&amp;#39;t quite understand why you&amp;#39;d want to define a specific span of blocks&lt;br/&gt;&amp;gt; for the rate limit. Why not just specify the size of the window (in blocks)&lt;br/&gt;&amp;gt; to rate limit within, and the limit?&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;To enable more straightforward validation logic.&lt;br/&gt;&lt;br/&gt;You mentioned change addresses, however, with the parameters you defined,&lt;br/&gt;&amp;gt; there would be no way to connect together the change address with the&lt;br/&gt;&amp;gt; original address, meaning they would have completely separate rate limits,&lt;br/&gt;&amp;gt; which wouldn&amp;#39;t work since the change output would ignore the previous rate&lt;br/&gt;&amp;gt; limit.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;The rate-limiting parameters must be re-specified for each rate-limited&lt;br/&gt;input. So, a transaction that has a rate-limited input is only valid if its&lt;br/&gt;output is itself rate-limited such that it does not violate the&lt;br/&gt;rate-limiting constraints of its input.&lt;br/&gt;&lt;br/&gt;In my thread-starter, I gave the below example of a rate-limited address a2&lt;br/&gt;that serves as input for transaction t2:&lt;br/&gt;&lt;br/&gt;a2: 99.8 sats at height 800100;&lt;br/&gt;Rate-limit params: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&lt;br/&gt;Transaction t2:&lt;br/&gt;Included at block height 800200&lt;br/&gt;Spend: 400k &#43; fees.&lt;br/&gt;Rate-limiting params: h0=800144, h1=800287, a=500k, a_remaining=100k.&lt;br/&gt;&lt;br/&gt;Note how transaction t2 re-specifies the rate-limiting parameters.&lt;br/&gt;Validation must ensure that the re-specified parameters are within bounds,&lt;br/&gt;i.e., do not allow more spending per epoch than the rate-limiting&lt;br/&gt;parameters of its input address a2. Re-specifying the rate-limiting&lt;br/&gt;parameters offers the flexibility to further restrict spending, or to&lt;br/&gt;disable any additional spending within the current epoch by setting&lt;br/&gt;a_remaining to zero.&lt;br/&gt;&lt;br/&gt;Result:&lt;br/&gt;Value at destination address: 400k sats;&lt;br/&gt;Rate limiting params at destination address: none;&lt;br/&gt;Value at change address a3: 99.4m sats;&lt;br/&gt;Rate limiting params at change address a3: h0=800144, h1=800287, a=500k,&lt;br/&gt;a_remaining=100k.&lt;br/&gt;&lt;br/&gt;As a design principle I believe it makes sense if the system is able to&lt;br/&gt;verify the validity of a transaction without having to consider any&lt;br/&gt;transactions that precede its inputs. As a side-note, doing away with this&lt;br/&gt;design principle would however enable more sophisticated rate-limiting&lt;br/&gt;(such as rate-limiting per sliding window instead of rate-limiting per&lt;br/&gt;epoch having a fixed start and end block), but while at the same time&lt;br/&gt;reducing the size of per rate-limiting transaction (because it would enable&lt;br/&gt;specifying the rate-limiting parameters more space-efficiently). To test&lt;br/&gt;the waters and to keep things relatively simple, I chose not to go into&lt;br/&gt;this enhanced form of rate-limiting.&lt;br/&gt;&lt;br/&gt;I haven&amp;#39;t gone into how to process a transaction having multiple&lt;br/&gt;rate-limited inputs. The easiest way to handle this case is to not allow&lt;br/&gt;any transaction having more than one rate-limited input. One could imagine&lt;br/&gt;complex logic to handle transactions having multiple rate-limited inputs by&lt;br/&gt;creating multiple rate-limited change addresses. However at first glance I&lt;br/&gt;don&amp;#39;t believe that the marginal added functionality would justify the&lt;br/&gt;increased implementation complexity.&lt;br/&gt;&lt;br/&gt; I&amp;#39;d be interested in seeing you write a BIP for this.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Thank you, but sadly my understanding of Bitcoin is way too low to be able&lt;br/&gt;to write a BIP and do the implementation. However I see tremendous value in&lt;br/&gt;this functionality. Favorable feedback of the list regarding the usefulness&lt;br/&gt;and the technical feasibility of rate-limiting functionality would of&lt;br/&gt;course be an encouragement for me to descend further down the rabbit hole.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Sun, Aug 1, 2021 at 10:09 AM Zac Greenwood &amp;lt;zachgrw at gmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; [Resubmitting to list with minor edits. My previous submission ended up&lt;br/&gt;&amp;gt; inside an existing thread, apologies.]&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Hi list,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I&amp;#39;d like to explore whether it is feasible to implement new scripting&lt;br/&gt;&amp;gt; capabilities in Bitcoin that enable limiting the output amount of a&lt;br/&gt;&amp;gt; transaction based on the total value of its inputs. In other words, to&lt;br/&gt;&amp;gt; implement the ability to limit the maximum amount that can be sent from an&lt;br/&gt;&amp;gt; address.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Two use cases come to mind:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; UC1: enable a user to add additional protection their funds by&lt;br/&gt;&amp;gt; rate-limiting the amount that they are allowed to send during a certain&lt;br/&gt;&amp;gt; period (measured in blocks). A typical use case might be a user that&lt;br/&gt;&amp;gt; intends to hodl their bitcoin, but still wishes to occasionally send small&lt;br/&gt;&amp;gt; amounts. Rate-limiting avoids an attacker from sweeping all the users&amp;#39;&lt;br/&gt;&amp;gt; funds in a single transaction, allowing the user to become aware of the&lt;br/&gt;&amp;gt; theft and intervene to prevent further thefts.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; UC2: exchanges may wish to rate-limit addresses containing large amounts&lt;br/&gt;&amp;gt; of bitcoin, adding warm- or hot-wallet functionality to a cold-storage&lt;br/&gt;&amp;gt; address. This would enable an exchange to drastically reduce the number of&lt;br/&gt;&amp;gt; times a cold wallet must be accessed with private keys that give access to&lt;br/&gt;&amp;gt; the full amount.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; In a typical setup, I&amp;#39;d envision using multisig such that the user has two&lt;br/&gt;&amp;gt; sets of private keys to their encumbered address (with a &amp;#34;set&amp;#34; of keys&lt;br/&gt;&amp;gt; meaning &amp;#34;one or more&amp;#34; keys). One set of private keys allows only for&lt;br/&gt;&amp;gt; sending with rate-limiting restrictions in place, and a second set of&lt;br/&gt;&amp;gt; private keys allowing for sending any amount without rate-limiting,&lt;br/&gt;&amp;gt; effectively overriding such restriction.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; The parameters that define in what way an output is rate-limited might be&lt;br/&gt;&amp;gt; defined as follows:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Param 1: a block height &amp;#34;h0&amp;#34; indicating the first block height of an epoch;&lt;br/&gt;&amp;gt; Param 2: a block height &amp;#34;h1&amp;#34; indicating the last block height of an epoch;&lt;br/&gt;&amp;gt; Param 3: an amount &amp;#34;a&amp;#34; in satoshi indicating the maximum amount that is&lt;br/&gt;&amp;gt; allowed to be sent in any epoch;&lt;br/&gt;&amp;gt; Param 4: an amount &amp;#34;a_remaining&amp;#34; (in satoshi) indicating the maximum&lt;br/&gt;&amp;gt; amount that is allowed to be sent within the current epoch.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; For example, consider an input containing 100m sats (1 BTC) which has been&lt;br/&gt;&amp;gt; rate-limited with parameters (h0, h1, a, a_remaining) of (800000, 800143,&lt;br/&gt;&amp;gt; 500k, 500k). These parameters define that the address is rate-limited to&lt;br/&gt;&amp;gt; sending a maximum of 500k sats in the current epoch that starts at block&lt;br/&gt;&amp;gt; height 800000 and ends at height 800143 (or about one day ignoring block&lt;br/&gt;&amp;gt; time variance) and that the full amount of 500k is still sendable. These&lt;br/&gt;&amp;gt; rate-limiting parameters ensure that it takes at minimum 100m / 500k = 200&lt;br/&gt;&amp;gt; transactions and 200 x 144 blocks or about 200 days to spend the full 100m&lt;br/&gt;&amp;gt; sats. As noted earlier, in a typical setup a user should retain the option&lt;br/&gt;&amp;gt; to transact the entire amount using a second (set of) private key(s).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; For rate-limiting to work, any change output created by a transaction from&lt;br/&gt;&amp;gt; a rate-limited address must itself be rate-limited as well. For instance,&lt;br/&gt;&amp;gt; expanding on the above example, assume that the user spends 200k sats from&lt;br/&gt;&amp;gt; a rate-limited address a1 containing 100m sats:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Start situation:&lt;br/&gt;&amp;gt; At block height 800000: rate-limited address a1 is created;&lt;br/&gt;&amp;gt; Value of a1: 100.0m sats;&lt;br/&gt;&amp;gt; Rate limiting params of a1: h0=800000, h1=800143, a=500k, a_remaining=500k;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Transaction t1:&lt;br/&gt;&amp;gt; Included at block height 800100;&lt;br/&gt;&amp;gt; Spend: 200k &#43; fee;&lt;br/&gt;&amp;gt; Rate limiting params: h0=800000, h1=800143, a=500k, a_remaining=300k.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Result:&lt;br/&gt;&amp;gt; Value at destination address: 200k sats;&lt;br/&gt;&amp;gt; Rate limiting params at destination address: none;&lt;br/&gt;&amp;gt; Value at change address a2: 99.8m sats;&lt;br/&gt;&amp;gt; Rate limiting params at change address a2: h0=800000, h1=800143, a=500k,&lt;br/&gt;&amp;gt; a_remaining=300k.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; In order to properly enforce rate limiting, the change address must be&lt;br/&gt;&amp;gt; rate-limited such that the original rate limit of 500k sats per 144 blocks&lt;br/&gt;&amp;gt; cannot be exceeded. In this example, the change address a2 were given the&lt;br/&gt;&amp;gt; same rate limiting parameters as the transaction that served as its input.&lt;br/&gt;&amp;gt; As a result, from block 800100 up until and including block 800143, a&lt;br/&gt;&amp;gt; maximum amount of 300k sats is allowed to be spent from the change address.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Example continued:&lt;br/&gt;&amp;gt; a2: 99.8 sats at height 800100;&lt;br/&gt;&amp;gt; Rate-limit params: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Transaction t2:&lt;br/&gt;&amp;gt; Included at block height 800200&lt;br/&gt;&amp;gt; Spend: 400k &#43; fees.&lt;br/&gt;&amp;gt; Rate-limiting params: h0=800144, h1=800287, a=500k, a_remaining=100k.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Result:&lt;br/&gt;&amp;gt; Value at destination address: 400k sats;&lt;br/&gt;&amp;gt; Rate limiting params at destination address: none;&lt;br/&gt;&amp;gt; Value at change address a3: 99.4m sats;&lt;br/&gt;&amp;gt; Rate limiting params at change address a3: h0=800144, h1=800287, a=500k,&lt;br/&gt;&amp;gt; a_remaining=100k.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Transaction t2 is allowed because it falls within the next epoch (running&lt;br/&gt;&amp;gt; from 800144 to 800287) so a spend of 400k does not violate the constraint&lt;br/&gt;&amp;gt; of 500k per epoch.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; As could be seen, the rate limiting parameters are part of the transaction&lt;br/&gt;&amp;gt; and chosen by the user (or their wallet). This means that the parameters&lt;br/&gt;&amp;gt; must be validated to ensure that they do not violate the intended&lt;br/&gt;&amp;gt; constraints.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; For instance, this transaction should not be allowed:&lt;br/&gt;&amp;gt; a2: 99.8 sats at height 800100;&lt;br/&gt;&amp;gt; Rate-limit params of a2: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Transaction t2a:&lt;br/&gt;&amp;gt; Included at block height 800200;&lt;br/&gt;&amp;gt; Spend: 400k &#43; fees;&lt;br/&gt;&amp;gt; Rate-limit params: h0=800124, h1=800267, a=500k, a_remaining=100k.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; This transaction t2a attempts to shift the epoch forward by 20 blocks such&lt;br/&gt;&amp;gt; that it starts at 800124 instead of 800144. Shifting the epoch forward like&lt;br/&gt;&amp;gt; this must not be allowed because it enables spending more that the rate&lt;br/&gt;&amp;gt; limit allows, which is 500k in any epoch of 144 blocks. It would enable&lt;br/&gt;&amp;gt; overspending:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; t1: spend 200k at 800100 (epoch 1: total: 200k);&lt;br/&gt;&amp;gt; t2a: spend 400k at 800200 (epoch 2: total: 400k);&lt;br/&gt;&amp;gt; t3a: spend 100k at 800201 (epoch 2: total: 500k);&lt;br/&gt;&amp;gt; t4a: spend 500k at 800268 (epoch 2: total: 1000k, overspending for epoch&lt;br/&gt;&amp;gt; 2).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Specifying the rate-limiting parameters explicitly at every transaction&lt;br/&gt;&amp;gt; allows the user to tighten the spending limit by setting tighter limits or&lt;br/&gt;&amp;gt; for instance by setting a_remainder to 0 if they wish to enforce not&lt;br/&gt;&amp;gt; spending more during an epoch. A second advantage of explicitly specifying&lt;br/&gt;&amp;gt; the four rate-limiting parameters with each transaction is that it allows&lt;br/&gt;&amp;gt; the system to fully validate the transaction without having to consider any&lt;br/&gt;&amp;gt; previous transactions within an epoch.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I will stop here because I would like to gauge interest in this idea first&lt;br/&gt;&amp;gt; before continuing work on other aspects. Two main pieces of work jump to&lt;br/&gt;&amp;gt; mind:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Define all validations;&lt;br/&gt;&amp;gt; Describe aggregate behaviour of multiple (rate-limited) inputs, proof that&lt;br/&gt;&amp;gt; two rate-limited addresses cannot spend more than the sum of their&lt;br/&gt;&amp;gt; individual limits.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Zac&lt;br/&gt;&amp;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/20210802/49badd38/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210802/49badd38/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:57:21Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsfqzhkyl4s47f6ek32ht39zlep8lemkntg6gz3yyq767dd5a6gzngzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675khf40mt</id>
    
      <title type="html">📅 Original date posted:2021-08-01 📝 Original ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsfqzhkyl4s47f6ek32ht39zlep8lemkntg6gz3yyq767dd5a6gzngzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675khf40mt" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsx42wfcglvxhstuekq478fm5nf0atmjtk4jer8ut9t9k3qs89a0yqgxjg5n&#39;&gt;nevent1q…jg5n&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-08-01&lt;br/&gt;📝 Original message:[Resubmitting to list with minor edits. My previous submission ended up&lt;br/&gt;inside an existing thread, apologies.]&lt;br/&gt;&lt;br/&gt;Hi list,&lt;br/&gt;&lt;br/&gt;I&amp;#39;d like to explore whether it is feasible to implement new scripting&lt;br/&gt;capabilities in Bitcoin that enable limiting the output amount of a&lt;br/&gt;transaction based on the total value of its inputs. In other words, to&lt;br/&gt;implement the ability to limit the maximum amount that can be sent from an&lt;br/&gt;address.&lt;br/&gt;&lt;br/&gt;Two use cases come to mind:&lt;br/&gt;&lt;br/&gt;UC1: enable a user to add additional protection their funds by&lt;br/&gt;rate-limiting the amount that they are allowed to send during a certain&lt;br/&gt;period (measured in blocks). A typical use case might be a user that&lt;br/&gt;intends to hodl their bitcoin, but still wishes to occasionally send small&lt;br/&gt;amounts. Rate-limiting avoids an attacker from sweeping all the users&amp;#39;&lt;br/&gt;funds in a single transaction, allowing the user to become aware of the&lt;br/&gt;theft and intervene to prevent further thefts.&lt;br/&gt;&lt;br/&gt;UC2: exchanges may wish to rate-limit addresses containing large amounts of&lt;br/&gt;bitcoin, adding warm- or hot-wallet functionality to a cold-storage&lt;br/&gt;address. This would enable an exchange to drastically reduce the number of&lt;br/&gt;times a cold wallet must be accessed with private keys that give access to&lt;br/&gt;the full amount.&lt;br/&gt;&lt;br/&gt;In a typical setup, I&amp;#39;d envision using multisig such that the user has two&lt;br/&gt;sets of private keys to their encumbered address (with a &amp;#34;set&amp;#34; of keys&lt;br/&gt;meaning &amp;#34;one or more&amp;#34; keys). One set of private keys allows only for&lt;br/&gt;sending with rate-limiting restrictions in place, and a second set of&lt;br/&gt;private keys allowing for sending any amount without rate-limiting,&lt;br/&gt;effectively overriding such restriction.&lt;br/&gt;&lt;br/&gt;The parameters that define in what way an output is rate-limited might be&lt;br/&gt;defined as follows:&lt;br/&gt;&lt;br/&gt;Param 1: a block height &amp;#34;h0&amp;#34; indicating the first block height of an epoch;&lt;br/&gt;Param 2: a block height &amp;#34;h1&amp;#34; indicating the last block height of an epoch;&lt;br/&gt;Param 3: an amount &amp;#34;a&amp;#34; in satoshi indicating the maximum amount that is&lt;br/&gt;allowed to be sent in any epoch;&lt;br/&gt;Param 4: an amount &amp;#34;a_remaining&amp;#34; (in satoshi) indicating the maximum amount&lt;br/&gt;that is allowed to be sent within the current epoch.&lt;br/&gt;&lt;br/&gt;For example, consider an input containing 100m sats (1 BTC) which has been&lt;br/&gt;rate-limited with parameters (h0, h1, a, a_remaining) of (800000, 800143,&lt;br/&gt;500k, 500k). These parameters define that the address is rate-limited to&lt;br/&gt;sending a maximum of 500k sats in the current epoch that starts at block&lt;br/&gt;height 800000 and ends at height 800143 (or about one day ignoring block&lt;br/&gt;time variance) and that the full amount of 500k is still sendable. These&lt;br/&gt;rate-limiting parameters ensure that it takes at minimum 100m / 500k = 200&lt;br/&gt;transactions and 200 x 144 blocks or about 200 days to spend the full 100m&lt;br/&gt;sats. As noted earlier, in a typical setup a user should retain the option&lt;br/&gt;to transact the entire amount using a second (set of) private key(s).&lt;br/&gt;&lt;br/&gt;For rate-limiting to work, any change output created by a transaction from&lt;br/&gt;a rate-limited address must itself be rate-limited as well. For instance,&lt;br/&gt;expanding on the above example, assume that the user spends 200k sats from&lt;br/&gt;a rate-limited address a1 containing 100m sats:&lt;br/&gt;&lt;br/&gt;Start situation:&lt;br/&gt;At block height 800000: rate-limited address a1 is created;&lt;br/&gt;Value of a1: 100.0m sats;&lt;br/&gt;Rate limiting params of a1: h0=800000, h1=800143, a=500k, a_remaining=500k;&lt;br/&gt;&lt;br/&gt;Transaction t1:&lt;br/&gt;Included at block height 800100;&lt;br/&gt;Spend: 200k &#43; fee;&lt;br/&gt;Rate limiting params: h0=800000, h1=800143, a=500k, a_remaining=300k.&lt;br/&gt;&lt;br/&gt;Result:&lt;br/&gt;Value at destination address: 200k sats;&lt;br/&gt;Rate limiting params at destination address: none;&lt;br/&gt;Value at change address a2: 99.8m sats;&lt;br/&gt;Rate limiting params at change address a2: h0=800000, h1=800143, a=500k,&lt;br/&gt;a_remaining=300k.&lt;br/&gt;&lt;br/&gt;In order to properly enforce rate limiting, the change address must be&lt;br/&gt;rate-limited such that the original rate limit of 500k sats per 144 blocks&lt;br/&gt;cannot be exceeded. In this example, the change address a2 were given the&lt;br/&gt;same rate limiting parameters as the transaction that served as its input.&lt;br/&gt;As a result, from block 800100 up until and including block 800143, a&lt;br/&gt;maximum amount of 300k sats is allowed to be spent from the change address.&lt;br/&gt;&lt;br/&gt;Example continued:&lt;br/&gt;a2: 99.8 sats at height 800100;&lt;br/&gt;Rate-limit params: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&lt;br/&gt;Transaction t2:&lt;br/&gt;Included at block height 800200&lt;br/&gt;Spend: 400k &#43; fees.&lt;br/&gt;Rate-limiting params: h0=800144, h1=800287, a=500k, a_remaining=100k.&lt;br/&gt;&lt;br/&gt;Result:&lt;br/&gt;Value at destination address: 400k sats;&lt;br/&gt;Rate limiting params at destination address: none;&lt;br/&gt;Value at change address a3: 99.4m sats;&lt;br/&gt;Rate limiting params at change address a3: h0=800144, h1=800287, a=500k,&lt;br/&gt;a_remaining=100k.&lt;br/&gt;&lt;br/&gt;Transaction t2 is allowed because it falls within the next epoch (running&lt;br/&gt;from 800144 to 800287) so a spend of 400k does not violate the constraint&lt;br/&gt;of 500k per epoch.&lt;br/&gt;&lt;br/&gt;As could be seen, the rate limiting parameters are part of the transaction&lt;br/&gt;and chosen by the user (or their wallet). This means that the parameters&lt;br/&gt;must be validated to ensure that they do not violate the intended&lt;br/&gt;constraints.&lt;br/&gt;&lt;br/&gt;For instance, this transaction should not be allowed:&lt;br/&gt;a2: 99.8 sats at height 800100;&lt;br/&gt;Rate-limit params of a2: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&lt;br/&gt;Transaction t2a:&lt;br/&gt;Included at block height 800200;&lt;br/&gt;Spend: 400k &#43; fees;&lt;br/&gt;Rate-limit params: h0=800124, h1=800267, a=500k, a_remaining=100k.&lt;br/&gt;&lt;br/&gt;This transaction t2a attempts to shift the epoch forward by 20 blocks such&lt;br/&gt;that it starts at 800124 instead of 800144. Shifting the epoch forward like&lt;br/&gt;this must not be allowed because it enables spending more that the rate&lt;br/&gt;limit allows, which is 500k in any epoch of 144 blocks. It would enable&lt;br/&gt;overspending:&lt;br/&gt;&lt;br/&gt;t1: spend 200k at 800100 (epoch 1: total: 200k);&lt;br/&gt;t2a: spend 400k at 800200 (epoch 2: total: 400k);&lt;br/&gt;t3a: spend 100k at 800201 (epoch 2: total: 500k);&lt;br/&gt;t4a: spend 500k at 800268 (epoch 2: total: 1000k, overspending for epoch 2).&lt;br/&gt;&lt;br/&gt;Specifying the rate-limiting parameters explicitly at every transaction&lt;br/&gt;allows the user to tighten the spending limit by setting tighter limits or&lt;br/&gt;for instance by setting a_remainder to 0 if they wish to enforce not&lt;br/&gt;spending more during an epoch. A second advantage of explicitly specifying&lt;br/&gt;the four rate-limiting parameters with each transaction is that it allows&lt;br/&gt;the system to fully validate the transaction without having to consider any&lt;br/&gt;previous transactions within an epoch.&lt;br/&gt;&lt;br/&gt;I will stop here because I would like to gauge interest in this idea first&lt;br/&gt;before continuing work on other aspects. Two main pieces of work jump to&lt;br/&gt;mind:&lt;br/&gt;&lt;br/&gt;Define all validations;&lt;br/&gt;Describe aggregate behaviour of multiple (rate-limited) inputs, proof that&lt;br/&gt;two rate-limited addresses cannot spend more than the sum of their&lt;br/&gt;individual limits.&lt;br/&gt;&lt;br/&gt;Zac&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/20210801/0082071c/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210801/0082071c/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:57:19Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqs94nmzwsjecu69uyv58r74kkd2f3ftj9z23keg4yrg65xp69d9qfczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675krhr3fs</id>
    
      <title type="html">📅 Original date posted:2021-07-31 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqs94nmzwsjecu69uyv58r74kkd2f3ftj9z23keg4yrg65xp69d9qfczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675krhr3fs" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8sd8fdrzn72uke63g4w77wf8l9zxafvm56v5zcremkkflr6x4hxqk778wv&#39;&gt;nevent1q…78wv&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-07-31&lt;br/&gt;📝 Original message:Hi list,&lt;br/&gt;&lt;br/&gt;I&amp;#39;d like to explore whether it is feasible to implement new scripting&lt;br/&gt;capabilities in Bitcoin that enable limiting the output amount of a&lt;br/&gt;transaction based on the total value of its inputs. In other words, to&lt;br/&gt;implement the ability to limit the maximum amount that can be sent from an&lt;br/&gt;address.&lt;br/&gt;&lt;br/&gt;Two use cases come to mind:&lt;br/&gt;&lt;br/&gt;UC1: enable a user to add additional protection their funds by&lt;br/&gt;rate-limiting the amount they are able to send during a certain period&lt;br/&gt;(measured in blocks). A typical use case might be a user that intends to&lt;br/&gt;hodl their bitcoin, but still wishes to occasionally send small amounts.&lt;br/&gt;This avoids an attacker from sweeping all their funds in a single&lt;br/&gt;transaction, allowing the user to become aware of the theft and intervene&lt;br/&gt;to prevent further theft.&lt;br/&gt;&lt;br/&gt;UC2: exchanges may wish to rate-limit addresses containing large amounts of&lt;br/&gt;bitcoin, adding warm- or hot-wallet functionality to a cold-storage&lt;br/&gt;address. This would enable an exchange to drastically reduce the number of&lt;br/&gt;times a cold wallet must be accessed with private keys that enable access&lt;br/&gt;to the full amount.&lt;br/&gt;&lt;br/&gt;In a typical setup, I&amp;#39;d envision using multisig such that the user has two&lt;br/&gt;sets of private keys to their encumbered address (with a &amp;#34;set&amp;#34; of keys&lt;br/&gt;meaning &amp;#34;one or more&amp;#34; keys). One set of private keys allows only for&lt;br/&gt;sending with rate-limiting restrictions in place, and a s second set of&lt;br/&gt;private keys allowing for sending any amount without rate-limiting,&lt;br/&gt;effectively overriding such restriction.&lt;br/&gt;&lt;br/&gt;The parameters that define in what way an output is rate-limited might be&lt;br/&gt;defined as follows:&lt;br/&gt;&lt;br/&gt;Param 1: a block height &amp;#34;h0&amp;#34; indicating the first block height of an epoch;&lt;br/&gt;Param 2: a block height &amp;#34;h1&amp;#34; indicating the last block height of an epoch;&lt;br/&gt;Param 3: an amount &amp;#34;a&amp;#34; in satoshi indicating the maximum amount that is&lt;br/&gt;allowed to be sent in any epoch;&lt;br/&gt;Param 4: an amount &amp;#34;a_remaining&amp;#34; (in satoshi) indicating the maximum amount&lt;br/&gt;that is allowed to be sent within the current epoch.&lt;br/&gt;&lt;br/&gt;For example, consider an input containing 100m sats (1 BTC) which has been&lt;br/&gt;rate-limited with parameters (h0, h1, a, a_remaning) of (800000, 800143,&lt;br/&gt;500k, 500k). These parameters define that the address is rate-limited to&lt;br/&gt;sending a maximum of 500k sats in the current epoch that starts at block&lt;br/&gt;height 800000 and ends at height 800143 (or about one day ignoring block&lt;br/&gt;time variance) and that the full amount of 500k is still sendable. These&lt;br/&gt;rate-limiting parameters ensure that it takes at minimum 100m / 500k = 200&lt;br/&gt;transactions and 200 x 144 blocks or about 200 days to spend the full 100m&lt;br/&gt;sats. As noted earlier, in a typical setup a user should retain the option&lt;br/&gt;to transact the entire amount using a second (set of) private key(s).&lt;br/&gt;&lt;br/&gt;For rate-limiting to work, any change output created by a transaction from&lt;br/&gt;a rate-limited address must itself be rate-limited as well. For instance,&lt;br/&gt;expanding on the above example, assume that the user spends 200k sats from&lt;br/&gt;a rate-limited address a1 containing 100m sats:&lt;br/&gt;&lt;br/&gt;Start situation:&lt;br/&gt;At block height 800000: rate-limited address a1 is created;&lt;br/&gt;Value of a1: 100.0m sats;&lt;br/&gt;Rate limiting params of a1: h0=800000, h1=800143, a=500k, a_remaining=500k;&lt;br/&gt;&lt;br/&gt;Transaction t1:&lt;br/&gt;Included at block height 800100;&lt;br/&gt;Spend: 200k &#43; fee;&lt;br/&gt;Rate limiting params: h0=800000, h1=800143, a=500k, a_remaining=300k.&lt;br/&gt;&lt;br/&gt;Result:&lt;br/&gt;Value at destination address: 200k sats;&lt;br/&gt;Rate limiting params at destination address: none;&lt;br/&gt;Value at change address a2: 99.8m sats;&lt;br/&gt;Rate limiting params at change address a2: h0=800000, h1=800143, a=500k,&lt;br/&gt;a_remaining=300k.&lt;br/&gt;&lt;br/&gt;In order to properly enforce rate limiting, the change address must be&lt;br/&gt;rate-limited such that the original rate limit of 500k sats per 144 blocks&lt;br/&gt;cannot be exceeded. In this example, the change address a2 were given the&lt;br/&gt;same rate limiting parameters as the transaction that served as its input.&lt;br/&gt;As a result, from block 800100 up until and including block 800143, a&lt;br/&gt;maximum amount of 300k sats is allowed to be spent from the change address.&lt;br/&gt;&lt;br/&gt;Example continued:&lt;br/&gt;a2: 99.8 sats at height 800100;&lt;br/&gt;Rate-limit params: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&lt;br/&gt;Transaction t2:&lt;br/&gt;Included at block height 800200&lt;br/&gt;Spend: 400k &#43; fees.&lt;br/&gt;Rate-limiting params: h0=800144, h1=800287, a=500k, a_remaining=100k.&lt;br/&gt;&lt;br/&gt;Result:&lt;br/&gt;Value at destination address: 400k sats;&lt;br/&gt;Rate limiting params at destination address: none;&lt;br/&gt;Value at change address a3: 99.4m sats;&lt;br/&gt;Rate limiting params at change address a3: h0=800144, h1=800287, a=500k,&lt;br/&gt;a_remaining=100k.&lt;br/&gt;&lt;br/&gt;Transaction t2 is allowed because it falls within the next epoch (running&lt;br/&gt;from 800144 to 800287) so a spend of 400k does not violate the constraint&lt;br/&gt;of 500k per epoch.&lt;br/&gt;&lt;br/&gt;As could be seen, the rate limiting parameters are part of the transaction&lt;br/&gt;and chosen by the user (or their wallet). This means that the parameters&lt;br/&gt;must be validated to ensure that they do not violate the intended&lt;br/&gt;constraints.&lt;br/&gt;&lt;br/&gt;For instance, this transaction should not be allowed:&lt;br/&gt;a2: 99.8 sats at height 800100;&lt;br/&gt;Rate-limit params of a2: h0=800000, h1=800143, a=500k, a_remaining=300k;&lt;br/&gt;&lt;br/&gt;Transaction t2a:&lt;br/&gt;Included at block height 800200;&lt;br/&gt;Spend: 400k &#43; fees;&lt;br/&gt;Rate-limit params: h0=800124, h1=800267, a=500k, a_remaining=100k.&lt;br/&gt;&lt;br/&gt;This transaction t2a attempts to shift the epoch forward by 20 blocks such&lt;br/&gt;that it starts at 800124 instead of 800144. Shifting the epoch forward like&lt;br/&gt;this must not be allowed because it enables spending more that the rate&lt;br/&gt;limit allows, which is 500k in any epoch of 144 blocks. It would enable&lt;br/&gt;overspending:&lt;br/&gt;&lt;br/&gt;t1: spend 200k at 800100 (epoch 1: total: 200k);&lt;br/&gt;t2a: spend 400k at 800200 (epoch 2: total: 400k);&lt;br/&gt;t3a: spend 100k at 800201 (epoch 2: total: 500k);&lt;br/&gt;t4a: spend 500k at 800268 (epoch 2: total: 1000k, overspending for epoch 2).&lt;br/&gt;&lt;br/&gt;Specifying the rate-limiting parameters explicitly at every transaction&lt;br/&gt;allows the user to tighten the spending limit by setting tighter limits or&lt;br/&gt;for instance by setting a_remainder to 0 if they wish to enforce not&lt;br/&gt;spending more during an epoch.&lt;br/&gt;&lt;br/&gt;I will stop here because I would like to gauge interest in this idea first&lt;br/&gt;before continuing work on other aspects. Two main pieces of work jump to&lt;br/&gt;mind:&lt;br/&gt;&lt;br/&gt;Define all validations;&lt;br/&gt;Describe aggregate behaviour of multiple (rate-limited) inputs, proof that&lt;br/&gt;two rate-limited addresses cannot spend more than the sum of their&lt;br/&gt;individual limits.&lt;br/&gt;&lt;br/&gt;Zac&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/20210731/48005608/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210731/48005608/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:57:16Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqs0hpg5nv7ss9hx9fkxldlwkqm8k6ucn508qevpcry36a4rz6rk2kgzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kmd3utc</id>
    
      <title type="html">📅 Original date posted:2021-07-28 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqs0hpg5nv7ss9hx9fkxldlwkqm8k6ucn508qevpcry36a4rz6rk2kgzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kmd3utc" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs85vqlct4x34dhxes0rlwy3lpsd6uvxqekzd9rjhnv2njrjt87g6cke7u8q&#39;&gt;nevent1q…7u8q&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-07-28&lt;br/&gt;📝 Original message:Hi Billy,&lt;br/&gt;&lt;br/&gt;Thank you for your comprehensive reply. My purpose was to find out whether&lt;br/&gt;a proposal to somehow limit the amount being sent from an address exists&lt;br/&gt;and to further illustrate my thoughts by giving a concrete example of how&lt;br/&gt;this might work functionally without getting to deep into the&lt;br/&gt;technicalities.&lt;br/&gt;&lt;br/&gt;As for your assumption: for an amount limit to have the desired effect, I&lt;br/&gt;realize now that there must also exist some limit on the number of&lt;br/&gt;transactions that will be allowed from the encumbered address.&lt;br/&gt;&lt;br/&gt;Taking a step back, a typical use case would be a speculating user&lt;br/&gt;intending to hodl bitcoin but who still wishes to be able to occasionally&lt;br/&gt;transact minor amounts.&lt;br/&gt;&lt;br/&gt;Ideally, such user should optionally still be able to bypass the rate limit&lt;br/&gt;and spend the entire amount in a single transaction by signing with an&lt;br/&gt;additional private key (multisig).&lt;br/&gt;&lt;br/&gt;During the setup phase, a user sends all their to-be-rate-limited coin to a&lt;br/&gt;single address. When spending from this rate limited address, any change&lt;br/&gt;sent to the change address must be rate limited as well using identical&lt;br/&gt;parameters. I believe that’s also what you’re suggesting.&lt;br/&gt;&lt;br/&gt;I believe that a smart wallet should be able to set up and maintain&lt;br/&gt;multiple rate-limited addresses in such a way that their aggregate&lt;br/&gt;behaviour meets any rate-limiting parameters as desired by the user. This&lt;br/&gt;ought to alleviate your privacy concerns because it means that the wallet&lt;br/&gt;will be able to mix outputs.&lt;br/&gt;&lt;br/&gt;The options for the to-be implemented rate-limiting parameters vary from&lt;br/&gt;completely arbitrary to more restrictive.&lt;br/&gt;&lt;br/&gt;Completely arbitrary parameters would allow users to set up a rate limit&lt;br/&gt;that basically destroys their funds, for instance rate-limiting an address&lt;br/&gt;to an amount of 1 satoshi per 100 blocks.&lt;br/&gt;&lt;br/&gt;More restrictive rate limits would remove such footgun and may require that&lt;br/&gt;only a combination of parameters are allowed such that all funds will be&lt;br/&gt;spendable within a set number of blocks (for instance 210,000).&lt;br/&gt;&lt;br/&gt;As for the rate-limiting parameters, in addition to a per-transaction&lt;br/&gt;maximum of (minimum amount in satoshi or a percentage of the total amount&lt;br/&gt;stored at the address), also the transaction frequency must be limited. I&lt;br/&gt;would propose this to be expressed as a number of blocks before a next&lt;br/&gt;transaction can be sent from the encumbered address(es).&lt;br/&gt;&lt;br/&gt;I believe such user-enabled rate-limiting is superior to one that requires&lt;br/&gt;a third party.&lt;br/&gt;&lt;br/&gt;As an aside, I am not sure how a vault solution would be able to prevent an&lt;br/&gt;attacker who is in possession of the vaults’ private key from sabotaging&lt;br/&gt;the user by replacing the user transaction with one having a higher fee&lt;br/&gt;every time the user attempts to transact. I am probably missing something&lt;br/&gt;here though.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Tue, 27 Jul 2021 at 19:21, Billy Tetrud &amp;lt;billy.tetrud at gmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Hi Zac,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I haven&amp;#39;t heard of any proposal for limiting the amount that can be sent&lt;br/&gt;&amp;gt; from an address. I assume you mean limiting the amount that can be sent in&lt;br/&gt;&amp;gt; a period of time - eg something that would encode that for address A, only&lt;br/&gt;&amp;gt; X bitcoin can be sent from the address in a given day/week/etc, is that&lt;br/&gt;&amp;gt; right? That would actually be a somewhat difficult thing to do in the&lt;br/&gt;&amp;gt; output-based system Bitcoin uses, and would be easier in an account based&lt;br/&gt;&amp;gt; system like Ethereum. The problem is that each output is separate, and&lt;br/&gt;&amp;gt; there&amp;#39;s no concept in bitcoin of encumbering outputs together.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; What you could do is design a system where coins would be combined in a&lt;br/&gt;&amp;gt; single output, and then encumber that output with a script that allows a&lt;br/&gt;&amp;gt; limited amount of coin be sent to a destination address and requires all&lt;br/&gt;&amp;gt; other bitcoins be returned to sender in a new change output that is also&lt;br/&gt;&amp;gt; timelocked. That way, the new change output can&amp;#39;t be used again until the&lt;br/&gt;&amp;gt; timelock expires (eg a week). However, to ensure this wallet works&lt;br/&gt;&amp;gt; properly, any deposit into the wallet would have to also spend the wallet&amp;#39;s&lt;br/&gt;&amp;gt; single output, so as to create a new single output at that address. So 3rd&lt;br/&gt;&amp;gt; parties wouldn&amp;#39;t be able to arbitrarily send money in (or rather, they&lt;br/&gt;&amp;gt; could, but each output would have its own separate spending limit).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; such kind of restriction would be extremely effective in thwarting the&lt;br/&gt;&amp;gt; most damaging type of theft being the one where all funds are swept in a&lt;br/&gt;&amp;gt; single transaction&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; It would. However a normal wallet vault basically already has this&lt;br/&gt;&amp;gt; property - a thief can&amp;#39;t simply sweep funds instantly, but instead the&lt;br/&gt;&amp;gt; victim will see an initiated transaction and will be able to reverse it&lt;br/&gt;&amp;gt; within a delay time-window. I don&amp;#39;t think adding a spending limit would add&lt;br/&gt;&amp;gt; meaningful security to a delayed-send wallet vault like that. But it could&lt;br/&gt;&amp;gt; be used to increase the security of a wallet vault that can be instantly&lt;br/&gt;&amp;gt; spent from - ie if the attacker successfully steals funds, then the victim&lt;br/&gt;&amp;gt; has time to go gather their additional keys and move the remaining&lt;br/&gt;&amp;gt; (unstolen) funds into a new wallet.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; OP_CD could potentially be augmented to allow specifying limit amounts for&lt;br/&gt;&amp;gt; each destination, which would allow you to create a wallet like this. It&lt;br/&gt;&amp;gt; would be a bit of an awkward wallet to use tho, since you couldn&amp;#39;t receive&lt;br/&gt;&amp;gt; directly into it from a 3rd party and you also couldn&amp;#39;t keep separate&lt;br/&gt;&amp;gt; outputs (which is bad for privacy).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; An alternate way of doing this that you don&amp;#39;t need any new opcodes for&lt;br/&gt;&amp;gt; would be to have a 3rd party service that signs multisig transactions from&lt;br/&gt;&amp;gt; a wallet only up to a limit. The end-user could have additional keys such&lt;br/&gt;&amp;gt; that the 3rd party can&amp;#39;t prevent them from accessing that (if they turn&lt;br/&gt;&amp;gt; uncooperative), and the 3rd party would only have a single key so they&lt;br/&gt;&amp;gt; can&amp;#39;t steal funds, but the user would sign a transaction with one key, and&lt;br/&gt;&amp;gt; the 3rd party with another as long as the spending limit hasn&amp;#39;t been&lt;br/&gt;&amp;gt; reached. This wouldn&amp;#39;t have much counterparty risk, but would be a less&lt;br/&gt;&amp;gt; awkward wallet than what I described above - meaning anyone could send&lt;br/&gt;&amp;gt; funds into the wallet without defeating the spending limit, and privacy&lt;br/&gt;&amp;gt; could be kept intact (minus the fact that the 3rd party would know what&lt;br/&gt;&amp;gt; your outputs are).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; BT&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; On Tue, Jul 27, 2021 at 4:18 AM Zac Greenwood &amp;lt;zachgrw at gmail.com&amp;gt; wrote:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Hi Billy,&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; On the topic of wallet vaults, are there any plans to implement a way to&lt;br/&gt;&amp;gt;&amp;gt; limit the maximum amount to be sent from an address?&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; An example of such limit might be: the maximum amount allowed to send is&lt;br/&gt;&amp;gt;&amp;gt; max(s, p) where s is a number of satoshi and p a percentage of the total&lt;br/&gt;&amp;gt;&amp;gt; available (sendable) amount.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; A minimum value may be imposed on the percentage to ensure that the&lt;br/&gt;&amp;gt;&amp;gt; address can be emptied within a reasonable number of transactions. The&lt;br/&gt;&amp;gt;&amp;gt; second parameter s allows a minimum permitted amount. (This is necessary&lt;br/&gt;&amp;gt;&amp;gt; because with only the percentage parameter the minimum permitted amount&lt;br/&gt;&amp;gt;&amp;gt; converges to zero, making it impossible to empty the address).&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; There may be other ways too. In my view, such kind of restriction would&lt;br/&gt;&amp;gt;&amp;gt; be extremely effective in thwarting the most damaging type of theft being&lt;br/&gt;&amp;gt;&amp;gt; the one where all funds are swept in a single transaction.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Zac&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; On Tue, 27 Jul 2021 at 03:26, Billy Tetrud via bitcoin-dev &amp;lt;&lt;br/&gt;&amp;gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Hey James,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; In the examples you mentioned, what I was exploring was a mechanism of&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; attack by which the attacker could steal user A&amp;#39;s key and use that key to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; send a transaction with the maximum possible fee. User B would still&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; receive some funds (probably), but if the fee could be large, the attacker&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; would either do a lot of damage to user B (griefing) or could make an&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; agreement with a miner to give back some of the large fee (theft).&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; But as for use cases, the proposal mentions a number of use cases&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; &amp;lt;&lt;a href=&#34;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults/blob/main/cd/bip-constraindestination.md#motivation&amp;gt&#34;&gt;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults/blob/main/cd/bip-constraindestination.md#motivation&amp;gt&lt;/a&gt;; and&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; most overlap with the use cases of op_ctv &amp;lt;&lt;a href=&#34;https://utxos.org/uses/&amp;gt&#34;&gt;https://utxos.org/uses/&amp;gt&lt;/a&gt;; (Jeremy&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Rubin&amp;#39;s website for op_ctv has a lot of good details, most of which are&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; also relevant to op_cd). The use case I&amp;#39;m most interested in is wallet&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; vaults. This opcode can be used to create a wallet vault where the user&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; only needs to use, for example, 1 key to spend funds, but the attacker must&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; steal 2 or more keys to spend funds. The benefits of a 2 key wallet vault&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; like this vs a normal 2-of-2 multisig wallet are that not only does an&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; attacker have to steal both keys (same level of security), but also the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; user can lose one key and still recover their funds (better redundancy) and&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; also that generally the user doesn&amp;#39;t need to access their second key - so&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; that can remain in a much more secure location (which would also probably&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; make that key harder to steal). The only time the second key only comes&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; into play if one key is stolen and the attacker attempts to send a&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; transaction. At that point, the user would go find and use his second key&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; (along with the first) to send a revoke transaction to prevent the attacker&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; from stealing their funds. This is somewhat akin to a lightning watchtower&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; scenario, where your wallet would watch the chain and alert you about an&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; unexpected transaction, at which point you&amp;#39;d manually do a revoke (vs a&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; watchtower&amp;#39;s automated response). You might be interested in taking a look&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; at this wallet vault design&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; &amp;lt;&lt;a href=&#34;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults/blob/main/cd/op_cdWalletVault1.md&amp;gt&#34;&gt;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults/blob/main/cd/op_cdWalletVault1.md&amp;gt&lt;/a&gt;;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; that uses OP_CD or even my full vision&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; &amp;lt;&lt;a href=&#34;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults&amp;gt&#34;&gt;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults&amp;gt&lt;/a&gt;; of the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; wallet vault I want to be able to create.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; With a covenant opcode like this, its possible to create very usable and&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; accessible but highly secure wallets that can allow normal people to hold&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; self custody of their keys without fear of loss or theft and without the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; hassle of a lot of safe deposit boxes (or other secure seed storage&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; locations).&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; Cheers,&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; BT&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; On Mon, Jul 26, 2021 at 2:08 PM James MacWhyte &amp;lt;macwhyte at gmail.com&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Hi Billy!&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; See above, but to break down that situation a bit further, these are&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; the two situations I can think of:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;    1. The opcode limits user/group A to send the output to user/group&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;    B&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;    2. The opcode limits user A to send from one address they own to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;    another address they own.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; I&amp;#39;m trying to think of a good use case for this type of opcode. In&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; these examples, an attacker who compromises the key for user A can&amp;#39;t steal&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; the money because it can only be sent to user B. So if the attacker wants&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; to steal the funds, they would need to compromise the keys of both user A&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; and user B.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; But how is that any better than a 2-of-2 multisig? Isn&amp;#39;t the end result&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; exactly the same?&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; James&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;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/20210728/9ad7f8bf/attachment-0001.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210728/9ad7f8bf/attachment-0001.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:57:12Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsqxwkt70l5xexg06tcgqtl4mk9hq9hqxf6wsywnvadr3af58efylqzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675khejh96</id>
    
      <title type="html">📅 Original date posted:2021-07-27 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsqxwkt70l5xexg06tcgqtl4mk9hq9hqxf6wsywnvadr3af58efylqzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675khejh96" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfssy9r662f44j4ufjr9jgpz3p7qr8yfr7mvcsp6x3yyp2xqaal6shd6pll&#39;&gt;nevent1q…6pll&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-07-27&lt;br/&gt;📝 Original message:Hi Billy,&lt;br/&gt;&lt;br/&gt;On the topic of wallet vaults, are there any plans to implement a way to&lt;br/&gt;limit the maximum amount to be sent from an address?&lt;br/&gt;&lt;br/&gt;An example of such limit might be: the maximum amount allowed to send is&lt;br/&gt;max(s, p) where s is a number of satoshi and p a percentage of the total&lt;br/&gt;available (sendable) amount.&lt;br/&gt;&lt;br/&gt;A minimum value may be imposed on the percentage to ensure that the address&lt;br/&gt;can be emptied within a reasonable number of transactions. The second&lt;br/&gt;parameter s allows a minimum permitted amount. (This is necessary because&lt;br/&gt;with only the percentage parameter the minimum permitted amount converges&lt;br/&gt;to zero, making it impossible to empty the address).&lt;br/&gt;&lt;br/&gt;There may be other ways too. In my view, such kind of restriction would be&lt;br/&gt;extremely effective in thwarting the most damaging type of theft being the&lt;br/&gt;one where all funds are swept in a single transaction.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Tue, 27 Jul 2021 at 03:26, Billy Tetrud via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Hey James,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; In the examples you mentioned, what I was exploring was a mechanism of&lt;br/&gt;&amp;gt; attack by which the attacker could steal user A&amp;#39;s key and use that key to&lt;br/&gt;&amp;gt; send a transaction with the maximum possible fee. User B would still&lt;br/&gt;&amp;gt; receive some funds (probably), but if the fee could be large, the attacker&lt;br/&gt;&amp;gt; would either do a lot of damage to user B (griefing) or could make an&lt;br/&gt;&amp;gt; agreement with a miner to give back some of the large fee (theft).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; But as for use cases, the proposal mentions a number of use cases&lt;br/&gt;&amp;gt; &amp;lt;&lt;a href=&#34;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults/blob/main/cd/bip-constraindestination.md#motivation&amp;gt&#34;&gt;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults/blob/main/cd/bip-constraindestination.md#motivation&amp;gt&lt;/a&gt;; and&lt;br/&gt;&amp;gt; most overlap with the use cases of op_ctv &amp;lt;&lt;a href=&#34;https://utxos.org/uses/&amp;gt&#34;&gt;https://utxos.org/uses/&amp;gt&lt;/a&gt;; (Jeremy&lt;br/&gt;&amp;gt; Rubin&amp;#39;s website for op_ctv has a lot of good details, most of which are&lt;br/&gt;&amp;gt; also relevant to op_cd). The use case I&amp;#39;m most interested in is wallet&lt;br/&gt;&amp;gt; vaults. This opcode can be used to create a wallet vault where the user&lt;br/&gt;&amp;gt; only needs to use, for example, 1 key to spend funds, but the attacker must&lt;br/&gt;&amp;gt; steal 2 or more keys to spend funds. The benefits of a 2 key wallet vault&lt;br/&gt;&amp;gt; like this vs a normal 2-of-2 multisig wallet are that not only does an&lt;br/&gt;&amp;gt; attacker have to steal both keys (same level of security), but also the&lt;br/&gt;&amp;gt; user can lose one key and still recover their funds (better redundancy) and&lt;br/&gt;&amp;gt; also that generally the user doesn&amp;#39;t need to access their second key - so&lt;br/&gt;&amp;gt; that can remain in a much more secure location (which would also probably&lt;br/&gt;&amp;gt; make that key harder to steal). The only time the second key only comes&lt;br/&gt;&amp;gt; into play if one key is stolen and the attacker attempts to send a&lt;br/&gt;&amp;gt; transaction. At that point, the user would go find and use his second key&lt;br/&gt;&amp;gt; (along with the first) to send a revoke transaction to prevent the attacker&lt;br/&gt;&amp;gt; from stealing their funds. This is somewhat akin to a lightning watchtower&lt;br/&gt;&amp;gt; scenario, where your wallet would watch the chain and alert you about an&lt;br/&gt;&amp;gt; unexpected transaction, at which point you&amp;#39;d manually do a revoke (vs a&lt;br/&gt;&amp;gt; watchtower&amp;#39;s automated response). You might be interested in taking a look&lt;br/&gt;&amp;gt; at this wallet vault design&lt;br/&gt;&amp;gt; &amp;lt;&lt;a href=&#34;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults/blob/main/cd/op_cdWalletVault1.md&amp;gt&#34;&gt;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults/blob/main/cd/op_cdWalletVault1.md&amp;gt&lt;/a&gt;;&lt;br/&gt;&amp;gt; that uses OP_CD or even my full vision&lt;br/&gt;&amp;gt; &amp;lt;&lt;a href=&#34;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults&amp;gt&#34;&gt;https://github.com/fresheneesz/bip-efficient-bitcoin-vaults&amp;gt&lt;/a&gt;; of the&lt;br/&gt;&amp;gt; wallet vault I want to be able to create.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; With a covenant opcode like this, its possible to create very usable and&lt;br/&gt;&amp;gt; accessible but highly secure wallets that can allow normal people to hold&lt;br/&gt;&amp;gt; self custody of their keys without fear of loss or theft and without the&lt;br/&gt;&amp;gt; hassle of a lot of safe deposit boxes (or other secure seed storage&lt;br/&gt;&amp;gt; locations).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Cheers,&lt;br/&gt;&amp;gt; BT&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; On Mon, Jul 26, 2021 at 2:08 PM James MacWhyte &amp;lt;macwhyte at gmail.com&amp;gt; wrote:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Hi Billy!&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; See above, but to break down that situation a bit further, these are the&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; two situations I can think of:&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;    1. The opcode limits user/group A to send the output to user/group B&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;    2. The opcode limits user A to send from one address they own to&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;    another address they own.&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; I&amp;#39;m trying to think of a good use case for this type of opcode. In these&lt;br/&gt;&amp;gt;&amp;gt; examples, an attacker who compromises the key for user A can&amp;#39;t steal the&lt;br/&gt;&amp;gt;&amp;gt; money because it can only be sent to user B. So if the attacker wants to&lt;br/&gt;&amp;gt;&amp;gt; steal the funds, they would need to compromise the keys of both user A and&lt;br/&gt;&amp;gt;&amp;gt; user B.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; But how is that any better than a 2-of-2 multisig? Isn&amp;#39;t the end result&lt;br/&gt;&amp;gt;&amp;gt; exactly the same?&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; James&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20210727/c75c3771/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210727/c75c3771/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:57:11Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsxqpyk7mnq03phk3sa80cs0vqmwdz07awzshq8cp599mq67trljqczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675km74dem</id>
    
      <title type="html">📅 Original date posted:2021-06-30 📝 Original message:Eric, ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsxqpyk7mnq03phk3sa80cs0vqmwdz07awzshq8cp599mq67trljqczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675km74dem" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsr8zn2gpys9rszcl7e472f86za47rghd6hmgq3zktfnk7xj3sh80qmrzyu4&#39;&gt;nevent1q…zyu4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-06-30&lt;br/&gt;📝 Original message:Eric,&lt;br/&gt;&lt;br/&gt;&amp;gt; A million nodes saying a transaction is invalid does nothing to enforce&lt;br/&gt;that knowledge&lt;br/&gt;&lt;br/&gt;It does. Nodes disregard invalid transactions and invalid blocks as if they&lt;br/&gt;never existed. It is not possible for any party to transact bitcoin in a&lt;br/&gt;way that violates the set of rules enforced by the network of&lt;br/&gt;consensus-compatible nodes that we call Bitcoin.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Wed, Jun 30, 2021 at 2:03 PM Eric Voskuil &amp;lt;eric at voskuil.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; A million nodes saying a transaction is invalid does nothing to enforce&lt;br/&gt;&amp;gt; that knowledge.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; An economic node is a person who refuses to accept invalid money. A node&lt;br/&gt;&amp;gt; only informs this decision, it cannot enforce it. That’s up to people.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; And clearly if one is not actually accepting bitcoin for anything at the&lt;br/&gt;&amp;gt; time, he is not enforcing anything.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; The idea of a non-economic node is well established, nothing new here.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; e&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; On Jun 30, 2021, at 04:33, Zac Greenwood &amp;lt;zachgrw at gmail.com&amp;gt; wrote:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; ﻿&lt;br/&gt;&amp;gt; Hi Eric,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; A node (software) doesn’t enforce anything. Merchants enforce consensus&lt;br/&gt;&amp;gt; rules&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; … by running a node which they believe to enforce the rules of Bitcoin.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; A node definitely enforces consensus rules and defines what is Bitcoin. I&lt;br/&gt;&amp;gt; am quite disturbed that this is even being debated here.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Zac&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;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/20210630/036ff7c1/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210630/036ff7c1/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:55:43Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqs9h2jdsfazcph65zyrm8rcfmyd946gmpajm7uuq79vvq826ky803szypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675km6ktqj</id>
    
      <title type="html">📅 Original date posted:2021-06-30 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqs9h2jdsfazcph65zyrm8rcfmyd946gmpajm7uuq79vvq826ky803szypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675km6ktqj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsw58vs9zmp7yx4fm22v84r70a4pwss4tn9p4vdjnds60xslfy0usqr00p80&#39;&gt;nevent1q…0p80&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-06-30&lt;br/&gt;📝 Original message:Hi Eric,&lt;br/&gt;&lt;br/&gt;&amp;gt; A node (software) doesn’t enforce anything. Merchants enforce consensus&lt;br/&gt;rules&lt;br/&gt;&lt;br/&gt;… by running a node which they believe to enforce the rules of Bitcoin.&lt;br/&gt;&lt;br/&gt;A node definitely enforces consensus rules and defines what is Bitcoin. I&lt;br/&gt;am quite disturbed that this is even being debated here.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Wed, 30 Jun 2021 at 11:17, Eric Voskuil via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Hi Prayank,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; So majority hash power not following the consensus rules can result in&lt;br/&gt;&amp;gt; chain split?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Any two people on different rules implies a chain split. That’s presumably&lt;br/&gt;&amp;gt; why rule changes are called forks. There is no actual concept of “the&lt;br/&gt;&amp;gt; rules” just one set of rules or another.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Why would majority of miners decide to mine a chain that nobody wants to&lt;br/&gt;&amp;gt; use?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I don’t presume to know why people prefer one thing over another, or what&lt;br/&gt;&amp;gt; people want to use, nor does economics.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; What are different things possible in this case based on game theory?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I’ve seen no actual demonstration of the relevance of game theory to&lt;br/&gt;&amp;gt; Bitcoin. People throw the words around quite a bit, but I can’t give you an&lt;br/&gt;&amp;gt; answer because I have found no evidence of a valid game theoretic model&lt;br/&gt;&amp;gt; applicable to Bitcoin. It’s not a game, it’s a market.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Do miners and mining pools participate in discussions before signaling&lt;br/&gt;&amp;gt; for a soft fork begins?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Who knows, I don’t get invited to round table meetings.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Can they still mine something else post activation even if signaling&lt;br/&gt;&amp;gt; readiness for soft fork?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; A person can mine whatever they want. Signaling does not compel a miner to&lt;br/&gt;&amp;gt; enforce. Each block mined is anonymous. But each miner seeing the signals&lt;br/&gt;&amp;gt; of others, unless they are coordinating, would presumably assume that&lt;br/&gt;&amp;gt; others will enforce.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Who enforces consensus rules technically in Bitcoin? Full nodes or&lt;br/&gt;&amp;gt; Miners?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; A node (software) doesn’t enforce anything. Merchants enforce consensus&lt;br/&gt;&amp;gt; rules when they reject trading for something that they don’t consider&lt;br/&gt;&amp;gt; money. Every time two people trade both party validates what they receive&lt;br/&gt;&amp;gt; (not what they trade away). Those receiving Bitcoin are economically&lt;br/&gt;&amp;gt; relevant and their power is a function of how much they are doing so.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Miners censor, which is inconsequential unless enforced. Majority miners&lt;br/&gt;&amp;gt; can enforce censorship by simply not building on any non-censoring blocks.&lt;br/&gt;&amp;gt; This is what soft fork enforcement is.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Is soft fork signaling same as voting?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I don’t see that it needs a label apart from signaling. There are many&lt;br/&gt;&amp;gt; kinds of voting. It would be hard to equate signaling with any of them.&lt;br/&gt;&amp;gt; It’s a public signal that the miner who mined a given block miner intends&lt;br/&gt;&amp;gt; to censor, that’s all.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; According to my understanding, miners follow the consensus rules&lt;br/&gt;&amp;gt; enforced by full nodes and get (subsidy &#43; fees) for their work.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Miners mine a chain, which ever one they want. There are many. They earn&lt;br/&gt;&amp;gt; the block reward.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Signaling is not voting although lot of people consider it voting&lt;br/&gt;&amp;gt; including some mining pools and exchanges.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; What people consider it is inconsequential. It has clearly defined&lt;br/&gt;&amp;gt; behavior.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; e&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; *From:* Prayank &amp;lt;prayank at tutanota.de&amp;gt;&lt;br/&gt;&amp;gt; *Sent:* Sunday, June 27, 2021 5:01 AM&lt;br/&gt;&amp;gt; *To:* eric at voskuil.org&lt;br/&gt;&amp;gt; *Cc:* Bitcoin Dev &amp;lt;bitcoin-dev at lists.linuxfoundation.org&amp;gt;&lt;br/&gt;&amp;gt; *Subject:* Re: [bitcoin-dev] Trinary Version Signaling for softfork&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Hello Eric,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I have few questions:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Without majority hash power support, activation simply means you are off&lt;br/&gt;&amp;gt; on a chain split.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; So majority hash power not following the consensus rules can result in&lt;br/&gt;&amp;gt; chain split? Why would majority of miners decide to mine a chain that&lt;br/&gt;&amp;gt; nobody wants to use? What are different things possible in this case based&lt;br/&gt;&amp;gt; on game theory?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; And activation without majority hash power certainly does not “ensure”&lt;br/&gt;&amp;gt; this.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Do miners and mining pools participate in discussions before signaling for&lt;br/&gt;&amp;gt; a soft fork begins? Can they still mine something else post activation even&lt;br/&gt;&amp;gt; if signaling readiness for soft fork?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; If one wants to enforce a soft fork (or otherwise censor) this is&lt;br/&gt;&amp;gt; accomplished by mining (or paying others to do so). Anyone can mine, so&lt;br/&gt;&amp;gt; everyone gets a say. Mining is trading capital now for more later. If&lt;br/&gt;&amp;gt; enough people want to do that, they can enforce a soft fork. It’s time&lt;br/&gt;&amp;gt; Bitcoiners stop thinking of miners as other people. Anyone can mine, and&lt;br/&gt;&amp;gt; that’s your vote.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Who enforces consensus rules technically in Bitcoin? Full nodes or Miners?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Is soft fork signaling same as voting?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; According to my understanding, miners follow the consensus rules enforced&lt;br/&gt;&amp;gt; by full nodes and get (subsidy &#43; fees) for their work. Signaling is not&lt;br/&gt;&amp;gt; voting although lot of people consider it voting including some mining&lt;br/&gt;&amp;gt; pools and exchanges.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; --&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Prayank&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20210630/8cf81a27/attachment-0001.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210630/8cf81a27/attachment-0001.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:55:41Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsqnf62t9uxq4d3rhqkevtcar3w5zpwf36pfperxem856apzl2ndnqzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675ke49eqx</id>
    
      <title type="html">📅 Original date posted:2021-06-30 📝 Original message:&amp;gt; ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsqnf62t9uxq4d3rhqkevtcar3w5zpwf36pfperxem856apzl2ndnqzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675ke49eqx" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqstj6f8edwn0nhxld632kdyljt6hrnp44xq92p749a0mh74wsxm90c90nj7c&#39;&gt;nevent1q…nj7c&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-06-30&lt;br/&gt;📝 Original message:&amp;gt; Majority hash power does have the ability to determine what gets&lt;br/&gt;confirmed.&lt;br/&gt;&lt;br/&gt;Miners don’t have the ability to decide whether a block is valid.&lt;br/&gt;&lt;br/&gt;Hash power is only recognized as such if it is used for creating a valid&lt;br/&gt;block, i.e., a block that strictly follows all the rules as set by the node&lt;br/&gt;software that transacting users choose to run.&lt;br/&gt;&lt;br/&gt;If suddenly 70% of all hash power decided to start mining blocks that are&lt;br/&gt;invalid according to the rules set in the users’ software, then these&lt;br/&gt;invalid blocks will be disregarded. From a user perspective, 70% of all&lt;br/&gt;hash power will seem to have disappeared.&lt;br/&gt;&lt;br/&gt;In short, users define what is Bitcoin, not miners. This is fundamental to&lt;br/&gt;being decentralized.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Tue, 29 Jun 2021 at 23:17, Eric Voskuil via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; On Jun 29, 2021, at 12:28, Jorge Timón &amp;lt;jtimon at jtimon.cc&amp;gt; wrote:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; ﻿&lt;br/&gt;&amp;gt; &amp;#34;Confirmation&amp;#34; isn&amp;#39;t needed for softforks.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; All transactions require confirmation. Splitting does not change this.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Softforks are not compatible without miner enforcement. So soft forking&lt;br/&gt;&amp;gt; without it has essentially the same effect as hard forking, the chain&lt;br/&gt;&amp;gt; splits.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Miners controlling confirmation doesn&amp;#39;t mean miners control the rules,&lt;br/&gt;&amp;gt; they never did.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Please define “control” because these statements hinge on that word.&lt;br/&gt;&amp;gt; Nobody “controls” the rules of others, nor did anyone claim that to be the&lt;br/&gt;&amp;gt; case. Majority hash power does have the ability to determine what gets&lt;br/&gt;&amp;gt; confirmed. That is the central design principle of proof of work. It takes&lt;br/&gt;&amp;gt; that decision out of the hands of politicians and places it at the feet of&lt;br/&gt;&amp;gt; the market.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Read section 11 of the bitcoin paper &amp;#34;even with a majority of hashrate one&lt;br/&gt;&amp;gt; cannot arbitrarily change rules or forge signatures.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Never claimed that was the case. One can run any rules that one desires.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; You may say users chosing the rules is &amp;#34;politicial&amp;#34;. Isn&amp;#39;t miners deciding&lt;br/&gt;&amp;gt; them for users more political?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; No, it’s economic. The largest investment in mining (including highest&lt;br/&gt;&amp;gt; fees paid to incentivize it) determines censorship resistance.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Whatever you call it, it is still how free software works: users decide&lt;br/&gt;&amp;gt; what to run.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; A *person* can run whatever software they want. Money requires that others&lt;br/&gt;&amp;gt; agree (same rules), and to be money bitcoin requires confirmation.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; It is extremely disappointing to see how few developers seem to ubderstand&lt;br/&gt;&amp;gt; this, or even care about users deciding or miners not deciding the rules.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; It’s poorly understood because there are so many who should know better&lt;br/&gt;&amp;gt; making very misleading statements.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; How can we expect users to understand bitcoin when most developers don&amp;#39;t&lt;br/&gt;&amp;gt; seem to understand it?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Clearly we cannot.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; It is really sad.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; On Tue, Jun 29, 2021, 19:17 Eric Voskuil &amp;lt;eric at voskuil.org&amp;gt; wrote:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; On Jun 29, 2021, at 10:55, Luke Dashjr &amp;lt;luke at dashjr.org&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; ﻿The only alternative to a split in the problematic scenarios are 1)&lt;br/&gt;&amp;gt;&amp;gt; concede&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; centralised miner control over the network,&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Miners control confirmation, entirely.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; This is the nature of bitcoin. And merchants control validation,&lt;br/&gt;&amp;gt;&amp;gt; entirely. Anyone can be a miner or a merchant. Neither is inherently&lt;br/&gt;&amp;gt;&amp;gt; “better” than the other. The largest merchants are likely a handful of&lt;br/&gt;&amp;gt;&amp;gt; exchanges, likely at least as centralized as miners are pooled.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Splitting does not change this.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; and 2) have inconsistent&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; enforcement of rules by users who don&amp;#39;t agree on what the correct rules&lt;br/&gt;&amp;gt;&amp;gt; are,&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; There are no “correct” rules. Whatever rules one enforces determine what&lt;br/&gt;&amp;gt;&amp;gt; network he chooses to participate in.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; again leading to centralised miner control over the network.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Leading to? Miners control confirmation, always. Whether that is&lt;br/&gt;&amp;gt;&amp;gt; centralized, just as with merchanting, is up to individuals.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; In other words, in this context, accepting a split between disagreeing&lt;br/&gt;&amp;gt;&amp;gt; users&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; is the ONLY way Bitcoin can possibly continue as a decentralised&lt;br/&gt;&amp;gt;&amp;gt; currency.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; No, it is not. You are proposing splitting as the method of censorship&lt;br/&gt;&amp;gt;&amp;gt; resistance inherent to Bitcoin. Coordinating this split requires&lt;br/&gt;&amp;gt;&amp;gt; coordinated action. The whole point of bitcoin is coordinate that action&lt;br/&gt;&amp;gt;&amp;gt; based on mining (proof of work). Replacing that with a political process is&lt;br/&gt;&amp;gt;&amp;gt; just a reversion to political money.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; Making that split as clean and well-defined as possible not only&lt;br/&gt;&amp;gt;&amp;gt; ensures the&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; best opportunity for both sides of the disagreement,&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Trivially accomplished, just change a rule. This isn’t about that. It’s&lt;br/&gt;&amp;gt;&amp;gt; about how one gets others to go along with the new coin, or stay with the&lt;br/&gt;&amp;gt;&amp;gt; old. An entirely political process, which is clearly evident from the&lt;br/&gt;&amp;gt;&amp;gt; campaigns around such attempts.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; but also minimises the&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; risk that the split occurs at all (since the &amp;#34;losing&amp;#34; side needs to&lt;br/&gt;&amp;gt;&amp;gt; concede,&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; rather than passively continue the disagreement ongoing after the&lt;br/&gt;&amp;gt;&amp;gt; attempted&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; protocol change).&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; Nobody “needs to” concede once a split has occurred, which is evident in&lt;br/&gt;&amp;gt;&amp;gt; existing splits.&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; e&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt; Luke&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; On Tuesday 29 June 2021 08:44:56 Eric Voskuil wrote:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; At least we are now acknowledging that splitting is what it’s about.&lt;br/&gt;&amp;gt;&amp;gt; That’s&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; progress.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; e&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; On Jun 29, 2021, at 01:32, Jorge Timón &amp;lt;jtimon at jtimon.cc&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt; ﻿&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt; I think the option of &amp;#34;permanent failure because miners veto&amp;#34; should&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt; actually be abandoned. No, I don&amp;#39;t think we should avoid splits when&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt; possible, I don&amp;#39;t think we should avoid splits at all costs.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; On Sun, Jun 27, 2021, 19:12 Billy Tetrud &amp;lt;billy.tetrud at gmail.com&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; @Luke&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; They can still slow it down.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; Absolutely. However I think that the option of permanent failure is&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; important. It certainly would be ideal to ensure that enough bitcoin&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; users support the upgrade *before* releasing it, however&lt;br/&gt;&amp;gt;&amp;gt; realistically&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; this can never be more than an estimate, and estimates can sometimes&lt;br/&gt;&amp;gt;&amp;gt; be&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; wildly wrong. It would be unfortunate if miners had a substantially&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; different estimate of user support than the people putting in the&lt;br/&gt;&amp;gt;&amp;gt; work&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; to release bitcoin upgrades. Even if upgrades are never released&lt;br/&gt;&amp;gt;&amp;gt; before&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; it becomes clear that a large supermajority of users want the&lt;br/&gt;&amp;gt;&amp;gt; upgrade,&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; if miners don&amp;#39;t agree with the estimate a harmful chain split could&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; occur. And I agree with Eric that the goal here is to prevent a chain&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; split during an upgrade when possible. This includes permanent&lt;br/&gt;&amp;gt;&amp;gt; failure&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; of an upgrade when there is unexpectedly large miner opposition.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; This of course does not prevent a UASF-style deployment to be done&lt;br/&gt;&amp;gt;&amp;gt; after&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; an initial failure to deploy occurs. My proposal is essentially a&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; mechanism to improve upon the speedy-trial idea, allowing for even&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; speedier releases (than speedy trial) without adding additional risk&lt;br/&gt;&amp;gt;&amp;gt; of&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; undesired chain splits.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; [BIP8] already has the trinary state you seem to be describing&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; It sounds like you&amp;#39;re saying the trinary state of BIP8 is A. Follow&lt;br/&gt;&amp;gt;&amp;gt; the&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; longest chain, B. Follow the upgrade chain, or C. follow the&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; non-upgraded chain. I agree. However the trinary state in my&lt;br/&gt;&amp;gt;&amp;gt; proposal is&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; materially different - it is the signaling itself that is trinary,&lt;br/&gt;&amp;gt;&amp;gt; not&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; just which chain is being followed. This allows others to know and&lt;br/&gt;&amp;gt;&amp;gt; make&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; programmatic decisions (in software) based on that signaling. I&amp;#39;m&lt;br/&gt;&amp;gt;&amp;gt; sure&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; you can agree that does not exist in BIP8.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; No additional bit is needed, as softforks are coordinated between&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; users, NOT miners&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; And yet there is miner involvement, as you rightly pointed out.&lt;br/&gt;&amp;gt;&amp;gt; Miners&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; are needed to set the nVersion in the header. So when you say &amp;#34;no&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; additional bit is needed&amp;#34;, could you please be clearer as to what you&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; mean? Do you mean that signaling of opposition in a block can be done&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; without any &amp;#34;additional bit&amp;#34;? Or are you just saying that it is&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; redundant to consider what miners might be opposing an upgrade?&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; @Jorge&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; If different users want different incompatible things... there&amp;#39;s no&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; way to avoid the split&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; I agree. This happened with bcash, and that&amp;#39;s fine. It was painful,&lt;br/&gt;&amp;gt;&amp;gt; but&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; there were a significant amount of users that disagreed, and they&lt;br/&gt;&amp;gt;&amp;gt; have&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; the chain they want now.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; But we generally all want to avoid a chain split when possible.&lt;br/&gt;&amp;gt;&amp;gt; Because&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; chain splits have a cost, and that cost can be high, its likely that&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; many users would rather choose the chain with the most support rather&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; than choosing the chain with their preferred rules.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; However, the question here is: how do we estimate what fraction of&lt;br/&gt;&amp;gt;&amp;gt; users&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; wants which rules? We don&amp;#39;t have a divining rod to determine with&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; certainty what users want. We can only make polls of various levels&lt;br/&gt;&amp;gt;&amp;gt; of&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; inaccuracy. The methods bitcoin has been using is community&lt;br/&gt;&amp;gt;&amp;gt; discussion&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; and social consensus estimation as well as miner signaling during the&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; actual deployment period. Neither of these are perfect, but they are&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; both reasonable enough mechanisms. However, because both of these&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; mechanisms are very rough estimates of user sentiment, we need to&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; consider the possibility that sometimes the estimate may be&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; substantially inaccurate when we design deployment procedures. This&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; inaccuracy is why we need multiple barriers in place for an upgrade,&lt;br/&gt;&amp;gt;&amp;gt; and&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; why we need to have higher thresholds of success (require larger&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; supermajorities in both consensus and miner signaling).&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; Developers obviously care about bitcoin and have an incentive&lt;br/&gt;&amp;gt;&amp;gt; (personal&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; and probably financial) to do it right. And miners have both an&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; incentive to keep the system healthy, as well as an incentive to&lt;br/&gt;&amp;gt;&amp;gt; mine on&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; the chain that the economic majority of users is using. But measuring&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; the consensus of the bitcoin community can be extraordinarily&lt;br/&gt;&amp;gt;&amp;gt; difficult&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; to do with consistent accuracy, and so I think miner signaling as it&lt;br/&gt;&amp;gt;&amp;gt; has&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; been used as a second barrier to entry for an upgrade is quite&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt; appropriate.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Sun, Jun 27, 2021 at 2:22 AM Eric Voskuil &amp;lt;eric at voskuil.org&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; I have not objected to anyone splitting. As I said, a split is&lt;br/&gt;&amp;gt;&amp;gt; always&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; possible, and of course has been done on a large scale. It is only&lt;br/&gt;&amp;gt;&amp;gt; the&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; misleading statements about inherent soft fork “compatibility” and&lt;br/&gt;&amp;gt;&amp;gt; the&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; implication that activation without hash power enforcement does not&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; create a split that I object to. People who know better should be&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; honest about it.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Far too many people have been led to believe there is some sort of&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; activation choice with “ensured” equal outcomes (maybe “slowed&lt;br/&gt;&amp;gt;&amp;gt; down”).&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; There is only a choice between creating a split and hash power&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; enforcement. Soft forks are rule changes, and thereby incompatible -&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; unless enforced by majority hash power.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; The statements below are grossly misleading and need to be called&lt;br/&gt;&amp;gt;&amp;gt; out&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; as such so that people can actually make this decision you speak of.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; This idea that “users” decide the rules is not the question. The&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; question is only how to avoid a split. If one does not care he can&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; split at any time, no discussion required.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; e&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Jun 27, 2021, at 01:47, Jorge Timón &amp;lt;jtimon at jtimon.cc&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ﻿If different users want different incompatible things (enough on&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; each side), there&amp;#39;s no way to avoid the split. We shouldn&amp;#39;t try to&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; avoid such a split.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Users decide the rules, not miners nor developers.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Sun, Jun 27, 2021 at 12:05 AM Eric Voskuil via bitcoin-dev&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;lt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Ultimately there is only one answer to this question. Get majority&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; hash power support.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Soft fork enforcement is the same act as any other censorship&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; enforcement, the difference is only a question of what people&lt;br/&gt;&amp;gt;&amp;gt; want.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Given that there is no collective “we”, those wants differ.&lt;br/&gt;&amp;gt;&amp;gt; Bitcoin&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; resolves this question of conflicting wants, but it is not a&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; democracy, it’s a market. One votes by trading.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; If one wants to enforce a soft fork (or otherwise censor) this is&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; accomplished by mining (or paying others to do so). Anyone can&lt;br/&gt;&amp;gt;&amp;gt; mine,&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; so everyone gets a say. Mining is trading capital now for more&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; later. If enough people want to do that, they can enforce a soft&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; fork. It’s time Bitcoiners stop thinking of miners as other&lt;br/&gt;&amp;gt;&amp;gt; people.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Anyone can mine, and that’s your vote.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Otherwise, as mentioned below, anyone can start a new coin. But&lt;br/&gt;&amp;gt;&amp;gt; it’s&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; dishonest to imply that one can do this and all others will surely&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; follow. This cannot be known, it’s merely a gamble. And it’s one&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; that has been shown to not always pay off.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; e&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Jun 26, 2021, at 14:43, Eric Voskuil &amp;lt;eric at voskuil.org&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ﻿For some definitions of “block”.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Without majority hash power support, activation simply means you&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; are off on a chain split. Anyone can of course split off from a&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; chain by changing a rule (soft or otherwise) at any time, so this&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; is a bit of an empty claim.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Nobody can stop a person from splitting. The relevant question is&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; how to *prevent* a split. And activation without majority hash&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; power certainly does not “ensure” this.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; e&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Jun 26, 2021, at 14:13, Luke Dashjr via bitcoin-dev&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;lt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ﻿BIP8 LOT=True just ensures miners cannot block an upgrade&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; entirely. They can still slow it down.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; It also already has the trinary state you seem to be describing&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; (although perhaps this could be better documented in the BIP):&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; users who oppose the softfork can and should treat the&lt;br/&gt;&amp;gt;&amp;gt; successful&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; signal (whether MASF or UASF) as invalid, thereby ensuring they&lt;br/&gt;&amp;gt;&amp;gt; do&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; not follow a chain with the rules in force.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; No additional bit is needed, as softforks are coordinated&lt;br/&gt;&amp;gt;&amp;gt; between&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; users, NOT miners (who have no particular say in them, aside&lt;br/&gt;&amp;gt;&amp;gt; from&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; their role as also being users). The miner involvement is only&lt;br/&gt;&amp;gt;&amp;gt; out&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; of necessity (to set the bit in the header, which users&lt;br/&gt;&amp;gt;&amp;gt; coordinate&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; with) and potentially to accelerate activation by protecting&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; upgrade-lagging users.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Luke&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; On Saturday 26 June 2021 20:21:52 Billy Tetrud via bitcoin-dev&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; wrote:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Given the recent controversy over upgrade mechanisms for the&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; non-controversial taproot upgrade, I have been thinking about&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; ways to solve the problems that both sides brought up. In&lt;br/&gt;&amp;gt;&amp;gt; short,&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; BIP8 LOT=true proponents make the point that lazy miners&lt;br/&gt;&amp;gt;&amp;gt; failing&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; to upgrade in a timely manner slow down releases of bitcoin&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; upgrades, and BIP9 / BIP8 LOT=false proponents make the point&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; that LOT=true can lead to undesirable forks that might cause a&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; lot of chaos. I believe both points are essentially correct and&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; have created a proposal&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;lt;&lt;br/&gt;&amp;gt;&amp;gt; &lt;a href=&#34;https://github.com/fresheneesz/bip-trinary-version-signaling/blo&#34;&gt;https://github.com/fresheneesz/bip-trinary-version-signaling/blo&lt;/a&gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; b/master/b ip-trinary-version-bits.md&amp;gt; for soft fork upgrades&lt;br/&gt;&amp;gt;&amp;gt; that&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; solve both problems.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; The proposal uses trinary version signaling rather than binary&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; signaling. For any particular prospective soft fork upgrade,&lt;br/&gt;&amp;gt;&amp;gt; this&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; allows for three signaling states:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; * Actively support the change.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; * Actively oppose the change.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; * Not signaling (neither support or oppose). This is the&lt;br/&gt;&amp;gt;&amp;gt; default&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; state.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Using this additional information, we can release&lt;br/&gt;&amp;gt;&amp;gt; non-contentious&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; upgrades much quicker (with a much lower percent of miners&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; signaling support). For contentious upgrades, miners who oppose&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; the change are incentivized to update their software to a&lt;br/&gt;&amp;gt;&amp;gt; version&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; that can actively signal opposition to the change. The more&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; opposition there is, the higher the threshold necessary to lock&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; in the upgrade. With the parameters I currently recommended in&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; the proposal, this chart shows how much support signaling would&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; be necessary given a particular amount of active opposition&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; signaling:&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; [image: thresholdChart.png]&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; If literally no one signals opposition, a 60% threshold should&lt;br/&gt;&amp;gt;&amp;gt; be&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; relatively safe because it is a supermajority amount that is&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; unlikely to change significantly very quickly (ie if 60% of&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; miners support the change today, its unlikely that less than a&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; majority of miners would support the change a year or two from&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; now), and if no one is signaling opposition, chances are that&lt;br/&gt;&amp;gt;&amp;gt; the&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; vast majority of the other 40% would also eventually signal&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; support.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; This both gives an incentive for &amp;#34;lazy&amp;#34; miners to upgrade if&lt;br/&gt;&amp;gt;&amp;gt; they&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; actually oppose the change while at the same time allowing&lt;br/&gt;&amp;gt;&amp;gt; these&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; lazy miners to remain lazy without slowing down the soft fork&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; activation much.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; I think now is the right time to discuss new soft fork upgrade&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; mechanisms, when there are no pressing soft fork upgrades ready&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; to deploy. Waiting until we need to deploy a soft fork to&lt;br/&gt;&amp;gt;&amp;gt; discuss&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; this will only delay things and cause contention again like it&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; did with taproot.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; I&amp;#39;m very curious to know what people think of this mechanism. I&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; would appreciate any comments here, or written as github issues&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; on the proposal repo itself.&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Thanks,&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; BT&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;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;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;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;&amp;gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt;&amp;gt;&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20210630/9c14659c/attachment-0001.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210630/9c14659c/attachment-0001.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:55:36Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsg5dg5sj9au6gz300lz83dvphf2377fazzau5dwncn86jmff3v7eczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kyejghq</id>
    
      <title type="html">📅 Original date posted:2021-05-17 📝 Original message:&amp;gt; ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsg5dg5sj9au6gz300lz83dvphf2377fazzau5dwncn86jmff3v7eczypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kyejghq" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqstz49xw6mp2q0pv4ae5leh8hm8wkphf6dplparp4unndy079aag4s3pd3pg&#39;&gt;nevent1q…d3pg&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-05-17&lt;br/&gt;📝 Original message:&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Are there people who can freely produce new mining equipment to an&lt;br/&gt;&amp;gt; arbitrary degree?&lt;br/&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;Close. Bitmain for example produces their own ASICs and rigs which they&lt;br/&gt;mine with. Antpool is controlled by Bitmain and has a significant amount of&lt;br/&gt;the hash power. The marginal cost of an ASIC chip or mining rig is low&lt;br/&gt;compared to R&amp;amp;D and setting up of the production lines etc. For Bitmain&lt;br/&gt;it’s relatively cheap to produce an additional mining rig.&lt;br/&gt;&lt;br/&gt;Unfortunately I failed to make sense of your other remarks which looked&lt;br/&gt;rather confused so I take the liberty to disregard them.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;_______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20210517/dd803ec5/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210517/dd803ec5/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:53:29Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsd043gnywv9scu52n7g5ude7mk88sjh8a60fk4t7zn888lsstepkszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kzzrxtd</id>
    
      <title type="html">📅 Original date posted:2021-05-16 📝 Original message:&amp;gt; ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsd043gnywv9scu52n7g5ude7mk88sjh8a60fk4t7zn888lsstepkszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kzzrxtd" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsp7p4043m95gfm47y260zg0snpw2dq2hnp3tfuec792tr9m7wlvnsnjm496&#39;&gt;nevent1q…m496&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-05-16&lt;br/&gt;📝 Original message:&amp;gt; if energy is only expended for 10% of the same duration, this money must&lt;br/&gt;now be spent on hardware.&lt;br/&gt;&lt;br/&gt;More equipment obviously increases the total energy usage.&lt;br/&gt;&lt;br/&gt;You correctly point out that the total expenses of a miner are not just&lt;br/&gt;energy but include capital expenses for equipment and operational cost for&lt;br/&gt;staff, rent etc.&lt;br/&gt;&lt;br/&gt;Actually, non-energy expenses are perhaps a much larger fraction of the&lt;br/&gt;total cost than you might expect. Miners using excess waste energy such as&lt;br/&gt;Chinese miners close to hydropower stations pay a near zero price for&lt;br/&gt;energy and are unlikely to be bound by the price of electricity.&lt;br/&gt;&lt;br/&gt;Unsurprisingly, miners having access to near-free electricity are&lt;br/&gt;responsible for a significant share of the total energy usage of Bitcoin.&lt;br/&gt;Since such energy is often waste energy from renewable sources such as&lt;br/&gt;hydropower, the carbon footprint of Bitcoin is not nearly as alarming as&lt;br/&gt;its energy usage implies. In fact, since mining is a race to the bottom in&lt;br/&gt;terms of cost, these large miners drive out competing miners that employ&lt;br/&gt;more expensive, often non-renewable sources of energy. It’s for instance&lt;br/&gt;impossible to mine profitably using household-priced electricity. Looking&lt;br/&gt;at it from that angle, access to renewable, near-free waste energy helps&lt;br/&gt;keeping Bitcoin more green than it would otherwise be. To put it another&lt;br/&gt;way: the high energy usage of the Bitcoin network indicates cheap,&lt;br/&gt;otherwise wasted energy is employed.&lt;br/&gt;&lt;br/&gt;For your proposal again this means that energy usage would not be likely to&lt;br/&gt;decrease appreciably, because large miners having access to near-free&lt;br/&gt;energy use the block-reward sized budget fully on equipment and other&lt;br/&gt;operational expenses.&lt;br/&gt;&lt;br/&gt;On the other hand, roughly every four years the coinbase reward halves,&lt;br/&gt;which does significantly lower the miner budget, at least in terms of BTC.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Sun, 16 May 2021 at 21:02, Karl via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; [sorry if I haven&amp;#39;t replied to the other thread on this, I get swamped&lt;br/&gt;&amp;gt; by email and don&amp;#39;t catch them all]&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; This solution is workable but it seems somewhat difficult to me at this&lt;br/&gt;&amp;gt; time.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; The clock might be implementable on a peer network level by requiring&lt;br/&gt;&amp;gt; inclusion of a transaction that was broadcast after a 9 minute delay.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Usually a 50% hashrate attack is needed to reverse a transaction in&lt;br/&gt;&amp;gt; bitcoin.  With this change, this naively appears to become a 5%&lt;br/&gt;&amp;gt; hashrate attack, unless a second source of truth around time and order&lt;br/&gt;&amp;gt; is added, to verify proposed histories with.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; A 5% hashrate attack is much harder here, because the users of mining&lt;br/&gt;&amp;gt; pools would be mining only 10% of the time, so compromising mining&lt;br/&gt;&amp;gt; pools would not be as useful.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Historically, hashrate has increased exponentially.  This means that&lt;br/&gt;&amp;gt; the difficulty of performing an attack, whether it is 5% or 50%, is&lt;br/&gt;&amp;gt; still culturally infeasible because it is a multiplicative, rather&lt;br/&gt;&amp;gt; than an exponential, change.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; If this approach were to be implemented, it could be important to&lt;br/&gt;&amp;gt; consider how many block confirmations people wait for to trust their&lt;br/&gt;&amp;gt; transaction is on the chain.  A lone powerful miner could&lt;br/&gt;&amp;gt; intentionally fork the chain more easily by a factor of 10.  They&lt;br/&gt;&amp;gt; would need to have hashrate that competes with a major pool to do so.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; How would you prevent miners to already compute the simpler difficulty&lt;br/&gt;&amp;gt; problem directly after the block was found and publish their solution&lt;br/&gt;&amp;gt; directly after minute 9? We would always have many people with a finished /&lt;br/&gt;&amp;gt; competing solution.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Such a chain would have to wait a longer time to add further blocks&lt;br/&gt;&amp;gt; and would permanently be shorter.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Your proposal won’t save any energy because it does nothing to decrease&lt;br/&gt;&amp;gt; the budget available to mine a block (being the block reward).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; You are assuming this budget is directly related to energy&lt;br/&gt;&amp;gt; expenditure, but if energy is only expended for 10% of the same&lt;br/&gt;&amp;gt; duration, this money must now be spent on hardware.  The supply of&lt;br/&gt;&amp;gt; bitcoin hardware is limited.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; In the long term, it won&amp;#39;t be, so a 10% decrease is a stop-gap&lt;br/&gt;&amp;gt; measure.  Additionally, in the long term, we will have quantum&lt;br/&gt;&amp;gt; computers and AI-designed cryptography algorithms, so things will be&lt;br/&gt;&amp;gt; different in a lot of other ways too.&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20210516/e9275902/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210516/e9275902/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:53:28Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqswthl9au25gymtd2hhysuhpqp06qyjqe3sdqkev660x5vuaf4se8gzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kt99gmk</id>
    
      <title type="html">📅 Original date posted:2021-05-16 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqswthl9au25gymtd2hhysuhpqp06qyjqe3sdqkev660x5vuaf4se8gzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kt99gmk" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrxgxza7jlzhfyz6nu0lrg3yypvzrul5jwmzhj94l99mjvs95eu3s863ee4&#39;&gt;nevent1q…3ee4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-05-16&lt;br/&gt;📝 Original message:Hi Michael,&lt;br/&gt;&lt;br/&gt;Your proposal won’t save any energy because it does nothing to decrease the&lt;br/&gt;budget available to mine a block (being the block reward).&lt;br/&gt;&lt;br/&gt;Even if it were technically possible to find a way for nodes to somehow&lt;br/&gt;reach consensus on a hash that gets generated after 9 minutes, all it&lt;br/&gt;achieves is that miners will be expending the entire budget given to them&lt;br/&gt;in the form of the block reward within a single minute on average.&lt;br/&gt;&lt;br/&gt;Also please realize that the energy expenditure of Bitcoin is a fundamental&lt;br/&gt;part of its design. An attacker has no other option than to expend as much&lt;br/&gt;as half of all the miners together do in order for a sustained 51% attack&lt;br/&gt;to be successful, making such attack uneconomical.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;On Sat, 15 May 2021 at 23:57, Michael Fuhrmann via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Hello,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Bitcoin should create blocks every 10 minutes in average. So why do&lt;br/&gt;&amp;gt; miners need to mine the 9 minutes after the last block was found? It&amp;#39;s&lt;br/&gt;&amp;gt; not necessary.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Problem: How to prevent &amp;#34;pre-mining&amp;#34; in the 9 minutes time window?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Possible ideas for discussion:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; - (maybe most difficult) global network timer sending a salted hash time&lt;br/&gt;&amp;gt; code after 9 minutes. this enables validation by nodes.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; - (easy attempt) mining jobs before 9 minutes have a 10 (or 100 or just&lt;br/&gt;&amp;gt; high enough) times higher difficulty. so everyone can mine any time but&lt;br/&gt;&amp;gt; before to 9 minutes are up there will be a too high downside. It is more&lt;br/&gt;&amp;gt; efficient to wait then paying high bills. The bitcoin will get a &amp;#34;puls&amp;#34;.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I dont think I see all problems behind these ideas but if there is a&lt;br/&gt;&amp;gt; working solution to do so then the energy fud will find it&amp;#39;s end. Saving&lt;br/&gt;&amp;gt; energy without loosing rosbustness.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; :)&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20210516/2c39b6a2/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210516/2c39b6a2/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:53:25Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqs9hxumeh8x8j4zkjeh05g0lvt4pxjv6luxzjh82gtvk0w9rrl8tpszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kk6mtly</id>
    
      <title type="html">📅 Original date posted:2021-05-18 📝 Original message:Hi ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqs9hxumeh8x8j4zkjeh05g0lvt4pxjv6luxzjh82gtvk0w9rrl8tpszypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kk6mtly" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgldyggh0yew9x3rcsgxg3ysfw54dnzze75n2krl5fj4nz5tdllns3aj4lr&#39;&gt;nevent1q…j4lr&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-05-18&lt;br/&gt;📝 Original message:Hi ZmnSCPxj,&lt;br/&gt;&lt;br/&gt;Please note that I am not suggesting VDFs as a means to save energy, but&lt;br/&gt;solely as a means to make the time between blocks more constant.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Tue, 18 May 2021 at 12:42, ZmnSCPxj &amp;lt;ZmnSCPxj at protonmail.com&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Good morning Zac,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; VDFs might enable more constant block times, for instance by having a&lt;br/&gt;&amp;gt; two-step PoW:&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; 1. Use a VDF that takes say 9 minutes to resolve (VDF being subject to&lt;br/&gt;&amp;gt; difficulty adjustments similar to the as-is). As per the property of VDFs,&lt;br/&gt;&amp;gt; miners are able show proof of work.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; 2. Use current PoW mechanism with lower difficulty so finding a block&lt;br/&gt;&amp;gt; takes 1 minute on average, again subject to as-is difficulty adjustments.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; As a result, variation in block times will be greatly reduced.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; As I understand it, another weakness of VDFs is that they are not&lt;br/&gt;&amp;gt; inherently progress-free (their sequential nature prevents that; they are&lt;br/&gt;&amp;gt; inherently progress-requiring).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Thus, a miner which focuses on improving the amount of energy that it can&lt;br/&gt;&amp;gt; pump into the VDF circuitry (by overclocking and freezing the circuitry),&lt;br/&gt;&amp;gt; could potentially get into a winner-takes-all situation, possibly leading&lt;br/&gt;&amp;gt; to even *worse* competition and even *more* energy consumption.&lt;br/&gt;&amp;gt; After all, if you can start mining 0.1s faster than the competition, that&lt;br/&gt;&amp;gt; is a 0.1s advantage where *only you* can mine *in the entire world*.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Regards,&lt;br/&gt;&amp;gt; ZmnSCPxj&lt;br/&gt;&amp;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/20210518/abd8b876/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210518/abd8b876/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:52:46Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqsgmfvr0rtyhw0syd7p88m5gnpvtgkxw4ualp0t3ts2p587m2wxprqzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675k6ucdvl</id>
    
      <title type="html">📅 Original date posted:2021-05-18 📝 Original message:VDFs ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqsgmfvr0rtyhw0syd7p88m5gnpvtgkxw4ualp0t3ts2p587m2wxprqzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675k6ucdvl" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszuftucxrhxs0cjwelpv7qfnevhe0vqt20fywwxks7xa8vstw6qess2q8aj&#39;&gt;nevent1q…q8aj&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-05-18&lt;br/&gt;📝 Original message:VDFs might enable more constant block times, for instance by having a&lt;br/&gt;two-step PoW:&lt;br/&gt;&lt;br/&gt;1. Use a VDF that takes say 9 minutes to resolve (VDF being subject to&lt;br/&gt;difficulty adjustments similar to the as-is). As per the property of VDFs,&lt;br/&gt;miners are able show proof of work.&lt;br/&gt;&lt;br/&gt;2. Use current PoW mechanism with lower difficulty so finding a block takes&lt;br/&gt;1 minute on average, again subject to as-is difficulty adjustments.&lt;br/&gt;&lt;br/&gt;As a result, variation in block times will be greatly reduced.&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Tue, 18 May 2021 at 09:07, ZmnSCPxj via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; Good morning Erik,&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Verifiable Delay Functions involve active participation of a single&lt;br/&gt;&amp;gt; &amp;gt; verifier. Without this a VDF decays into a proof-of-work (multiple&lt;br/&gt;&amp;gt; &amp;gt; verifiers === parallelism).&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; The verifier, in this case is &amp;#34;the bitcoin network&amp;#34; taken as a whole.&lt;br/&gt;&amp;gt; &amp;gt; I think it is reasonable to consider that some difficult-to-game&lt;br/&gt;&amp;gt; &amp;gt; property of the last N blocks (like the hash of the last 100&lt;br/&gt;&amp;gt; &amp;gt; block-id&amp;#39;s or whatever), could be the verification input.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; The VDF gets calculated by every eligible proof-of-burn miner, and&lt;br/&gt;&amp;gt; &amp;gt; then this is used to prevent a timing issue.&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Seems reasonable to me, but I haven&amp;#39;t looked too far into the&lt;br/&gt;&amp;gt; &amp;gt; requirements of VDF&amp;#39;s&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; nice summary for anyone who is interested:&lt;br/&gt;&amp;gt; &amp;gt; &lt;a href=&#34;https://medium.com/@djrtwo/vdfs-are-not-proof-of-work-91ba3bec2bf4&#34;&gt;https://medium.com/@djrtwo/vdfs-are-not-proof-of-work-91ba3bec2bf4&lt;/a&gt;&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; While VDF&amp;#39;s almost always lead to a &amp;#34;cpu-speed monopoly&amp;#34;, this would&lt;br/&gt;&amp;gt; &amp;gt; only be helpful for block latency in a proof-of-burn chain. Block&lt;br/&gt;&amp;gt; &amp;gt; height would be calculated by eligible-miner-burned-coins, so the&lt;br/&gt;&amp;gt; &amp;gt; monopoly could be easily avoided.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Interesting link.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; However, I would like to point out that the *real* reason that PoW&lt;br/&gt;&amp;gt; consumes lots of power is ***NOT***:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; * Proof-of-work is parallelizable, so it allows miners consume more energy&lt;br/&gt;&amp;gt; (by buying more grinders) in order to get more blocks than their&lt;br/&gt;&amp;gt; competitors.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; The *real* reason is:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; * Proof-of-work allows miners to consume more energy in order to get more&lt;br/&gt;&amp;gt; blocks than their competitors.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; VDFs attempt to sidestep that by removing parallelism.&lt;br/&gt;&amp;gt; However, there are ways to increase *sequential* speed, such as:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; * Overclocking.&lt;br/&gt;&amp;gt;   * This shortens lifetime, so you can spend more energy (on building new&lt;br/&gt;&amp;gt; miners) in order to get more blocks than your competitors.&lt;br/&gt;&amp;gt; * Lower temperatures.&lt;br/&gt;&amp;gt;   * This requires refrigeration/cooling, so you can spend more energy (on&lt;br/&gt;&amp;gt; the refrigeration process) in order to get more blocks than your&lt;br/&gt;&amp;gt; competitors.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I am certain people with gaming rigs can point out more ways to improve&lt;br/&gt;&amp;gt; sequential speed, as necessary to get more frames per second.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Given the above, I think VDFs will still fail at their intended task.&lt;br/&gt;&amp;gt; Speed, yo.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Thus, VDFs do not serve as a sufficient deterrent away from&lt;br/&gt;&amp;gt; ever-increasing energy consumption --- it just moves the energy consumption&lt;br/&gt;&amp;gt; increase away from the obvious (parallelism) to the&lt;br/&gt;&amp;gt; obscure-if-you-have-no-gamer-buds.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; You humans just need to get up to Kardashev 1.0, stat.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Regards,&lt;br/&gt;&amp;gt; ZmnSCPxj&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20210518/2f1a992a/attachment.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210518/2f1a992a/attachment.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:52:45Z</updated>
  </entry>

  <entry>
    <id>https://njump.me/nevent1qqs2ps3t35dx5w9l9f449h5tls0twmxulfqwyyfa6ayvaevy3mkr9wgzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kjhj0zl</id>
    
      <title type="html">📅 Original date posted:2021-04-24 📝 Original message:&amp;gt; ...</title>
    
    <link rel="alternate" href="https://njump.me/nevent1qqs2ps3t35dx5w9l9f449h5tls0twmxulfqwyyfa6ayvaevy3mkr9wgzypqn0w6p54dpctz36x8n0ueu7rpfpqjz93trnrv9nlcsshefa675kjhj0zl" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrwjvlu8eqhxj4uwscwu8ql2nyup2wawztp4hul83j4ymkdee0s7ghkc2xs&#39;&gt;nevent1q…c2xs&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;📅 Original date posted:2021-04-24&lt;br/&gt;📝 Original message:&amp;gt; 1. More data allowed in scriptSig, e.g. 80 byte payload (81 actually, I&lt;br/&gt;&amp;gt;   think) for OP_RETURN versus 40 bytes for a BIP141 payload.&lt;br/&gt;&amp;gt;   Maximizing payload size better amortizes the overhead cost of the&lt;br/&gt;&amp;gt;   containing transaction and the output&amp;#39;s nValue field.&lt;br/&gt;&lt;br/&gt;In order to reduce the footprint of data stored on-chain, could it perhaps&lt;br/&gt;be beneficial to introduce some non-transaction data structure in order to&lt;br/&gt;facilitate storing data on-chain such that it maximizes payload size&lt;br/&gt;vs. on-chain size, while at the same time ensuring that using such data&lt;br/&gt;structure is (almost) as expensive in use per payload-byte as the&lt;br/&gt;next-cheapest alternative (which now is using OP_RETURN) with&lt;br/&gt;help of weight units?&lt;br/&gt;&lt;br/&gt;Zac&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;On Sun, Apr 25, 2021 at 12:01 AM David A. Harding via bitcoin-dev &amp;lt;&lt;br/&gt;bitcoin-dev at lists.linuxfoundation.org&amp;gt; wrote:&lt;br/&gt;&lt;br/&gt;&amp;gt; On Sat, Apr 24, 2021 at 01:05:25PM -0700, Jeremy wrote:&lt;br/&gt;&amp;gt; &amp;gt; I meant the type itself is too wide, not the length of the value. As in&lt;br/&gt;&amp;gt; &amp;gt; Script can represent things we know nothing about.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I guess I still don&amp;#39;t understand your concern, then.  If script can&lt;br/&gt;&amp;gt; represent things we know nothing about, then script commitments such as&lt;br/&gt;&amp;gt; P2SH, P2WSH, and P2TR also represent things we know nothing about.  All&lt;br/&gt;&amp;gt; you know is what container format they used.  For P2PK, bare multisig,&lt;br/&gt;&amp;gt; OP_RETURN, and other direct uses of scriptPubKey, that container format&lt;br/&gt;&amp;gt; is &amp;#34;bare&amp;#34; (or whatever you want to call it).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Btw: According to... Oh wait... You?&lt;br/&gt;&amp;gt; &amp;gt;&lt;br/&gt;&amp;gt; &lt;a href=&#34;https://bitcoin.stackexchange.com/questions/35878/is-there-a-maximum-size-of-a-scriptsig-scriptpubkey&#34;&gt;https://bitcoin.stackexchange.com/questions/35878/is-there-a-maximum-size-of-a-scriptsig-scriptpubkey&lt;/a&gt;&lt;br/&gt;&amp;gt; &amp;gt; the max size is 10k bytes.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I&amp;#39;m not sure what I knew at the time I wrote that answer, but the 10,000&lt;br/&gt;&amp;gt; byte limit is only applied when EvalScript is run, which only happens&lt;br/&gt;&amp;gt; when the output is being spent.  I&amp;#39;ve appended to this email a&lt;br/&gt;&amp;gt; demonstration of creating a 11,000 byte OP_RETURN on regtest (I tried&lt;br/&gt;&amp;gt; 999,000 bytes but ran into problems with bash&amp;#39;s maximum command line&lt;br/&gt;&amp;gt; length limit).  I&amp;#39;ve updated the answer to hopefully make it more&lt;br/&gt;&amp;gt; correct.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; Is it possible/easy to, say, using bech32m make an inappropriate message&lt;br/&gt;&amp;gt; in&lt;br/&gt;&amp;gt; &amp;gt; the address? You&amp;#39;d have to write the message, then see what it decodes to&lt;br/&gt;&amp;gt; &amp;gt; without checking, and then re encode? I guess this is worse than hex?&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; If someone wants to abuse bech32m, I suspect they&amp;#39;ll do it the same way&lt;br/&gt;&amp;gt; people have abused base58check[1], by using the address format&amp;#39;s&lt;br/&gt;&amp;gt; alphabet directly.  E.g., you compose your message using only&lt;br/&gt;&amp;gt; the characters qpzry9x8gf2tvdw0s3jn54khce6mua7l and then append&lt;br/&gt;&amp;gt; the appropriate checksum.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; [1]&lt;br/&gt;&amp;gt; &lt;a href=&#34;https://en.bitcoin.it/wiki/P2SH%C2%B2#The_problem:_storing_data_in_hashes&#34;&gt;https://en.bitcoin.it/wiki/P2SH%C2%B2#The_problem:_storing_data_in_hashes&lt;/a&gt;&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; But it seems this is a general thing... If you wanted an inappropriate&lt;br/&gt;&amp;gt; &amp;gt; message you could therefore just use bech32m addressed outputs.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Yes, and people have done that with base58check.  IsStandard OP_RETURN&lt;br/&gt;&amp;gt; attempts to minimize that abuse by being cheaper in two ways:&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; 1. More data allowed in scriptSig, e.g. 80 byte payload (81 actually, I&lt;br/&gt;&amp;gt;    think) for OP_RETURN versus 40 bytes for a BIP141 payload.&lt;br/&gt;&amp;gt;    Maximizing payload size better amortizes the overhead cost of the&lt;br/&gt;&amp;gt;    containing transaction and the output&amp;#39;s nValue field.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; 2. Exemption from the dust limit.  If you use a currently defined&lt;br/&gt;&amp;gt;    address type, the nValue needs to pay at least a few thousand nBTC&lt;br/&gt;&amp;gt;    (few hundred satoshis), about $0.15 USD minimum at $50k USD/BTC.  For&lt;br/&gt;&amp;gt;    OP_RETURN, the nValue can be 0, so there&amp;#39;s no additional cost beyond&lt;br/&gt;&amp;gt;    normal transaction relay fees.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; Although someone creating an OP_RETURN up to ~1 MB with miner support&lt;br/&gt;&amp;gt; can bypass the dust limit, the efficiency advantage remains no matter&lt;br/&gt;&amp;gt; what.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; One of the nice things is that the current psbt interface uses a blind&lt;br/&gt;&amp;gt; &amp;gt; union type whereby the entires in an array are either [address, amount]&lt;br/&gt;&amp;gt; or&lt;br/&gt;&amp;gt; &amp;gt; [&amp;#34;data&amp;#34;, hex]. Having an address type would allow more uniform handling,&lt;br/&gt;&amp;gt; &amp;gt; which is convenient for strongly typed RPC bindings (e.g. rust bitcoin&lt;br/&gt;&amp;gt; uses&lt;br/&gt;&amp;gt; &amp;gt; a hashmap of address to amount so without a patch you can&amp;#39;t create op&lt;br/&gt;&amp;gt; &amp;gt; returns).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I don&amp;#39;t particularly care how the data in PSBTs are structured.  My mild&lt;br/&gt;&amp;gt; opposition was to adding code to the wallet that exposes everyday users&lt;br/&gt;&amp;gt; to OP_RETURN addresses.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; &amp;gt; I would much prefer to not have to do this in a custom way, as opposed&lt;br/&gt;&amp;gt; &amp;gt; to a way which is defined in a standard manner across all software&lt;br/&gt;&amp;gt; &amp;gt; (after all, that&amp;#39;s the point of standards).&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; I&amp;#39;m currently &#43;0.1 on the idea of an address format of OP_RETURN, but I&lt;br/&gt;&amp;gt; want to make sure this isn&amp;#39;t underwhelmingly motivated or will lead to a&lt;br/&gt;&amp;gt; resurgence of block chain graffiti.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; -Dave&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; ## Creating an 11,000 byte OP_RETURN&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; $ bitcoind -daemon -regtest -acceptnonstdtxn&lt;br/&gt;&amp;gt; Bitcoin Core starting&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; $ bitcoin-cli -regtest -generate 101&lt;br/&gt;&amp;gt; {&lt;br/&gt;&amp;gt;   &amp;#34;address&amp;#34;: &amp;#34;bcrt1qh9uka5z040vx2rc3ltz3tpwmq4y2mt0eufux9r&amp;#34;,&lt;br/&gt;&amp;gt;   &amp;#34;blocks&amp;#34;: [&lt;br/&gt;&amp;gt; [...]&lt;br/&gt;&amp;gt; }&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; $ bitcoin-cli -regtest send &amp;#39;[{&amp;#34;data&amp;#34;: &amp;#34;&amp;#39;$( dd if=/dev/zero bs=1000&lt;br/&gt;&amp;gt; count=11 | xxd -g0 -p | tr -d &amp;#39;\n&amp;#39; )&amp;#39;&amp;#34;}]&amp;#39;&lt;br/&gt;&amp;gt; 11&#43;0 records in&lt;br/&gt;&amp;gt; 11&#43;0 records out&lt;br/&gt;&amp;gt; 11000 bytes (11 kB, 11 KiB) copied, 0.000161428 s, 68.1 MB/s&lt;br/&gt;&amp;gt; {&lt;br/&gt;&amp;gt;   &amp;#34;txid&amp;#34;:&lt;br/&gt;&amp;gt; &amp;#34;ef3d396c7d21914a2c308031c9ba1857694fc33df71f5a349b409ab3406dab51&amp;#34;,&lt;br/&gt;&amp;gt;   &amp;#34;complete&amp;#34;: true&lt;br/&gt;&amp;gt; }&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; $ bitcoin-cli -regtest getrawmempool&lt;br/&gt;&amp;gt; [&lt;br/&gt;&amp;gt;   &amp;#34;ef3d396c7d21914a2c308031c9ba1857694fc33df71f5a349b409ab3406dab51&amp;#34;&lt;br/&gt;&amp;gt; ]&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; $ bitcoin-cli -regtest -generate 1&lt;br/&gt;&amp;gt; {&lt;br/&gt;&amp;gt;   &amp;#34;address&amp;#34;: &amp;#34;bcrt1qlzjd90tkfkr09m867zxhte9rqd3t03wc5py5zh&amp;#34;,&lt;br/&gt;&amp;gt;   &amp;#34;blocks&amp;#34;: [&lt;br/&gt;&amp;gt;     &amp;#34;2986e9588c5bd26a629020b1ce8014d1f4ac9ac19106d216d3abb3a314c5604b&amp;#34;&lt;br/&gt;&amp;gt;   ]&lt;br/&gt;&amp;gt; }&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; $bitcoin-cli -regtest getblock&lt;br/&gt;&amp;gt; 2986e9588c5bd26a629020b1ce8014d1f4ac9ac19106d216d3abb3a314c5604b 2 | jq&lt;br/&gt;&amp;gt; .tx[1].txid&lt;br/&gt;&amp;gt; &amp;#34;ef3d396c7d21914a2c308031c9ba1857694fc33df71f5a349b409ab3406dab51&amp;#34;&lt;br/&gt;&amp;gt; _______________________________________________&lt;br/&gt;&amp;gt; bitcoin-dev mailing list&lt;br/&gt;&amp;gt; bitcoin-dev at lists.linuxfoundation.org&lt;br/&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;&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/20210425/93b322ab/attachment-0001.html&amp;gt&#34;&gt;http://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20210425/93b322ab/attachment-0001.html&amp;gt&lt;/a&gt;;
    </content>
    <updated>2023-06-07T22:51:57Z</updated>
  </entry>

</feed>