Solidity基础语法代码2

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*

    哈希算法具有两个特性:

        1. 输入值相同,输出值一定相同

        2. 不管输入值有多大,输出值是定长的,并且哈希算法是不可逆向运算的

    通常把哈希算法用在签名运算,或者是获取一个特定的id

    执行签名与验证签名操作步骤:

    1. getMessageHash 输入"secret message" 得到: 0x9c97d796ed69b7e69790ae723f51163056db3d55a7a6a82065780460162d4812

    2. 浏览器按f12打开控制台,输入ethereum.enable() 前提要装小狐狸钱包,这个函数会获取一个地址: "0xEc80445eb3363b49c93a902662bD11e3C8D197E8"

    3. 在浏览器定义变量:

       account = "0xEc80445eb3363b49c93a902662bD11e3C8D197E8"

       hash = "0x9c97d796ed69b7e69790ae723f51163056db3d55a7a6a82065780460162d4812"

    4. 执行函数得到签名

       ethereum.request({method: "personal_sign", params: [account, hash]})

       在小狐狸钱包点确认签名,得到签名数据: 0x686a1e541227e4edce4270a2508b486372eaa7eb63171605743b392d35f96ae721a4f58cc763497f7eb24b108e5fc9f6df1a0679c973d897c2d9d9ec0611cf0f1b

    5. 将getMessageHash得到的哈希值放在getEthSignedMessageHash再次签名,得到: 0x95a786464acc06fafc0d46036515722ec35acb840ecc291f251e086ebfeb9099

    6. 恢复签名进行验证在recover输入,参数1:步骤5哈希值 参数3:步骤4哈希值 点击call得到地址: 0xEc80445eb3363b49c93a902662bD11e3C8D197E8 该地址与步骤2地址相同,代表恢复完成了

    7. 再使用验证方法完整的验证一遍,在verfiy输入,参数1:步骤2地址 参数2:消息原文"secret message" 参数3:签名之后的数据即步骤4哈希值,结果返回true 签名验证通过

*/

contract HashFunc {

    // 哈希返回值bytes32定长值

    function hash(string memory text, uint num, address addr) external pure returns (bytes32) {

        // 使用keccak256计算哈希,要先通过abi打包

        return keccak256(abi.encodePacked(text, num, addr));

    }

    // 使用abi.encode方式打包 会将结果哈希值补0

    function encode(string memory text1, string memory text2) external pure returns (bytes memory) {

        return abi.encode(text1, text2);

    }

    // 使用abi.encodePacded方式打包 不会将结果哈希值补0 不同的参数会产生相同的结果

    // "AAAA","BBB" 与 "AAA","ABBB" 结果都是 0x41414141424242

    function encodePacded(string memory text1, string memory text2) external pure returns (bytes memory) {

        return abi.encodePacked(text1, text2);

    }

    // 哈希碰撞实验,输入不同的参数来得到相同的哈希值

    // "AAAA","BBB" 与 "AAA","ABBB" 结果都是 0x11db58448f2a53848bef361744f19e6fdabef68b8267b1ff669de1b4c42da0da

    // 避免这种错误有两种解决方案:1. 使用encode打包 2. 在两个字符串之间添加一个数字类型:"AAAA",123,"BBB" 与 "AAA",123,"ABBB"

    function collision(string memory text1, string memory text2) external pure returns (bytes32) {

        return keccak256(abi.encodePacked(text1, text2));

    }

}

/*

  通过智能合约来验证签名,验证签名分4个步骤:

    1. 将消息签名 2. 将消息进行哈希 3. 再把消息和私钥进行签名(链下完成) 4. 恢复签名

*/

