solidity橢圓曲線驗(yàn)證蝉揍,但是會(huì)消耗很長時(shí)間
pragma solidity ^0.4.0;
contract Decode{
//公匙:0x60320b8a71bc314404ef7d194ad8cac0bee1e331
//sha3(msg): 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 (web3.sha3("abc");)
//簽名后的數(shù)據(jù):0xf4128988cbe7df8315440adde412a8955f7f5ff9a5468a791433727f82717a6753bd71882079522207060b681fbd3f5623ee7ed66e33fc8e581f442acbcf6ab800
event mtydss(bytes32 result);
event mtydss1(bytes result);
//驗(yàn)簽數(shù)據(jù)入口函數(shù)
function decode() returns (address){
bytes memory signedString =hex"378153cf0e692e29e115931afb1afbdaf1c63a3dc74d9599fa0a49da5c4881b315194682794e83dd2d0ebab82286e8f3b6d8dab88e7c0ac81e9d92eafc766c2827";
bytes32 r = bytesToBytes32(slice(signedString, 0, 32));
bytes32 s = bytesToBytes32(slice(signedString, 32, 32));
byte v = slice(signedString, 64, 1)[0];
return ecrecoverDecode(r, s, v);
}
//將原始數(shù)據(jù)按段切割出來指定長度
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];
}
mtydss1 (b);
return b;
}
//使用ecrecover恢復(fù)公匙
function ecrecoverDecode(bytes32 r, bytes32 s, byte v1) returns (address addr){
uint8 v = uint8(v1) - 27;
addr = ecrecover(hex"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45", v, r, s);
}
//bytes轉(zhuǎn)換為bytes32
function bytesToBytes32(bytes memory source) returns (bytes32 result) {
assembly {
result := mload(add(source, 32))
}
mtydss(result);
}
}
java
pragma solidity ^0.4.0;
contract Decode{
//公匙:0x60320b8a71bc314404ef7d194ad8cac0bee1e331
//sha3(msg): 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 (web3.sha3("abc");)
//簽名后的數(shù)據(jù):0xf4128988cbe7df8315440adde412a8955f7f5ff9a5468a791433727f82717a6753bd71882079522207060b681fbd3f5623ee7ed66e33fc8e581f442acbcf6ab800
event mtydss(bytes32 result);
event mtydss1(bytes result);
//驗(yàn)簽數(shù)據(jù)入口函數(shù)
function decode() returns (address){
bytes memory signedString =hex"378153cf0e692e29e115931afb1afbdaf1c63a3dc74d9599fa0a49da5c4881b315194682794e83dd2d0ebab82286e8f3b6d8dab88e7c0ac81e9d92eafc766c2827";
bytes32 r = bytesToBytes32(slice(signedString, 0, 32));
bytes32 s = bytesToBytes32(slice(signedString, 32, 32));
byte v = slice(signedString, 64, 1)[0];
return ecrecoverDecode(r, s, v);
}
//將原始數(shù)據(jù)按段切割出來指定長度
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];
}
mtydss1 (b);
return b;
}
//使用ecrecover恢復(fù)公匙
function ecrecoverDecode(bytes32 r, bytes32 s, byte v1) returns (address addr){
uint8 v = uint8(v1) - 27;
addr = ecrecover(hex"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45", v, r, s);
}
//bytes轉(zhuǎn)換為bytes32
function bytesToBytes32(bytes memory source) returns (bytes32 result) {
assembly {
result := mload(add(source, 32))
}
mtydss(result);
}
}