Hi Zac,I haven't heard of any proposal for limiting the amount that can be sent from an address. I assume you mean limiting the amount that can be sent in a period of time - eg something that would encode that for address A, only X bitcoin can be sent from the address in a given day/week/etc, is that right? That would actually be a somewhat difficult thing to do in the output-based system Bitcoin uses, and would be easier in an account based system like Ethereum. The problem is that each output is separate, and there's no concept in bitcoin of encumbering outputs together.What you could do is design a system where coins would be combined in a single output, and then encumber that output with a script that allows a limited amount of coin be sent to a destination address and requires all other bitcoins be returned to sender in a new change output that is also timelocked. That way, the new change output can't be used again until the timelock expires (eg a week). However, to ensure this wallet works properly, any deposit into the wallet would have to also spend the wallet's single output, so as to create a new single output at that address. So 3rd parties wouldn't be able to arbitrarily send money in (or rather, they could, but each output would have its own separate spending limit).> such kind of restriction would be extremely effective in thwarting the most damaging type of theft being the one where all funds are swept in a single transactionIt would. However a normal wallet vault basically already has this property - a thief can't simply sweep funds instantly, but instead the victim will see an initiated transaction and will be able to reverse it within a delay time-window. I don't think adding a spending limit would add meaningful security to a delayed-send wallet vault like that. But it could be used to increase the security of a wallet vault that can be instantly spent from - ie if the attacker successfully steals funds, then the victim has time to go gather their additional keys and move the remaining (unstolen) funds into a new wallet.OP_CD could potentially be augmented to allow specifying limit amounts for each destination, which would allow you to create a wallet like this. It would be a bit of an awkward wallet to use tho, since you couldn't receive directly into it from a 3rd party and you also couldn't keep separate outputs (which is bad for privacy).An alternate way of doing this that you don't need any new opcodes for would be to have a 3rd party service that signs multisig transactions from a wallet only up to a limit. The end-user could have additional keys such that the 3rd party can't prevent them from accessing that (if they turn uncooperative), and the 3rd party would only have a single key so they can't steal funds, but the user would sign a transaction with one key, and the 3rd party with another as long as the spending limit hasn't been reached. This wouldn't have much counterparty risk, but would be a less awkward wallet than what I described above - meaning anyone could send funds into the wallet without defeating the spending limit, and privacy could be kept intact (minus the fact that the 3rd party would know what your outputs are).BTOn Tue, Jul 27, 2021 at 4:18 AM Zac Greenwood <zachgrw@gmail.com> wrote:Hi Billy,On the topic of wallet vaults, are there any plans to implement a way to limit the maximum amount to be sent from an address?An example of such limit might be: the maximum amount allowed to send is max(s, p) where s is a number of satoshi and p a percentage of the total available (sendable) amount.A minimum value may be imposed on the percentage to ensure that the address can be emptied within a reasonable number of transactions. The second parameter s allows a minimum permitted amount. (This is necessary because with only the percentage parameter the minimum permitted amount converges to zero, making it impossible to empty the address).There may be other ways too. In my view, such kind of restriction would be extremely effective in thwarting the most damaging type of theft being the one where all funds are swept in a single transaction.ZacOn Tue, 27 Jul 2021 at 03:26, Billy Tetrud via bitcoin-dev <bitcoin-dev@lists.linuxfoundation.org> wrote:Hey James,In the examples you mentioned, what I was exploring was a mechanism of attack by which the attacker could steal user A's key and use that key to send a transaction with the maximum possible fee. User B would still receive some funds (probably), but if the fee could be large, the attacker would either do a lot of damage to user B (griefing) or could make an agreement with a miner to give back some of the large fee (theft).But as for use cases, the proposal mentions a number of use cases and most overlap with the use cases of op_ctv (Jeremy Rubin's website for op_ctv has a lot of good details, most of which are also relevant to op_cd). The use case I'm most interested in is wallet vaults. This opcode can be used to create a wallet vault where the user only needs to use, for example, 1 key to spend funds, but the attacker must steal 2 or more keys to spend funds. The benefits of a 2 key wallet vault like this vs a normal 2-of-2 multisig wallet are that not only does an attacker have to steal both keys (same level of security), but also the user can lose one key and still recover their funds (better redundancy) and also that generally the user doesn't need to access their second key - so that can remain in a much more secure location (which would also probably make that key harder to steal). The only time the second key only comes into play if one key is stolen and the attacker attempts to send a transaction. At that point, the user would go find and use his second key (along with the first) to send a revoke transaction to prevent the attacker from stealing their funds. This is somewhat akin to a lightning watchtower scenario, where your wallet would watch the chain and alert you about an unexpected transaction, at which point you'd manually do a revoke (vs a watchtower's automated response). You might be interested in taking a look at this wallet vault design that uses OP_CD or even my full vision of the wallet vault I want to be able to create.With a covenant opcode like this, its possible to create very usable and accessible but highly secure wallets that can allow normal people to hold self custody of their keys without fear of loss or theft and without the hassle of a lot of safe deposit boxes (or other secure seed storage locations).Cheers,BT_______________________________________________On Mon, Jul 26, 2021 at 2:08 PM James MacWhyte <macwhyte@gmail.com> wrote:Hi Billy!See above, but to break down that situation a bit further, these are the two situations I can think of:
- The opcode limits user/group A to send the output to user/group B
- The opcode limits user A to send from one address they own to another address they own.
I'm trying to think of a good use case for this type of opcode. In these examples, an attacker who compromises the key for user A can't steal the money because it can only be sent to user B. So if the attacker wants to steal the funds, they would need to compromise the keys of both user A and user B.But how is that any better than a 2-of-2 multisig? Isn't the end result exactly the same?James
bitcoin-dev mailing list
bitcoin-dev@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev