summaryrefslogtreecommitdiff
path: root/16
diff options
context:
space:
mode:
authorZac Greenwood <zachgrw@gmail.com>2021-08-01 10:09:26 +0200
committerbitcoindev <bitcoindev@gnusha.org>2021-08-01 08:09:39 +0000
commit5ee604f555de4c8c698247ff2b3e3cadb05e6ff1 (patch)
treec50d40e0fe6ddada61ecee690756d632f6294629 /16
parent4a3bc80b04e41c8972f4619a439644d5a0707077 (diff)
downloadpi-bitcoindev-5ee604f555de4c8c698247ff2b3e3cadb05e6ff1.tar.gz
pi-bitcoindev-5ee604f555de4c8c698247ff2b3e3cadb05e6ff1.zip
[bitcoin-dev] Exploring: limiting transaction output amount as a function of total input value
Diffstat (limited to '16')
-rw-r--r--16/0475d9578af188c9f7747c5195b5360a428db3344
1 files changed, 344 insertions, 0 deletions
diff --git a/16/0475d9578af188c9f7747c5195b5360a428db3 b/16/0475d9578af188c9f7747c5195b5360a428db3
new file mode 100644
index 000000000..c67490c93
--- /dev/null
+++ b/16/0475d9578af188c9f7747c5195b5360a428db3
@@ -0,0 +1,344 @@
+Return-Path: <zachgrw@gmail.com>
+Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])
+ by lists.linuxfoundation.org (Postfix) with ESMTP id 0A42EC000E
+ for <bitcoin-dev@lists.linuxfoundation.org>;
+ Sun, 1 Aug 2021 08:09:39 +0000 (UTC)
+Received: from localhost (localhost [127.0.0.1])
+ by smtp4.osuosl.org (Postfix) with ESMTP id F3E6C4022B
+ for <bitcoin-dev@lists.linuxfoundation.org>;
+ Sun, 1 Aug 2021 08:09:38 +0000 (UTC)
+X-Virus-Scanned: amavisd-new at osuosl.org
+X-Spam-Flag: NO
+X-Spam-Score: -2.098
+X-Spam-Level:
+X-Spam-Status: No, score=-2.098 tagged_above=-999 required=5
+ tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1,
+ DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,
+ HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,
+ SPF_PASS=-0.001] autolearn=ham autolearn_force=no
+Authentication-Results: smtp4.osuosl.org (amavisd-new);
+ dkim=pass (2048-bit key) header.d=gmail.com
+Received: from smtp4.osuosl.org ([127.0.0.1])
+ by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)
+ with ESMTP id AyP2Un7cUv2N
+ for <bitcoin-dev@lists.linuxfoundation.org>;
+ Sun, 1 Aug 2021 08:09:38 +0000 (UTC)
+X-Greylist: whitelisted by SQLgrey-1.8.0
+Received: from mail-il1-x12f.google.com (mail-il1-x12f.google.com
+ [IPv6:2607:f8b0:4864:20::12f])
+ by smtp4.osuosl.org (Postfix) with ESMTPS id E22764021C
+ for <bitcoin-dev@lists.linuxfoundation.org>;
+ Sun, 1 Aug 2021 08:09:37 +0000 (UTC)
+Received: by mail-il1-x12f.google.com with SMTP id a14so13784665ila.1
+ for <bitcoin-dev@lists.linuxfoundation.org>;
+ Sun, 01 Aug 2021 01:09:37 -0700 (PDT)
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
+ h=mime-version:from:date:message-id:subject:to;
+ bh=hjn/88igarBHPfWU1A2S+6MJRSvZzWGNuo3XIsDMoEU=;
+ b=OQ/FxQvt5z9ljld7nlIlOdSo45UC1rgaBa9VPWf42c1Ov9uXqH3csfCEc2oSao59em
+ rQ5W3YRbXNviNlJhFXGIsFedjsa81DwNDkNYmehXv5FM8LcfZleJeBYqWqiFaJLju5Ru
+ RTRNJVsdMAx8NC2S49FEqx+dpKP4944JnsvvMGDomwuCKD45L4QRPXstURcHWjHjiaBi
+ Y8OiP79FjiWW3ITefs5UjPcb1KcUu2w7t40r0edYQc83iPUnE3K/gBbhwGc/w+yJaSVL
+ igfQ+pWjHfIHAiZfxngF+fceR8SEO67kPZnhuh78SBMe9w5w5cOzaTwt/+liruT0k26r
+ uorg==
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+ d=1e100.net; s=20161025;
+ h=x-gm-message-state:mime-version:from:date:message-id:subject:to;
+ bh=hjn/88igarBHPfWU1A2S+6MJRSvZzWGNuo3XIsDMoEU=;
+ b=he47DSgaqi6Yj4u8bLPenl+HdPe96q1C/T2PTklAo/RMWPpS3zQOlPGAm1WSzz5R5y
+ FROiLXJHDh4vazaHfDIbdHHhhrlxBfDib6EmrKiI3JbZ/9zmwTTDr2eLT9m+jB1H8XsN
+ 9EnNQ7aa45XLn48GmFpLjHsUV6siEHuu4MhzseCCUrXLd80JD3xN4lxOvMbnQri9fnUJ
+ xdiFjR5eVet14p8m6KzZfWx7NvOPZUYwg4UOM5qpdS7jUX+ZIasMnjxN58/os9GpFshD
+ r1VZnKErFXs3wkbbn1ogkNhXc1dMdFhyB0yUFji6BTtFarzCN+KsjCkDGcTUCCC3jVPk
+ 0AcQ==
+X-Gm-Message-State: AOAM530+GHZpuZqtB/m9KYyLG6DeVTheHV5HOKWkL4HhTsOlTaPSDGMz
+ PF/bR964/sdNnDosBsIJ00cb0gZ7wlspSBGocLymGYV+GK4=
+X-Google-Smtp-Source: ABdhPJzZiojDp9WvGAXJIObXTIJk8Dp/6Y0vbRK+VTSFx07nu1i4bunXFPcZlNj/O6OxzjmInbpUKeWhYOx4sVTYAcU=
+X-Received: by 2002:a92:7d08:: with SMTP id y8mr5319588ilc.111.1627805376903;
+ Sun, 01 Aug 2021 01:09:36 -0700 (PDT)
+MIME-Version: 1.0
+From: Zac Greenwood <zachgrw@gmail.com>
+Date: Sun, 1 Aug 2021 10:09:26 +0200
+Message-ID: <CAJ4-pEAETy7_vOez5H32mZLg9gRpRajvoBjZyBT_v=DEqdQJvQ@mail.gmail.com>
+To: Bitcoin Protocol Discussion <bitcoin-dev@lists.linuxfoundation.org>
+Content-Type: multipart/alternative; boundary="00000000000041002705c87af934"
+X-Mailman-Approved-At: Sun, 01 Aug 2021 16:32:05 +0000
+Subject: [bitcoin-dev] Exploring: limiting transaction output amount as a
+ function of total input value
+X-BeenThere: bitcoin-dev@lists.linuxfoundation.org
+X-Mailman-Version: 2.1.15
+Precedence: list
+List-Id: Bitcoin Protocol Discussion <bitcoin-dev.lists.linuxfoundation.org>
+List-Unsubscribe: <https://lists.linuxfoundation.org/mailman/options/bitcoin-dev>,
+ <mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=unsubscribe>
+List-Archive: <http://lists.linuxfoundation.org/pipermail/bitcoin-dev/>
+List-Post: <mailto:bitcoin-dev@lists.linuxfoundation.org>
+List-Help: <mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=help>
+List-Subscribe: <https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev>,
+ <mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=subscribe>
+X-List-Received-Date: Sun, 01 Aug 2021 08:09:39 -0000
+
+--00000000000041002705c87af934
+Content-Type: text/plain; charset="UTF-8"
+
+[Resubmitting to list with minor edits. My previous submission ended up
+inside an existing thread, apologies.]
+
+Hi list,
+
+I'd like to explore whether it is feasible to implement new scripting
+capabilities in Bitcoin that enable limiting the output amount of a
+transaction based on the total value of its inputs. In other words, to
+implement the ability to limit the maximum amount that can be sent from an
+address.
+
+Two use cases come to mind:
+
+UC1: enable a user to add additional protection their funds by
+rate-limiting the amount that they are allowed to send during a certain
+period (measured in blocks). A typical use case might be a user that
+intends to hodl their bitcoin, but still wishes to occasionally send small
+amounts. Rate-limiting avoids an attacker from sweeping all the users'
+funds in a single transaction, allowing the user to become aware of the
+theft and intervene to prevent further thefts.
+
+UC2: exchanges may wish to rate-limit addresses containing large amounts of
+bitcoin, adding warm- or hot-wallet functionality to a cold-storage
+address. This would enable an exchange to drastically reduce the number of
+times a cold wallet must be accessed with private keys that give access to
+the full amount.
+
+In a typical setup, I'd envision using multisig such that the user has two
+sets of private keys to their encumbered address (with a "set" of keys
+meaning "one or more" keys). One set of private keys allows only for
+sending with rate-limiting restrictions in place, and a second set of
+private keys allowing for sending any amount without rate-limiting,
+effectively overriding such restriction.
+
+The parameters that define in what way an output is rate-limited might be
+defined as follows:
+
+Param 1: a block height "h0" indicating the first block height of an epoch;
+Param 2: a block height "h1" indicating the last block height of an epoch;
+Param 3: an amount "a" in satoshi indicating the maximum amount that is
+allowed to be sent in any epoch;
+Param 4: an amount "a_remaining" (in satoshi) indicating the maximum amount
+that is allowed to be sent within the current epoch.
+
+For example, consider an input containing 100m sats (1 BTC) which has been
+rate-limited with parameters (h0, h1, a, a_remaining) of (800000, 800143,
+500k, 500k). These parameters define that the address is rate-limited to
+sending a maximum of 500k sats in the current epoch that starts at block
+height 800000 and ends at height 800143 (or about one day ignoring block
+time variance) and that the full amount of 500k is still sendable. These
+rate-limiting parameters ensure that it takes at minimum 100m / 500k = 200
+transactions and 200 x 144 blocks or about 200 days to spend the full 100m
+sats. As noted earlier, in a typical setup a user should retain the option
+to transact the entire amount using a second (set of) private key(s).
+
+For rate-limiting to work, any change output created by a transaction from
+a rate-limited address must itself be rate-limited as well. For instance,
+expanding on the above example, assume that the user spends 200k sats from
+a rate-limited address a1 containing 100m sats:
+
+Start situation:
+At block height 800000: rate-limited address a1 is created;
+Value of a1: 100.0m sats;
+Rate limiting params of a1: h0=800000, h1=800143, a=500k, a_remaining=500k;
+
+Transaction t1:
+Included at block height 800100;
+Spend: 200k + fee;
+Rate limiting params: h0=800000, h1=800143, a=500k, a_remaining=300k.
+
+Result:
+Value at destination address: 200k sats;
+Rate limiting params at destination address: none;
+Value at change address a2: 99.8m sats;
+Rate limiting params at change address a2: h0=800000, h1=800143, a=500k,
+a_remaining=300k.
+
+In order to properly enforce rate limiting, the change address must be
+rate-limited such that the original rate limit of 500k sats per 144 blocks
+cannot be exceeded. In this example, the change address a2 were given the
+same rate limiting parameters as the transaction that served as its input.
+As a result, from block 800100 up until and including block 800143, a
+maximum amount of 300k sats is allowed to be spent from the change address.
+
+Example continued:
+a2: 99.8 sats at height 800100;
+Rate-limit params: h0=800000, h1=800143, a=500k, a_remaining=300k;
+
+Transaction t2:
+Included at block height 800200
+Spend: 400k + fees.
+Rate-limiting params: h0=800144, h1=800287, a=500k, a_remaining=100k.
+
+Result:
+Value at destination address: 400k sats;
+Rate limiting params at destination address: none;
+Value at change address a3: 99.4m sats;
+Rate limiting params at change address a3: h0=800144, h1=800287, a=500k,
+a_remaining=100k.
+
+Transaction t2 is allowed because it falls within the next epoch (running
+from 800144 to 800287) so a spend of 400k does not violate the constraint
+of 500k per epoch.
+
+As could be seen, the rate limiting parameters are part of the transaction
+and chosen by the user (or their wallet). This means that the parameters
+must be validated to ensure that they do not violate the intended
+constraints.
+
+For instance, this transaction should not be allowed:
+a2: 99.8 sats at height 800100;
+Rate-limit params of a2: h0=800000, h1=800143, a=500k, a_remaining=300k;
+
+Transaction t2a:
+Included at block height 800200;
+Spend: 400k + fees;
+Rate-limit params: h0=800124, h1=800267, a=500k, a_remaining=100k.
+
+This transaction t2a attempts to shift the epoch forward by 20 blocks such
+that it starts at 800124 instead of 800144. Shifting the epoch forward like
+this must not be allowed because it enables spending more that the rate
+limit allows, which is 500k in any epoch of 144 blocks. It would enable
+overspending:
+
+t1: spend 200k at 800100 (epoch 1: total: 200k);
+t2a: spend 400k at 800200 (epoch 2: total: 400k);
+t3a: spend 100k at 800201 (epoch 2: total: 500k);
+t4a: spend 500k at 800268 (epoch 2: total: 1000k, overspending for epoch 2).
+
+Specifying the rate-limiting parameters explicitly at every transaction
+allows the user to tighten the spending limit by setting tighter limits or
+for instance by setting a_remainder to 0 if they wish to enforce not
+spending more during an epoch. A second advantage of explicitly specifying
+the four rate-limiting parameters with each transaction is that it allows
+the system to fully validate the transaction without having to consider any
+previous transactions within an epoch.
+
+I will stop here because I would like to gauge interest in this idea first
+before continuing work on other aspects. Two main pieces of work jump to
+mind:
+
+Define all validations;
+Describe aggregate behaviour of multiple (rate-limited) inputs, proof that
+two rate-limited addresses cannot spend more than the sum of their
+individual limits.
+
+Zac
+
+--00000000000041002705c87af934
+Content-Type: text/html; charset="UTF-8"
+Content-Transfer-Encoding: quoted-printable
+
+<div dir=3D"ltr"><div>[Resubmitting to list with minor edits. My previous s=
+ubmission ended up inside an existing thread, apologies.]</div><div><br></d=
+iv><div>Hi list,</div><div><br></div><div>I&#39;d like to explore whether i=
+t is feasible to implement new scripting capabilities in Bitcoin that enabl=
+e limiting the output amount of a transaction based on the total value of i=
+ts inputs. In other words, to implement the ability to limit the maximum am=
+ount that can be sent from an address.</div><div><br></div><div>Two use cas=
+es come to mind:</div><div><br></div><div>UC1: enable a user to add additio=
+nal protection their funds by rate-limiting the amount that they are allowe=
+d to send during a certain period (measured in blocks). A typical use case =
+might be a user that intends to hodl their bitcoin, but still wishes to occ=
+asionally send small amounts. Rate-limiting avoids an attacker from sweepin=
+g all the users&#39; funds in a single transaction, allowing the user to be=
+come aware of the theft and intervene to prevent further thefts.</div><div>=
+<br></div><div>UC2: exchanges may wish to rate-limit addresses containing l=
+arge amounts of bitcoin, adding warm- or hot-wallet functionality to a cold=
+-storage address. This would enable an exchange to drastically reduce the n=
+umber of times a cold wallet must be accessed with private keys that give a=
+ccess to the full amount.</div><div><br></div><div>In a typical setup, I&#3=
+9;d envision using multisig such that the user has two sets of private keys=
+ to their encumbered address (with a &quot;set&quot; of keys meaning &quot;=
+one or more&quot; keys). One set of private keys allows only for sending wi=
+th rate-limiting restrictions in place, and a second set of private keys al=
+lowing for sending any amount without rate-limiting, effectively overriding=
+ such restriction.</div><div><br></div><div>The parameters that define in w=
+hat way an output is rate-limited might be defined as follows:</div><div><b=
+r></div><div>Param 1: a block height &quot;h0&quot; indicating the first bl=
+ock height of an epoch;</div><div><div>Param 2: a block height &quot;h1&quo=
+t; indicating the last block height of an epoch;</div><div>Param 3: an amou=
+nt &quot;a&quot; in satoshi indicating the maximum amount that is allowed t=
+o be sent in any epoch;<br></div><div>Param 4: an amount &quot;a_remaining&=
+quot; (in satoshi) indicating the maximum amount that is allowed to be sent=
+ within the current epoch.</div></div><div><br></div><div>For example, cons=
+ider an input containing 100m sats (1 BTC) which has been rate-limited with=
+ parameters (h0, h1, a, a_remaining) of (800000, 800143, 500k, 500k). These=
+ parameters define that the address is rate-limited to sending a maximum of=
+ 500k sats in the current epoch that starts at block height 800000 and ends=
+ at height 800143 (or about one day ignoring block time variance) and that =
+the full amount of 500k is still sendable. These rate-limiting parameters e=
+nsure that it takes at minimum 100m / 500k =3D 200 transactions and 200 x 1=
+44 blocks or about 200 days to spend the full 100m sats. As noted earlier, =
+in a typical setup a user should retain the option to transact the entire a=
+mount using a second (set of) private key(s).</div><div><br></div><div>For =
+rate-limiting to work, any change output created by a transaction from a ra=
+te-limited address must itself be rate-limited as well. For instance, expan=
+ding on the above example, assume that the user spends 200k sats from a rat=
+e-limited address a1 containing 100m sats:</div><div><br></div><div>Start s=
+ituation:</div><div>At block height 800000: rate-limited address a1 is crea=
+ted;</div><div>Value of a1: 100.0m sats;</div><div>Rate limiting params of =
+a1: h0=3D800000, h1=3D800143, a=3D500k, a_remaining=3D500k;</div><div><br><=
+/div><div>Transaction t1:</div><div>Included at block height 800100;</div><=
+div>Spend: 200k + fee;</div><div>Rate limiting params: h0=3D800000, h1=3D80=
+0143, a=3D500k, a_remaining=3D300k.</div><div><br></div><div>Result:</div><=
+div>Value at destination address: 200k sats;</div><div>Rate limiting params=
+ at destination address: none;</div><div>Value at change address a2: 99.8m =
+sats;</div><div>Rate limiting params at change address a2: h0=3D800000, h1=
+=3D800143, a=3D500k, a_remaining=3D300k.</div><div><br></div><div>In order =
+to properly enforce rate limiting, the change address must be rate-limited =
+such that the original rate limit of 500k sats per 144 blocks cannot be exc=
+eeded. In this example, the change address a2 were given the same rate limi=
+ting parameters as the transaction that served as its input. As a result, f=
+rom block 800100 up until and including block 800143, a maximum amount of 3=
+00k sats is allowed to be spent from the change address.</div><div><br></di=
+v><div>Example continued:</div><div>a2: 99.8 sats at height=C2=A0800100;</d=
+iv><div>Rate-limit params: h0=3D800000, h1=3D800143, a=3D500k, a_remaining=
+=3D300k;</div><div><br></div><div>Transaction t2:</div><div>Included at blo=
+ck height 800200</div><div>Spend: 400k=C2=A0+ fees.</div><div>Rate-limiting=
+ params: h0=3D800144, h1=3D800287, a=3D500k, a_remaining=3D100k.<br></div><=
+div><br></div><div><div>Result:</div><div>Value at destination address: 400=
+k sats;</div><div>Rate limiting params at destination address: none;</div><=
+div>Value at change address a3: 99.4m sats;</div><div>Rate limiting params =
+at change address a3: h0=3D800144, h1=3D800287, a=3D500k, a_remaining=3D100=
+k.</div><div><br></div><div>Transaction t2 is allowed because it falls with=
+in the next epoch (running from 800144 to 800287) so a spend of 400k does n=
+ot violate the constraint of 500k per epoch.</div><div><br></div><div>As co=
+uld be seen, the rate limiting parameters are part of the transaction and c=
+hosen by the user (or their wallet). This means that the parameters must be=
+ validated to ensure that they do not violate the intended constraints.</di=
+v><div><br></div><div>For instance, this transaction should not be allowed:=
+</div><div><div>a2: 99.8 sats at height=C2=A0800100;</div><div>Rate-limit p=
+arams of a2: h0=3D800000, h1=3D800143, a=3D500k, a_remaining=3D300k;</div><=
+div><br></div><div>Transaction t2a:</div><div>Included at block height 8002=
+00;</div><div>Spend: 400k=C2=A0+ fees;</div><div><div>Rate-limit params: h0=
+=3D800124, h1=3D800267, a=3D500k, a_remaining=3D100k.</div><div><br></div><=
+/div><div>This transaction t2a attempts to shift the epoch forward by 20 bl=
+ocks such that it starts at 800124 instead of 800144. Shifting the epoch fo=
+rward like this must not be allowed because it enables spending more that t=
+he rate limit allows, which is 500k in any epoch of 144 blocks. It would en=
+able overspending:</div></div><div><br></div><div>t1: spend 200k at 800100 =
+(epoch 1: total: 200k);</div><div>t2a: spend 400k at 800200 (epoch 2: total=
+: 400k);</div><div>t3a: spend 100k at 800201 (epoch 2: total: 500k);</div><=
+div>t4a: spend 500k at 800268 (epoch 2: total: 1000k, overspending for epoc=
+h 2).</div><div><br></div><div>Specifying the rate-limiting parameters expl=
+icitly at every transaction allows the user to tighten the spending limit b=
+y setting tighter limits or for instance by setting a_remainder to 0 if the=
+y wish to enforce not spending more during an epoch. A second advantage of =
+explicitly specifying the four rate-limiting parameters with each transacti=
+on is that it allows the system to fully validate the transaction without h=
+aving to consider any previous transactions within an epoch.</div><div><br>=
+</div><div>I will stop here because I would like to gauge interest in this =
+idea first before continuing work on other aspects. Two main pieces of work=
+ jump to mind:</div><div><br></div><div>Define all validations;</div><div>D=
+escribe aggregate behaviour of multiple (rate-limited) inputs, proof that t=
+wo rate-limited addresses cannot spend more than the sum of their individua=
+l limits.</div><font color=3D"#888888"><div><br></div><div>Zac</div></font>=
+</div></div>
+
+--00000000000041002705c87af934--
+