LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 新闻观点 > TRON开发者指南|第五十三期:使用波场TRON智能合约校验椭圆曲线加密数字签名

TRON开发者指南|第五十三期:使用波场TRON智能合约校验椭圆曲线加密数字签名

2020-03-05 波场TRON 来源:火星财经

概述

椭圆曲线数字签名算法(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

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...