关于Schnorr签名你需要知道的事

微信截图_20190516093616.png

 

在今天,BCH将进行硬分叉升级。这次升级的主要内容是Schnorr签名算法和隔离见证复原,Schnorr签名是一项以简单性而闻名的数字签名方案,也是在这升级中最受期待的功能,而隔离见证复原则是一项修复性技术,用来找回被错发到隔离见证地址的BCH。这次升级的两项内容都是成熟功能,外界公认的无争议技术功能,被视为纯粹的利好升级。

Schnorr签名和ECDSA签名

Schnorr签名是一个使BCH区块链实现技术领先的强大功能,因为Schnorr签名方案直接促进了BCH的隐私性和交易能力。Schnorr签名算法是由著名的密码学家Claus Schnorr发明,这项功能长期以来受到了BCH开发者的重视,长时间以来开发者都一直渴望实现Schnorr签名。现阶段,BCH使用的是ECDSA(椭圆曲线数字签名算法)来进行交易签名,在5月15日之后,BCH将同时提供过去一直使用的ECDSA交易签名和新属性Schnorr签名,由用户来自由选择使用。

在BCH交易中,数字签名除了用于验证持有者身份,还用于加密数据,只有特定的接收者才能解密信息。这些加密组合证明了BCH用户的所有权,这构成了用户使用比特币现金的权利。BCH是UTXO模型,所以很多交易都包含多个输入,而这些输入都需要有各自的签名。ECDSA能够使双方能够安全地传达BCH公钥和私钥,而将添加到比特币现金链的Schnorr签名将提供与ECDSA相同的属性,但效率更高,功能更强大。

隐藏支付通道、原子交换和聚合签名

随着本次升级,开发人员Mark Lundeberg详细说明了Schnorr签名将是ECDSA签名的可选替代品。Lundeberg解释说,用户不必生成新地址就可以开始使用Schnorr签名。对于Schnorr,开发人员表示,由于签名是64字节的数据,与通常的70字节相比,交易可以减少4%的字节,该功能基本上提高了每笔比特币现金交易所需的签名数据的有效性。周三升级后,Schnorr签名将给BCH带来隐藏普通支付渠道的能力。

原子交换又被成为跨链原子交换,是一种加密的智能合约,可以在点对点的基础上实现两种加密货币的交换。但原子交换长期以来的隐私性表现并不那么出色,通过Schnorr签名原子交换也可以隐藏支付渠道,这对原子交换的落地应用提供了极大的帮助。在将来开发人员可以添加更复杂的概念,比如聚合签名。

Lundeberg指出:“从用户体验的角度来看,比特币现金用户和商户只是通过Bitcoin.com钱包等应用程序来作为钱包使用比特币现金,可能无法一眼就看到任何不同。”“但是,如果您在5月15日升级之后任意查看一个新交易,您可能会注意到它的大小比以前小了大约4%。”

Lundeberg还表示了对聚合签名的看法,聚合签名的优异性是在一笔交易中所有涉及的输入只需要一个合并签名就可以完成,而用一个签名代替多个签名的好处是显而易见。这导致数据量大幅减少,预计通过Schnorr签名将使区块链存储和带宽减少至少25%,使BCH网络更快,更加高效。

Lundeberg最后还提到了Schnorr对于隐私性的提升。事实上在此之前很多用户就会故意使用多个签名来发送交易来提高隐私,而Schnorr签名会使所有用户的签名看起来和任何其他签名一样,这种结构导致了交易隐私性的大幅提升。以门罗币为例,环签名同样是此类型的结构和功效,而门罗币是以隐私性著称的数字货币。Schnorr提供的属性以及BCH开发人员和基础设施提供商(如钱包)添加的一些延展程序将进一步增强隐私和可扩展性。

对抗垃圾交易攻击

在过去比特币中曾出现一种垃圾交易攻击,攻击者希望通过尽可能多的占用比特币的交易空间来使比特币拥堵,他们的手段之一就是通过频繁地从多个来源发送交易使这个交易中包括数十个签名,而很明显的是,这些签名占据了很多的空间。事实上目前来看BCH并不惧怕这种攻击,因为本身的区块容量足够大,攻击者如果要将BCH区块拥堵需要付出很高的代价,但这仍然是ECDSA签名留下的隐患。

根据上文的介绍,我们已经了解了Schnorr的原理和结构,很显然可以规避这类的垃圾交易攻击。如果我们每一笔交易只有一个签名,那么区块就能容纳更多交易,垃圾交易制造者要想制造攻击就必须发送更多交易,与更多人进行竞争,因此攻击成本就会相对更高。签名所占空间通常是一笔交易最大的一部分,所以攻击者将不具优势。

如果攻击者不选择使用Schnorr签名并继续使用旧的签名,那么其他使用Schnorr签名的用户发送的交易会更小,支付的手续费也就更少。这就会使攻击成本比以往更高。

结束

就在不久之前,BTC的核心开发者同样宣布未来将Schnorr签名应用在BTC上,但毫无疑问,BCH已经用上了,而BTC还在规划当中,BCH再一次走在了BTC的前列。

现在,BCH开发方面有很多创新,例如Simple Ledger Protocol,Badger Wallet,Cash Accounts,Cashshuffle,Bchd客户端及其隐私增强钱包Neutrino。随着Schnorr签名的到来,BCH将能够巩固其基础,并继续为大众提供可互换的,点对点的电子现金。

转载于:https://my.oschina.net/u/3971972/blog/3050198

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用C语言实现的Schnorr签名协议的代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <openssl/sha.h> #include <openssl/ec.h> #include <openssl/ecdsa.h> #include <openssl/obj_mac.h> #define MSG_LEN 16 int main() { // 生成椭圆曲线参数 EC_GROUP *curve = EC_GROUP_new_by_curve_name(NID_secp256k1); EC_POINT *G = EC_GROUP_get0_generator(curve); BIGNUM *n = BN_new(); EC_GROUP_get_order(curve, n); // 生成密钥对 EC_KEY *key = EC_KEY_new(); EC_KEY_set_group(key, curve); EC_KEY_generate_key(key); const EC_POINT *pk = EC_KEY_get0_public_key(key); const BIGNUM *sk = EC_KEY_get0_private_key(key); // 签名 uint8_t msg[MSG_LEN] = "Hello, world!"; uint8_t digest[SHA256_DIGEST_LENGTH]; SHA256(msg, MSG_LEN, digest); ECDSA_SIG *sig = ECDSA_do_sign(digest, SHA256_DIGEST_LENGTH, key); const BIGNUM *r = sig->r; const BIGNUM *s = sig->s; // 验证 int ret = ECDSA_do_verify(digest, SHA256_DIGEST_LENGTH, sig, key); printf("Verification: %s\n", ret == 1 ? "PASS" : "FAIL"); // 释放资源 ECDSA_SIG_free(sig); EC_KEY_free(key); BN_free(n); EC_GROUP_free(curve); return 0; } ``` 以上代码使用了OpenSSL库来生成椭圆曲线参数、密钥对,以及实现签名和验证操作。在测试部分,我们对一条消息进行签名和验证,如果验证通过,则表示Schnorr签名协议在椭圆曲线上的方案可以正确地工作。 需要注意的是,上述代码中的`MSG_LEN`表示消息长度,可以根据实际需要进行修改。另外,为了简化代码,省略了错误处理等细节,实际使用时需要进行适当的补充。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值