contract VerfiySig {

    /*

        定义消息签名验证函数

        参数1. 签名人地址

        参数2. 消息原文

        参数3. 签名的结果

    */

    function verfiy(address _signer, string memory _message, bytes memory _sig)

        external pure returns (bool)

    {

        bytes32 messageHash = getMessageHash(_message);

        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);

        // 恢复签名地址

        return recover(ethSignedMessageHash, _sig) == _signer;

    }

    // 将消息进行哈希运算

    function getMessageHash(string memory _message) public pure returns (bytes32) {

        return keccak256(abi.encodePacked(_message));

    }

    // 将哈希值再次进行哈希运算

    function getEthSignedMessageHash(bytes32 _messageHash) public pure returns (bytes32) {

        // 这里需要进行两次哈希运行,可以增加破解难度, 一次哈希运算有破解的可能性

        return keccak256(abi.encodePacked(

            "\x19Ethereum Signed Message:\n32",

            _messageHash

        ));

    }

    // 定义恢复函数 参数1:上面函数运算结果 参数2:不定长签名结果

    function recover(bytes32 _ethSignedMessageHash, bytes memory _sig)

       public pure returns (address)

    {

        // 返回非对称加密三个值r,s,v

        (bytes32 r, bytes32 s, uint8 v) = _split(_sig);

        // 使用智能合约内部函数恢复签名

        return ecrecover(_ethSignedMessageHash, v, r, s);

    }

    // 定义分割签名函数 输入长度要65位 32+32+1 uint8是1位

    function _split(bytes memory _sig) internal pure returns (bytes32 r, bytes32 s, uint8 v) {

        require(_sig.length == 65, "invalid signature length");

        // 使用内联汇编将bytes参数分割,原理就是签名参数就是用r、s、v三个参数拼接出来的

        assembly {

            // 使用mload内存读取,读取签名变量,使用add跳过32位长度,获取到_sig32位之后的32位

            r := mload(add(_sig, 32))      

            s := mload(add(_sig, 64))

            v := byte(0, mload(add(_sig, 96)))

        }

    }

}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/162875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在网页中添加水印的实现方法

在网页设计中,为了保护内容的版权以及增加一些特殊效果,经常需要在页面上添加水印。本文将介绍一种通过Canvas和JavaScript实现在网页上添加水印的方法。 功能: 允许自定义水印内容、字体颜色可以防止用户删除水印元素、修改样式等其他手段…

基于原子搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于原子搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于原子搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于原子搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

windows安装Git【超详细图解】

目录 git安装地址 git配置 提交代码时使用的命令 git安装地址 Git for WindowsWe bring the awesome Git VCS to Windowshttps://gitforwindows.org/ 打开终端,输入git --version git配置 git config --global user.name "用户名" git config --g…

镀膜与干刻中的平均自由程是什么?

在芯片制造中,镀膜和干刻是其中的重要环节,通常要用到CVD,RIE等技术,对材料表面进行纳米级的精细操作。在这些工序中,原子,分子,离子等,会在气体或真空中进行自由运动,直…

基础模型的自然语言处理能力综述

