Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. pragma solidity >=0.4.22 <0.6.0;
  2.  
  3. contract Decode{
  4. //公匙:0x60320b8a71bc314404ef7d194ad8cac0bee1e331
  5. //sha3(msg): 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 (web3.sha3("abc");)
  6. //签名后的数据:0xf4128988cbe7df8315440adde412a8955f7f5ff9a5468a791433727f82717a6753bd71882079522207060b681fbd3f5623ee7ed66e33fc8e581f442acbcf6ab800
  7.  
  8. //验签数据入口函数
  9. function decode() public pure returns (address){
  10. bytes memory signedString =hex"f4128988cbe7df8315440adde412a8955f7f5ff9a5468a791433727f82717a6753bd71882079522207060b681fbd3f5623ee7ed66e33fc8e581f442acbcf6ab800";
  11.  
  12. bytes32 r = bytesToBytes32(slice(signedString, 0, 32));
  13. bytes32 s = bytesToBytes32(slice(signedString, 32, 32));
  14. byte v = slice(signedString, 64, 1)[0];
  15. return ecrecoverDecode(r, s, v);
  16. }
  17.  
  18. //将原始数据按段切割出来指定长度
  19. function slice(bytes memory data, uint start, uint len)internal pure returns (bytes memory){
  20. bytes memory b = new bytes(len);
  21.  
  22. for(uint i = 0; i < len; i++){
  23. b[i] = data[i + start];
  24. }
  25.  
  26. return b;
  27. }
  28.  
  29. //使用ecrecover恢复公匙
  30. function ecrecoverDecode(bytes32 r, bytes32 s, byte v1) internal pure returns (address addr){
  31. uint8 v = uint8(v1) + 27;
  32. addr = ecrecover(hex"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45", v, r, s);
  33. }
  34.  
  35. //bytes转换为bytes32
  36. function bytesToBytes32(bytes memory source)internal pure returns (bytes32 result) {
  37. assembly {
  38. result := mload(add(source, 32))
  39. }
  40. }
  41. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement