概述 椭圆曲线数字签名算法(ECDSA)是数字签名算法(DSA)的变例,它基于椭圆曲线密码学。在波场、比特币、以太坊等区块链中,被广泛应用于交易签名、共识验证等多个方面,是区块链技术的基石算法之一。本文在对椭圆曲线数字签名算法原理进行简单解释的同时,介绍了两种在Solidity语言中验证椭圆曲线加密数字签名的方式。其中包括了已经被广泛采用的Solidity函数ecrecover和波场0.5.9版本编译器引入的新函数batchvalidatesign。 椭圆曲线数字签名算法理论 数字签名的生成 ECDSA是ECC与DSA的结合,整个签名过程与DSA类似,ECDSA签名由一对整数(r, s)组成,使用公钥和私钥计算消息的签名的方式如下: 1.E选择一条椭圆曲线Ep(a,b),和基点G; 2.选择一组密钥,其中用随机数生成私钥k,利用基点G计算公钥K=kG; 3.产生一个随机整数r(r<n),计算点R=rG; 4.计算e = HASH(message,x,y); 5.计算s ≡ r - e * k (mod n) 6.取r和s做为签名值,如果r和s其中一个为0,重新从第3步开始执行 数字签名的校验 接受方在收到消息(message)和签名(r,s)后: 1.计算:sG+H(message)P=(x1,y1), r1 ≡ x1 mod p。 2.校验r1 ≡ r mod p。 如果校验成立,则签名校验通过。 使用ecrecover进行签名校验 ecrecover ecrecover的完整函数签名为:ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address),是由Solidity语言原生提供的一个全局函数,这个函数的作用是通过签名本身和签名的内容来返回签名者的地址。 ecrecover中需要的,r、s、v分别来自于签名的切片内容: r = signature[0:64] s = signature[64:128] v = signature[128:130] 切片函数 function slice(bytes memory data, uint start, uint len) returns (bytes){ bytes memory b = new bytes(len); for(uint i = 0; i < len; i++){ b[i] = data[i + start]; } return b; } 完整合约如下: pragma solidity ^0.4.25; contract ValidateSign{ //根据签名和签名内容返回地址 function validate(bytes32 hash, bytes signature) returns (address){ bytes memory signedString = signature; bytes32 r = convertToBytes32(slice(signedString, 0, 32)); bytes32 s = convertToBytes32(slice(signedString, 32, 32)); byte v1 = slice(signedString, 64, 1)[0]; uint8 v = uint8(v1) + 27; return ecrecover(hash, r, s, v); } //切片函数 function slice(bytes memory data, uint start, uint len) returns (bytes){ bytes memory b = new bytes(len); for(uint i = 0; i < len; i++){ b[i] = data[i + start]; } return b; } //bytes转换为bytes32 function convertToBytes32(bytes memory source) returns (bytes32 result) { assembly { result := mload(add(source, 32)) } } } 使用batchvalidatesign进行并行签名校验 batchvalidatesign函数是波场虚拟机特有函数,需要在波场的32号提案开启后正式生效,签名为:batchvalidatesign(bytes32 hash,bytes[] signatures,address[] addresses) returns(bytes32) 函数接受三个参数: bytes32 hash,需要校验的签名内容 bytes[] signatures,签名列表 address[] addresses,地址列表 函数的返回值:由于并行验证了多组签名,为了能够完整返回验证签名的结果,返回值为bytes32类型。如返回值10100000000000000000000000000000代表第一组和第三组签名校验通过。 需要特别注意的是,必须采用波场Solidity编译器的0.5.9及以上版本。由于函数采用了数组作为参数,所以必须开启ABIEncoderV2。 完整合约: pragma experimental ABIEncoderV2; contract BatchValidate { function validatesign(bytes32 hash, bytes[] memory signatures, address[] memory addresses) public returns(bytes32){ return batchvalidatesign(hash, signatures, addresses); } } 结论 在传统Solidity中校验签名需要很大的开销,开发者需要进行类型转换和自行编写切片函数。另外由于ecrecover只能返回地址,还需要进一步比较还原出的地址和签名者的地址是否相符,而波场Solidity0.5.9版本引入的batchvalidatesign使得在智能合约中进行签名校验更加具有易用性,并行验签的引入也有利于探索更多智能合约的应用场景 参考 https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm https://github.com/tronprotocol/tips/blob/master/tip-43.md 关于我们 我们是波场公链核心开发者团队,致力于依托区块链技术打造下一代分布式计算平台,如果您想持续了解我们并获取技术支持,请关注我们的公众号:波场核心开发者团队 关于波场公链 波场公链代码仓库: https://github.com/tronprotocol/java-tron 波场开发者电报群: https://t.me/troncoredevscommunity 本文来源:波场TRON —- 编译者/作者:波场TRON 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
TRON开发者指南|第五十三期:使用波场TRON智能合约校验椭圆曲线加密数字签名
2020-03-05 波场TRON 来源:火星财经
- 上一篇:莱特获利出局,策略在线验证
- 下一篇:BTC 0305 威科夫分析
LOADING...
相关阅读:
- 【Substrate开发教程】16 - Substrate声明存储宏decl_storage!的使用2020-10-30
- 中链云丨超全面的IPFS挖矿教程,Filecoin避坑指南2020-10-28
- 〔YAS你问我答,第两百四十一篇〕PLAY验证人搞起来,培林大佬教程出来2020-10-28
- 【Substrate开发教程】13 - 模块(Pallets)2020-10-27
- key提现更便捷体验:MYKEY上币买卖PK比特儿gate.io上币买卖,附教程2020-10-15