NLP作为一个领域为基础模型开辟了道路。虽然这些模型在标准基准测试中占据主导地位,但这些模型目前获得的能力与那些将语言描述为人类交流和思维的复杂系统的能力之间存在明显的差距。针对这一点,我们强调语言变异的全部范围(例如&#xff0c…

Yolov5安装运行过程中出现的问题

Yolov5安装运行过程中出现的问题合集 安装问题pip 安装 requirements.txtcmd下如何退出python&#xff1f;升级numpy protobuf版本过高AttributeError: Can’t get attribute ‘SPPF’ on <module ‘models.common’ from 地址找不到图片NameError: name warnings is not de…

想要精通算法和SQL的成长之路 - 摩尔投票法的运用

想要精通算法和SQL的成长之路 - 摩尔投票法的运用 前言一. 多数元素1.1 摩尔投票法 二. 多数元素II2.1 分析 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 多数元素 原题链接 1.1 摩尔投票法 简单来说&#xff0c;假设数组 num 的众数是 x&#xff0c;数组长度为n。 有…

基于Java+SpringBoot+Vue3+Uniapp+TypeScript(有视频教程)前后端分离健身预约系统设计与实现

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

UE5制作场景时的小技巧和注意事项

UE5制作场景时的小技巧和注意事项 一、场景相关 1.1灯光 1.1.1构建完光照,发现场景都是黑的 可能是所有灯光是静态灯光,把skylight改为动态,如果改完之后还是黑色的,那就在构建一次,就应该没问题了 1.1.2场景中有多个动态光会造成阴影闪烁 需要将skylight变为固定 1…

C语言之for while语句详解

C语言之for while语句详解 文章目录 C语言之for while语句详解简介1 while语句1.1while语句的格式1.2 while语句的实践 2 for2.1 for语句格式2.2 for循环的实践 3 do while3.1 do while语句格式3.2 do while循环的实践 3 循环中break和continue3.1 while语句中的break和continu…

STM32与ZigBee无线通信技术在工业自动化中的应用

工业自动化是指利用电子技术、计算机技术和通信技术等手段&#xff0c;对工厂、设备和生产过程进行自动化控制和管理的过程。在工业自动化中&#xff0c;可靠的无线通信技术对于实时数据的传输和设备的协同控制至关重要。本文将介绍STM32微控制器与ZigBee无线通信技术在工业自动…

君正X2100 读取CHIP_ID

每个处理器会有一个唯一的ID&#xff0c;这个ID可用做产品序列号&#xff0c;或其它。 X21000的CHIP_ID存放于芯片内部的efuse中&#xff0c;efuse是一次性可可编程存储器&#xff0c;初始值为全0&#xff0c;只能将0改为1&#xff0c;不能将1改为0。芯片出厂前会被写入一些信…

WPF中行为与触发器的概念及用法

完全来源于十月的寒流&#xff0c;感谢大佬讲解 一、行为 (Behaviors) behaviors的简单测试 <Window x:Class"Test_05.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winf…

STL简介

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解c中的STL库 > 毒鸡汤&#xff1a;路难行&a…

22款奔驰S450L升级流星雨大灯 感受最高配的数字大灯

“流星雨”数字大灯&#xff0c;极具辨识度&#xff0c;通过260万像素的数字微镜技术&#xff0c;实现“流星雨”仪式感与高度精确的光束分布&#xff1b;在远光灯模式下&#xff0c;光束精准度更达之前84颗LED照明的100倍&#xff0c;更新增坡道照明功能&#xff0c;可根据导航…

UE 程序化网格 计算横截面 面积

首先在构造函数内加上程序化网格&#xff0c;然后复制网格体到程序化网格组件上&#xff0c;将Static Mesh&#xff08;类型StaticMeshActor&#xff09;的静态网格体组件给到程序化网格体上 然后把StaticMesh&#xff08;类型为StaticMeshActor&#xff09;Instance暴漏出去 …

原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列6 (承接系列5)

文章目录 一、原始代码---随机采样和评估模型二、详细解释分析每一行代码 一、原始代码—随机采样和评估模型 def randomSample(self,D_set): #从D_set随机取支持集和查询集&#xff08;20个类中的其中一个类&#xff0c;shape为[20,105,105]&#xff09;index_list list(ran…

复旦大学EMBA深度链接深圳科创产业:聚焦智联,产融未来

作为科创成就的经济大区&#xff0c;深圳南山区通过跨界创新研发生态链条&#xff0c;领跑科创产业创新&#xff0c;以187.5平方公里的面积&#xff0c;雄踞着204家上市公司&#xff0c;地均生产总值产出达到了40.7亿元&#xff0c;相当于每平方公里出产超过1家上市公司&#x…

Java项目实战《苍穹外卖》 二、项目搭建

当我痛苦地站在你的面前 你不能说我一无所有 你不能说我两手空空 系列文章目录 苍穹外卖是黑马程序员2023年的Java实战项目&#xff0c;作为业余练手用&#xff0c;需要源码或者课程的可以找我&#xff0c;无偿分享 Java项目实战《苍穹外卖》 一、项目概述Java项目实战《苍穹外…

B-2:Linux系统渗透提权

B-2:Linux系统渗透提权 服务器场景:Server2204(关闭链接) 用户名:hacker 密码:123456 1.使用渗透机对服务器信息收集,并将服务器中SSH服务端口号作为flag提交; 使用nmap扫描,发现ssh服务端口为2283 Flag:2283 2.使用渗透机对服务器信息收集,并将服务器中…