<ul>
<li><p>Advantages of <code>OP_CHECKMULTISIG</code> over Shamir Secret Sharing for <em>k</em>-of-<em>n</em>:</p>
<ul>
<li>There is no need to reconstruct the actual secret key on one specific machine. With SSS, you're inherently relying on that one machine being able to verify that what it's going to sign is what is intended - otherwise you may e.g. be sending your entire balance instead of just the payment you wanted to make. Also, if that key or (in case BIP32 public derivation is used) any related key is ever reused, that machine being compromised would in fact expose your entire wallet, including future funds. Given that the end goal is reducing the need to rely on the security of a single device, this is not ideal.</li>
<li>Accountability: with an SSS-based signature, the on-chain signature cannot tell you which signer(s) actually signed for spending, while <code>OP_CHECKMULTISIG</code> does. If you want the ability to go after rogue signers.</li>
</ul>
</li>
<li><p>Advantages of SSS over <code>OP_CHECKMULTISIG</code>:</p>
<ul>
<li>Cheaper on-chain.</li>
<li>Better policy privacy (you're not revealing on-chain that you were in fact using a multisig policy).</li>
</ul>
</li>
</ul>
<p>Now, with the hopefully upcoming activation of BIP <a href="https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki" rel="noreferrer">341</a>-<a href="https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki" rel="noreferrer">342</a> (Taproot) which includes support for BIP <a href="https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki" rel="noreferrer">340</a> Schnorr signatures, there will be more options (disclaimed: I'm a co-author of these proposals):</p>
<ul>
<li>Native threshold signatures: with Schnorr signatures it is possible to perform something that's effectively equivalent to performing SSS on the <em>public keys</em>, and at signing time on the <em>signatures</em>, and end up with a valid combined signature for the combined public key. This gets you some of the advantages of both, and some additional disadvantages:
<ul>
<li>No single machine where the private key needs to be combined on (only signatures ever get combined, which are only valid for the specific message the individual signers signed).</li>
<li>Lack of accountability like SSS.</li>
<li>Same on-chain cost as SSS.</li>
<li>Same on-chain policy privacy as SSS.</li>
<li>More complicated protocol that needs multiple interaction rounds between the signers. Also lots of edge cases to take into account to make this secure in practice. For recent work, see <a href="https://eprint.iacr.org/2020/852" rel="noreferrer">FROST</a>. If all you need is <em>n</em>-of-<em>n</em> (rather than <em>k</em>-of-<em>n</em>), it is simpler and less involved; see e.g. <a href="https://eprint.iacr.org/2020/1261" rel="noreferrer">MuSig2</a>.</li>
</ul>
</li>
</ul>
<p>That's not the only option, though. More alternatives are listed in <a href="https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki#cite_note-5" rel="noreferrer">BIP 342, note 5</a>. In a way, SSS and <code>OP_CHECKMULTISIG</code> are two extremes of a spectrum. For example, you can construct an output that contains a Merkle root of a tree for which every leaf is one <em>k</em>-of-<em>k</em> aggregated key. It can be spent by revealing the Merkle branch plus the aggregated signature. This is usually cheaper than <code>OP_CHECKMULTISIG</code>-like constructions that publish all keys and signatures, but not as good as the SSS-like approaches give you. On the other hand, it's simpler too.</p>

CC BY-SA 4.0
2021-01-29T20:15:36.550Z
2021-01-29T20:15:36.550Z
Pieter Wuille
<p>For security purposes, we require that each withdrawal be &quot;approved&quot; by multiple servers so that in the event a single server is compromised the attacker won't be able to siphon funds from the entire wallet. The typical approach to execute this concept is a <code>MultiSig</code> address where a transaction is only approved after it is signed by multiple entities.</p>
<p>However, the fees for a 2/3 <code>MultiSig</code> transaction are nearly <a href="https://bitcoin.stackexchange.com/q/101978/78451">twice as high</a> as fees for a regular transaction. If we wanted 3/4 (or higher) MultiSig the fees would be even costlier. This got me thinking of a way to take advantage of the security benefits offered by MultiSig transactions without suffering from excessive fee consumption in the process.</p>
<p>The immediate solution that comes to mind is <a href="https://bitcoin.stackexchange.com/a/44431/78451">sharding</a>. In short, instead of using MultiSig we can safely break up the PK using <a href="https://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing" rel="nofollow noreferrer">Shamir's Secret Sharing Scheme</a> with unlimited schemes (such as 4-of-7 or 3-of-4 etc) and store the shards on separate servers thereby requiring multiple servers to &quot;sign&quot; a withdrawal request.</p>
<p>Does MultiSig provide any (security) benefit over sharding? Is sharding a viable alternative to MultiSig?</p>
<p><strong>Update:</strong></p>
<p>Perhaps the only problem with this proposal is that each server cannot independently &quot;authorize&quot; the transaction using its &quot;shard&quot;. At some point, all shards would need to be known to &quot;reassemble&quot; the PK so the attacker could still use this as the &quot;weakest link&quot; to steal the PK? Is this correct?</p>
<p>Thanks</p>

<transactions><security><private-key><multi-signature>
Is Sharding a Good Alternative to MultiSig?
S.O.S
# Is Sharding a Good Alternative to MultiSig?

(Asked by: username_0 on 2021-01-29)

For security purposes, we require that each withdrawal be "approved" by multiple servers so that in the event a single server is compromised the attacker won't be able to siphon funds from the entire wallet. The typical approach to execute this concept is a `MultiSig` address where a transaction is only approved after it is signed by multiple entities.

However, the fees for a 2/3 `MultiSig` transaction are nearly [twice as high](https://bitcoin.stackexchange.com/q/101978/78451) as fees for a regular transaction. If we wanted 3/4 (or higher) MultiSig the fees would be even costlier. This got me thinking of a way to take advantage of the security benefits offered by MultiSig transactions without suffering from excessive fee consumption in the process.

The immediate solution that comes to mind is [sharding](https://bitcoin.stackexchange.com/a/44431/78451). In short, instead of using MultiSig we can safely break up the PK using [Shamir's Secret Sharing Scheme](https://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing) with unlimited schemes (such as 4-of-7 or 3-of-4 etc) and store the shards on separate servers thereby requiring multiple servers to "sign" a withdrawal request.

Does MultiSig provide any (security) benefit over sharding? Is sharding a viable alternative to MultiSig?

**Update:**

Perhaps the only problem with this proposal is that each server cannot independently "authorize" the transaction using its "shard". At some point, all shards would need to be known to "reassemble" the PK so the attacker could still use this as the "weakest link" to steal the PK? Is this correct?

Thanks

**Tags:** transactions, security, private-key, multi-signature


---

## 1 answers

### Answer by username_1 on 2021-01-29. Score: 8 | Accepted answer

* Advantages of `OP_CHECKMULTISIG` over Shamir Secret Sharing for *k*-of-*n*:

  + There is no need to reconstruct the actual secret key on one specific machine. With SSS, you're inherently relying on that one machine being able to verify that what it's going to sign is what is intended - otherwise you may e.g. be sending your entire balance instead of just the payment you wanted to make. Also, if that key or (in case BIP32 public derivation is used) any related key is ever reused, that machine being compromised would in fact expose your entire wallet, including future funds. Given that the end goal is reducing the need to rely on the security of a single device, this is not ideal.
  + Accountability: with an SSS-based signature, the on-chain signature cannot tell you which signer(s) actually signed for spending, while `OP_CHECKMULTISIG` does. If you want the ability to go after rogue signers.
* Advantages of SSS over `OP_CHECKMULTISIG`:

  + Cheaper on-chain.
  + Better policy privacy (you're not revealing on-chain that you were in fact using a multisig policy).

Now, with the hopefully upcoming activation of BIP [341](https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki)-[342](https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki) (Taproot) which includes support for BIP [340](https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki) Schnorr signatures, there will be more options (disclaimed: I'm a co-author of these proposals):

* Native threshold signatures: with Schnorr signatures it is possible to perform something that's effectively equivalent to performing SSS on the *public keys*, and at signing time on the *signatures*, and end up with a valid combined signature for the combined public key. This gets you some of the advantages of both, and some additional disadvantages:
  + No single machine where the private key needs to be combined on (only signatures ever get combined, which are only valid for the specific message the individual signers signed).
  + Lack of accountability like SSS.
  + Same on-chain cost as SSS.
  + Same on-chain policy privacy as SSS.
  + More complicated protocol that needs multiple interaction rounds between the signers. Also lots of edge cases to take into account to make this secure in practice. For recent work, see [FROST](https://eprint.iacr.org/2020/852). If all you need is *n*-of-*n* (rather than *k*-of-*n*), it is simpler and less involved; see e.g. [MuSig2](https://eprint.iacr.org/2020/1261).

That's not the only option, though. More alternatives are listed in [BIP 342, note 5](https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki#cite_note-5). In a way, SSS and `OP_CHECKMULTISIG` are two extremes of a spectrum. For example, you can construct an output that contains a Merkle root of a tree for which every leaf is one *k*-of-*k* aggregated key. It can be spent by revealing the Merkle branch plus the aggregated signature. This is usually cheaper than `OP_CHECKMULTISIG`-like constructions that publish all keys and signatures, but not as good as the SSS-like approaches give you. On the other hand, it's simpler too.


---

