精华内容
下载资源
问答
  • 2021-12-10 10:58:23

    原神换服报错(二级地址解析失败),换服失败,无反应

    在这里插入图片描述
    问题就是缺少文件!

    缺少DLL"PCGameSDK")

    这个问题我之前发过
    在这里插入图片描述

    点我跳转另一个教程

    更多相关内容
  • 都2021年了 还没用过微服务吗?中台架构还只是听说过?2020年的双十一,天猫订单处理峰值达到58.3万笔/秒,2020年的双十,数据量高达1200万+。2021年的12306网站单...

    2021年了 还没用过微服务 吗?中台架构还只是听说过?

    2020年的双十一,天猫订单处理峰值达到58.3万笔/秒,2020年的双十二,数据量高达1200万+。2021年的12306网站单日浏览峰值5000 亿次

    2021年的一线互联网三高架构 你能设计出来吗?

    让你架构一个能支撑淘宝天猫双11双12千亿级流量的电商平台你知道如何着手吗?

    面试的时候对于分布式高并发高可用架构问题的回答总是不能让面试官满意?

    微服务架构很多,到底用Spring Cloud 还是 Dubbo ?

    Spring Cloud Alibaba 与 Spring Cloud Netflix 如何选择?

    互联网微服务中台项目究竟有多少细节?

    看看下面这十几道题是我当时阿里三面时被问到的,基本都是深入到阿里巴巴微服务架构 Spring Cloud Alibaba源码级别,看来P7百万年薪真不是那么好拿的,见识了!

    阿里P7面试题

    1、微服务注册中心的注册表如何更好的防止读写并发冲突?

    2、Nacos如何支撑阿里巴巴内部上百万服务实例的访问?

    3、Nacos高并发异步注册架构知道如何设计的吗?

    4、Eureka注册表多级缓存架构有了解过吗?

    5、Sentinel底层滑动时间窗限流算法怎么实现的?

    6、Sentinel底层是如何计算线上系统实时QPS的?

    7、Seata分布式事务协调管理器是如何实现的?

    8、Seata分布式事务一致性锁机制如何设计的?

    9、Seata分布式事务回滚机制如何实现的?

    10、Nacos集群CP架构底层类Raft协议怎么实现的?

    11、Nacos&Eureka&Zookeeper集群架构都有脑裂问题吗?

    12、如何设计能支撑全世界公司使用的微服务云架构?

    13、RocketMQ架构如何设计能支撑每天万亿级消息处理?

    14、RocketMQ在交易支付场景如何做到消息零丢失?

    看完你能回答上几道?

    据我所知,如果能回答的出其中的一半,就算是勉强及格了。

    如果这些你都能全部回答出来,那你应该是妥妥的技术大牛了!可以放心去投大厂简历了!

    但如果你没办法完全答出这些问题,我建议你听听这3节课,来提升一下自己的核心竞争力,这个课程是我的技术大牛朋友特别打造,独家解密专题:

    《阿里微服务Spring Cloud Alibaba三高架构实战》,从微服务架构实战到源码级别深度讲解

    本号粉丝专属福利,原价99元,现在限时2分钱仅限前150名,还附赠一份2021最新版金三银四面试资料大全,课程核心干货看下图????

    课程目录大纲

    第一节:双11阿里微服务Spring Cloud Alibaba三高架构实战

    1、亿级流量电商网站微服务架构详解

    2、Nacos注册中心实现电商微服务拆分实战

    3、Nacos如何支撑双十一上百万服务实例的访问

    4、Sentinel如何抗住阿里近十年双十一流量洪峰

    5、Sentinel底层如何计算双十一线上系统实时QPS

    6、Seata如何控制微服务架构下的分布式事务

    7、统一路由&大促限流&安全认证网关Gateway实战

    8、双十一线上服务调用链路追踪Pinpoint详解

    9、微服务自动化监控Prometheus&Grafana详解

    10、阿里京东双十一后端微服务中台架构剖析

    第二节: Spring Cloud Alibaba组件源码深度剖析

    1、Nacos服务注册与发现源码深度剖析

    2、Nacos心跳机制与服务健康检查源码剖析

    3、Nacos注册表如何防止多节点读写并发冲突

    4、Nacos高并发支撑异步任务与内存队列剖析

    5、Nacos集群AP与CP架构如何选择

    6、Nacos集群CP架构底层Raft协议实现源码剖析

    7、从脑裂问题剖析Nacos&Eureka&Zookeeper架构异同

    8、阿里云超大规模注册中心SaaS架构剖析

    9、Sentinel底层滑动时间窗限流算法深度剖析

    10、利用Sentinel的Metric机制计算线上系统实时QPS

    11、分布式事务Seata事务回滚机制剖析

    第三节:阿里微服务分布式事务Seata源码深度剖析

    1、微服务架构分布式事务详解

    2、十分钟快速实战阿里分布式事务框架Seata

    3、Seata中AT模式模型架构与数据模型设计

    4、Seata事务管理器实现原理详解

    5、Seata全局事务与分支事务源码剖析

    6、Seata数据源代理扩展源码剖析

    7、Seata事务隔离级别底层源码剖析

    8、Seata事务超时、二阶段失败解决方案源码剖析

    9、生产环境AT模式与TCC模式性能差异分析

    上课参与抽奖

    5月12日晚上的直播间里诸葛老师还为大家准备了超级干货内部教材

    完成听课即有机会获得《阿里微服务Spring Cloud Alibaba从入门到源码剖析》包邮寄送:

    免费领取最新面试资料

    免费领取2020-2021年最新最全的一线互联网大厂面试题及详析,帮助你在2021年跳槽时更快更稳地拿下心仪offer!

    扫码购课,比你的对手多学一点

    2分钱给自己增加一个精通微服务的技能点

    5月12日晚上20:00开始直播,全程高能

    搞定三高架构!一起来学习!

    ????戳阅读原文,直接进课程

    展开全文
  • 5) 保持现状或出现更差的情况都是失败! 2、优化的需求 1) 稳定性和业务可持续性,通常比性能更重要! 2) 优化不可避免涉及到变更,变更就有风险! 3) 优化使性能变好,维持和变差是等概率事件! 4) ...

    点击上方“朱小厮的博客”,选择“设为星标”

    后台回复”加群“加入公众号专属技术群

     

    640

    链接 | https://clsn.io/clsn/lx287.html

    一、前言

    MySQL调优对于很多程序员而言,都是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。

    今天给大家讲解MySQL的优化实战,助你高薪之路顺畅!

    640?

    二、优化的哲学

    注意:优化有风险,涉足需谨慎!

    1、优化可能带来的问题

    1) 优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统。

    2) 优化手段本来就有很大的风险,只不过你没能力意识到和预见到!

    3) 任何的技术可以解决一个问题,但必然存在带来一个问题的风险!

    4) 对于优化来说解决问题而带来的问题,控制在可接受的范围内才是有成果。

    5) 保持现状或出现更差的情况都是失败!

    2、优化的需求

    1) 稳定性和业务可持续性,通常比性能更重要!

    2) 优化不可避免涉及到变更,变更就有风险!

    3) 优化使性能变好,维持和变差是等概率事件!

    4) 切记优化,应该是各部门协同,共同参与的工作,任何单一部门都不能对数据库进行优化!

    5) 所以优化工作,是由业务需要驱使的!!!

    3、优化由谁参与

    在进行数据库优化时,应由数据库管理员、业务部门代表、应用程序架构师、应用程序设计人员、应用程序开发人员、硬件及系统管理员、存储管理员等,业务相关人员共同参与。

    tips:大家可以关注微信公众号:Java后端,获取更多优秀博文推送。

    三、优化思路

    1、优化什么

    在数据库优化上有两个主要方面:即安全与性能。

    1) 安全 ---> 数据可持续性

    2) 性能 ---> 数据的高性能访问

    2、优化的范围有哪些

    存储、主机和操作系统方面:

    1) 主机架构稳定性

    2) I/O规划及配置 

    3) Swap交换分区

    4) OS内核参数和网络问题

    应用程序方面:

    1) 应用程序稳定性 

    2) SQL语句性能 

    3) 串行访问资源 

    4) 性能欠佳会话管理

    5) 这个应用适不适合用MySQL

    数据库优化方面:

    1) 内存

    2) 数据库结构(物理&逻辑) 

    3) 实例配置

    说明:不管是在,设计系统,定位问题还是优化,都可以按照这个顺序执行。

    3、优化维度

    数据库优化维度有四个:

    硬件、系统配置、数据库表结构、SQL及索引。

    优化选择:

    1) 优化成本: 硬件>系统配置>数据库表结构>SQL及索引

    2) 优化效果: 硬件<系统配置<数据库表结构<SQL及索引

    四、优化工具有啥?

    1、数据库层面

    检查问题常用工具:

    mysql	
    msyqladmin                                 mysql客户端,可进行管理操作	
    mysqlshow                                  功能强大的查看shell命令	
    show [SESSION | GLOBAL] variables          查看数据库参数信息	
    SHOW [SESSION | GLOBAL] STATUS             查看数据库的状态信息	
    information_schema                         获取元数据的方法	
    SHOW ENGINE INNODB STATUS                  Innodb引擎的所有状态	
    SHOW PROCESSLIST                           查看当前所有连接session状态	
    explain                                    获取查询语句的执行计划	
    show index                                 查看表的索引信息	
    slow-log                                   记录慢查询语句	
    mysqldumpslow                              分析slowlog文件的

    不常用但好用的工具:

    zabbix                  监控主机、系统、数据库(部署zabbix监控平台)	
    pt-query-digest         分析慢日志	
    mysqlslap               分析慢日志	
    sysbench                压力测试工具	
    mysql profiling         统计数据库整体状态工具    	
    Performance Schema      mysql性能状态统计的数据	
    workbench               管理、备份、监控、分析、优化工具(比较费资源)

    2、数据库层面问题解决思路

    一般应急调优的思路:

    针对突然的业务办理卡顿,无法进行正常的业务处理!需要立马解决的场景!

    1、show processlist	
    
    	
    2、explain  select id ,name from stu where name='clsn'; # ALL  id name age  sex	
    
    	
                select id,name from stu  where id=2-1 函数 结果集>30;	
    
    	
        show index from table;	
    
    	
    3、通过执行计划判断,索引问题(有没有、合不合理)或者语句本身问题	
    
    	
    4、show status  like '%lock%';    # 查询锁状态	
    
    	
      kill SESSION_ID;   # 杀掉有问题的session

    常规调优思路:

    针对业务周期性的卡顿,例如在每天10-11点业务特别慢,但是还能够使用,过了这段时间就好了。

    1) 查看slowlog,分析slowlog,分析出查询慢的语句。

    2) 按照一定优先级,进行一个一个的排查所有慢语句。

    3) 分析top sql,进行explain调试,查看语句执行时间。

    4) 调整索引或语句本身。

    3、系统层面

    cpu方面:

    vmstat、sar top、htop、nmon、mpstat

    内存:

    free 、ps -aux 、

    IO设备(磁盘、网络):

    iostat 、 ss 、 netstat 、 iptraf、iftop、lsof、

    vmstat 命令说明:

    Procs:r显示有多少进程正在等待CPU时间。b显示处于不可中断的休眠的进程数量。在等待I/OMemory:swpd显示被交换到磁盘的数据块的数量。未被使用的数据块,用户缓冲数据块,用于操作系统的数据块的数量Swap:操作系统每秒从磁盘上交换到内存和从内存交换到磁盘的数据块的数量。s1和s0最好是0Io:每秒从设备中读入b1的写入到设备b0的数据块的数量。反映了磁盘I/OSystem:显示了每秒发生中断的数量(in)和上下文交换(cs)的数量Cpu:显示用于运行用户代码,系统代码,空闲,等待I/O的CPU时间

    iostat命令说明

    实例命令:iostat -dk 1 5

    iostat -d -k -x 5 (查看设备使用率(%util)和响应时间(await))

    1) tps:该设备每秒的传输次数。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。

    2) iops :硬件出厂的时候,厂家定义的一个每秒最大的IO次数,"一次传输"请求的大小是未知的。

    3) kBread/s:每秒从设备(drive expressed)读取的数据量;

    4) KBwrtn/s:每秒向设备(drive expressed)写入的数据量;

    5) kBread:读取的总数据量;7、kBwrtn:写入的总数量数据量;这些单位都为Kilobytes。

    4、系统层面问题解决办法

    你认为到底负载高好,还是低好呢?

    在实际的生产中,一般认为 cpu只要不超过90%都没什么问题 。

    当然不排除下面这些特殊情况:

    问题一:cpu负载高,IO负载低

    1、内存不够 2、磁盘性能差 3、SQL问题 ------>去数据库层,进一步排查sql问题 4、IO出问题了(磁盘到临界了、raid设计不好、raid降级、锁、在单位时间内tps过高) 5、tps过高: 大量的小数据IO、大量的全表扫描

    问题二:IO负载高,cpu负载低

    1、大量小的IO 写操作:2、autocommit ,产生大量小IO 3、IO/PS,磁盘的一个定值,硬件出厂的时候,厂家定义的一个每秒最大的IO次数。4、大量大的IO 写操作 5、SQL问题的几率比较大

    问题三:IO和cpu负载都很高

    硬件不够了或sql存在问题

    五、基础优化

    1、优化思路

    定位问题点:

    硬件 --> 系统 --> 应用 --> 数据库 --> 架构(高可用、读写分离、分库分表)

    处理方向:

    明确优化目标、性能和安全的折中、防患未然

    2、硬件优化

    主机方面:

    1) 根据数据库类型,主机CPU选择、内存容量选择、磁盘选择 

    2) 平衡内存和磁盘资源 

    3) 随机的I/O和顺序的I/O 

    4) 主机 RAID卡的BBU(Battery Backup Unit)关闭

    cpu的选择:

    1) cpu的两个关键因素:核数、主频 

    2) 根据不同的业务类型进行选择

    3) cpu密集型:计算比较多,OLTP 主频很高的cpu、核数还要多 

    4) IO密集型:查询比较,OLAP 核数要多,主频不一定高的

    内存的选择:

    1) OLAP类型数据库,需要更多内存,和数据获取量级有关。

    2) OLTP类型数据一般内存是cpu核心数量的2倍到4倍,没有最佳实践。

    存储方面:

    1) 根据存储数据种类的不同,选择不同的存储设备 

    2) 配置合理的RAID级别(raid5、raid10、热备盘) 

    3) 对与操作系统来讲,不需要太特殊的选择,最好做好冗余(raid1)(ssd、sas 、sata)

    raid卡:主机raid卡选择:

    1) 实现操作系统磁盘的冗余(raid1)

    2) 平衡内存和磁盘资源 

    3) 随机的I/O和顺序的I/O 

    4) 主机 RAID卡的BBU(Battery Backup Unit)要关闭。

    网络设备方面:

    使用流量支持更高的网络设备(交换机、路由器、网线、网卡、HBA卡)

    注意:以上这些规划应该在初始设计系统时就应该考虑好。

    3、服务器硬件优化

    1) 物理状态灯:

    2) 自带管理设备:远程控制卡(FENCE设备:ipmi ilo idarc),开关机、硬件监控。

    3) 第三方的监控软件、设备(snmp、agent)对物理设施进行监控

    4) 存储设备:自带的监控平台。EMC2(hp收购了), 日立(hds),IBM低端OEM hds,高端存储是自己技术,华为存储

    4、系统优化

    Cpu:

    基本不需要调整,在硬件选择方面下功夫即可。

    内存:

    基本不需要调整,在硬件选择方面下功夫即可。

    SWAP:

    MySQL尽量避免使用swap。阿里云的服务器中默认swap为0

    IO :

    1) raid、no lvm、 ext4或xfs、ssd、IO调度策略 

    2) Swap调整(不使用swap分区)

    /proc/sys/vm/swappiness的内容改成0(临时),/etc/sysctl.conf上添加vm.swappiness=0(永久)

    这个参数决定了Linux是倾向于使用swap,还是倾向于释放文件系统cache。在内存紧张的情况下,数值越低越倾向于释放文件系统cache。当然,这个参数只能减少使用swap的概率,并不能避免Linux使用swap。修改MySQL的配置参数innodbflushmethod,开启O_DIRECT模式。这种情况下,InnoDB的buffer pool会直接绕过文件系统cache来访问磁盘,但是redo log依旧会使用文件系统cache。值得注意的是,Redo log是覆写模式的,即使使用了文件系统的cache,也不会占用太多。

    IO调度策略:

    vi /boot/grub/grub.conf	
    更改到如下内容:	
    kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet

    5、系统参数调整

    Linux系统内核参数优化:

    vim /etc/sysctl.conf	
        net.ipv4.ip_local_port_range = 1024 65535   # 用户端口范围	
        net.ipv4.tcp_max_syn_backlog = 4096 	
        net.ipv4.tcp_fin_timeout = 30 	
        fs.file-max=65535          # 系统最大文件句柄,控制的是能打开文件最大数量

    用户限制参数(mysql可以不设置以下配置):

    vim    /etc/security/limits.conf 	
        * soft nproc 65535	
        * hard nproc 65535	
        * soft nofile 65535	
        * hard nofile 65535

    6、应用优化

    业务应用和数据库应用独立,防火墙:iptables、selinux等其他无用服务(关闭):

    chkconfig --level 23456 acpid off	
    chkconfig --level 23456 anacron off	
    chkconfig --level 23456 autofs off	
    chkconfig --level 23456 avahi-daemon off	
    chkconfig --level 23456 bluetooth off	
    chkconfig --level 23456 cups off	
    chkconfig --level 23456 firstboot off	
    chkconfig --level 23456 haldaemon off	
    chkconfig --level 23456 hplip off	
    chkconfig --level 23456 ip6tables off	
    chkconfig --level 23456 iptables  off	
    chkconfig --level 23456 isdn off	
    chkconfig --level 23456 pcscd off	
    chkconfig --level 23456 sendmail  off	
    chkconfig --level 23456 yum-updatesd  off

    安装图形界面的服务器不要启动图形界面 runlevel 3,另外,思考将来我们的业务是否真的需要MySQL,还是使用其他种类的数据库。用数据库的最高境界就是不用数据库。

    六、数据库优化

    SQL优化方向:

    执行计划、索引、SQL改写

    架构优化方向:

    高可用架构、高性能架构、分库分表

    1、数据库参数优化

    调整:

    实例整体(高级优化,扩展)

    thread_concurrency       # 并发线程数量个数	
    sort_buffer_size         # 排序缓存	
    read_buffer_size         # 顺序读取缓存	
    read_rnd_buffer_size     # 随机读取缓存	
    key_buffer_size          # 索引缓存	
    thread_cache_size        # (1G—>8, 2G—>16, 3G—>32, >3G—>64)

    连接层(基础优化)

    设置合理的连接客户和连接方式

    max_connections           # 最大连接数,看交易笔数设置    	
    max_connect_errors        # 最大错误连接数,能大则大	
    connect_timeout           # 连接超时	
    max_user_connections      # 最大用户连接数	
    skip-name-resolve         # 跳过域名解析	
    wait_timeout              # 等待超时	
    back_log                  # 可以在堆栈中的连接数量

    SQL层(基础优化)

    querycachesize:查询缓存-->>>OLAP类型数据库,需要重点加大此内存缓存.

    1) 但是一般不会超过GB.

    2) 对于经常被修改的数据,缓存会立马失效。

    3) 我们可以实用内存数据库(redis、memecache),替代他的功能。

    2、存储引擎层(innodb基础优化参数)

    default-storage-engine	
    innodb_buffer_pool_size       # 没有固定大小,50%测试值,看看情况再微调。但是尽量设置不要超过物理内存70%	
    innodb_file_per_table=(1,0)	
    innodb_flush_log_at_trx_commit=(0,1,2) # 1是最安全的,0是性能最高,2折中	
    binlog_sync	
    Innodb_flush_method=(O_DIRECT, fdatasync)	
    innodb_log_buffer_size        # 100M以下	
    innodb_log_file_size          # 100M 以下	
    innodb_log_files_in_group     # 5个成员以下,一般2-3个够用(iblogfile0-N)	
    innodb_max_dirty_pages_pct   # 达到百分之75的时候刷写 内存脏页到磁盘。	
    log_bin	
    max_binlog_cache_size         # 可以不设置	
    max_binlog_size               # 可以不设置	
    innodb_additional_mem_pool_size    #小于2G内存的机器,推荐值是20M。32G内存以上100M

     

     

    640?wx_fmt=png

     

    想知道更多?描下面的二维码关注我

    640?wx_fmt=png

     

    【限时推广】

     

    作为技术人,搭建博客,弄个梯子什么的,应该都是小case。那么,随时备个云服务器就很刚需了。可惜的是,平时没活动1核1G都要1K一年,2核8G更要一万五,贵!

     

    不过【阿里云】终于放出了双十一预热活动的推广。价格也是非常惊人的优惠!

     

    1核2G:86/年,229/3年(折算1年76元)。

    2核4G:799/3年,一年只要266元。平时近万元!强推这款!这次我买的就是这款。

     

    我最推荐大家买的是【2核4G】,因为1核2G固然便宜,但是是T5cpu,只能发挥20%性能,而2核4G和8G的都是能发挥100%的u,带宽也ok,性价比最高。

     

    不过这又是新人专属福利,这也是为了扩大用户,又避免亏损太多的无奈之举,我还是理解的。因为像这种服务器,各种补贴什么的,基本都是亏很多钱去做的。理解归理解,还是不妨碍零度我褥羊毛,转身拿了我亲戚的账号去购买,美滋滋。所以,老用户有需要的拿亲戚朋友的号买也是一样的。

     

    拼团地址:http://suo.im/59kDxw,如有需要,直接扫码也可以参与拼团。

     

    640?wx_fmt=jpeg

     

    朕已阅 640?

    展开全文
  • 本文将分析开源库 OpenZeppelin/openzeppelin-contracts 中的交易合约的实现,让你能够快速入门交易实现细节,从而能够自己对后续更多的相关技术深入探索。 前置知识概述 交易会涉及到 ECDSA 与 EIP712 等知识...

    引言

    上文中提到,普通的 ETH 交易并不能够做到让用户无需 gas 费,需要交易中嵌套一个交易,即元交易,来实现免 gas 费。

    本文将分析开源库 OpenZeppelin/openzeppelin-contracts 中的元交易合约的实现,让你能够快速入门元交易实现细节,从而能够自己对后续更多的相关技术深入探索。

    前置知识概述

    元交易会涉及到 ECDSA 与 EIP712 等知识,如果你是熟手,可以跳过此节内容,直接浏览具体实现分析部分。

    Hash

    也称哈希、散列、数字摘要。通过哈希函数,可以将长短不一的信息转化为一段长度任意但可预测的(确定性的)结果。这是一类神奇的函数,可以将一大堆信息转变成一串短的,可作为摘要的数据 “指纹”。对于一个给定的输入而言,生成的 “指纹” 始终一致。如果你的原始数据中有任何细微的改动,生成的哈希值将大不相同。以太坊中采用的是 Keccak-256 算法。

    ECDSA

    在密码学中,ECDSA(Elliptic Curve Digital Signature Algorithm,椭圆曲线数字签名算法)是使用椭圆曲线密码学的数字签名算法(DSA)的一个变种。

    主要用于对数据(比如一个文件)创建数字签名,以便于你在不破坏它的安全性的前提下对它的真实性进行验证。可以将它想象成一个实际的签名,你可以识别部分人的签名,但是你无法在别人不知道的情况下伪造它。

    你不应该将ECDSA与用来对数据进行加密的AES(高级加密标准)相混淆。ECDSA不会对数据进行加密、或阻止别人看到或访问你的数据,它可以防止的是确保数据没有被篡改。

    如图所示,在以太坊中,ECDSA 用于对原始数据的 hash 值进行签名及恢复。
    ECDSA 在 ETH 中的应用
    将原始数据通过 hash 函数得到它的 hash 值后,用户 A 用自己的私钥对该 hash 值进行签名,得到 Signature(签名)。有了该签名与 hash 值,任何人都能够从中恢复出签名人的钱包地址,在这里用户 B 则恢复得到了用户 A 的钱包地址。

    EIP712

    Ethereum Improvement Proposals (EIPs),你可以在这里查看所有的 EIPsEIP712 (Ethereum typed structured data hashing and signing)以太坊类型的结构化数据哈希与签名。

    如果我们只关心字节字符串的话,签名数据是一个已经解决了的问题。但不幸的是,在现实世界中,我们关心的是复杂而有意义的信息,对结构化数据进行哈希是非常重要的,错误会导致系统安全属性的丢失。

    此 EIP 旨在提高链上使用的链下消息签名的可用性。我们看到越来越多的人采用链下消息签名,因为它节省了 gas 费,减少了区块链上的交易数量。当前签名消息是一个不透明的十六进制字符串,显示给用户,关于组成消息的项目的上下文很少。

    Sign the message
    EIP712 概述了一个编码数据及其结构的方案,该方案允许在签名时将数据显示给用户进行验证。下面是一个用户在签署 EIP712 消息时显示的示例。

    Sign the typed structured message

    元交易合约的实现

    此分析针对 openzeppelin-contracts v4.3.2 版本

    contract MinimalForwarder is EIP712 {
        using ECDSA for bytes32;
    
        struct ForwardRequest {
            address from;
            address to;
            uint256 value;
            uint256 gas;
            uint256 nonce;
            bytes data;
        }
    
    	constructor() EIP712("MinimalForwarder", "0.0.1") {}
    }
    

    ECDSA 是 openzeppelin 实现的一个 solidity 库,它实现了从 hash 值中恢复钱包地址的方法,将它应用在 bytes32 上,就可以直接在 bytes32 上调用 recover 方法。recover 函数签名:function recover(bytes32 hash, bytes memory signature) internal pure returns (address)

    ForwardRequest 结构体定义了一个交易中用于签名的基本组成成分。与以太坊交易不同的是没有 gasPrice,因为智能合约的执行只关心 gas 的消耗。ForwardRequest 中 的 nonce 概念与以太坊类似,都是为了避免双花攻击,但这里的 nonce 仅由智能合约维护,跟普通的以太坊交易中的 nonce 无关。

    构造函数中直接使用 EIP712 的构造函数进行初始化,EIP712 的构造函数签名为:constructor(string memory name, string memory version) ,其中 name 是合约名称,version 是合约版本,这将作为 EIP712 签名验证的一部分,它在部署时,将自动获取合约的地址、chainId 等信息。意味着,即便有相同的 ForwardRequest 结构体数据,但合约地址或区块链网络不同,也会导致签名无效。

    mapping(address => uint256) private _nonces;
    
    function getNonce(address from) public view returns (uint256) {
    	return _nonces[from];
    }
    

    为了避免双花攻击,在智能合约中维护 nonce 是必要的。

    bytes32 private constant _TYPEHASH =
    	keccak256("ForwardRequest(address from,address to,uint256 value,uint256 gas,uint256 nonce,bytes data)");
    
    function verify(ForwardRequest calldata req, bytes calldata signature) public view returns (bool) {
    	address signer = _hashTypedDataV4(
                keccak256(abi.encode(_TYPEHASH, req.from, req.to, req.value, req.gas, req.nonce, keccak256(req.data)))
        ).recover(signature);
    	return _nonces[req.from] == req.nonce && signer == req.from;
    }
    

    看到 verify 函数,我们知道,要将钱包地址恢复,至少需要经过 ECDSA 的签名以及用于签名的原始数据,而此处,ECDSA 签名的原始数据就是经过 abi 编码的 keccak256(abi.encode(_TYPEHASH, req.from, req.to, req.value, req.gas, req.nonce, keccak256(req.data))) ForwardRequest 结构体数据的哈希值。再通过调用 ECDSA 库中的 recover 函数,传入签名,就能够恢复得到签名者的钱包地址。

    通过 _nonces[req.from] == req.nonce 来确保交易的调用是顺序的,且不会遭受双花攻击。signer == req.from 避免签名者与实际元交易发送者不匹配。

    接下来看,如何执行元交易。

    function execute(ForwardRequest calldata req, bytes calldata signature)
    	public
    	payable
    	returns (bool, bytes memory)
    {
    	require(verify(req, signature), "MinimalForwarder: signature does not match request");
    	_nonces[req.from] = req.nonce + 1;
    
    	(bool success, bytes memory returndata) = req.to.call{gas: req.gas, value: req.value}(
    		abi.encodePacked(req.data, req.from)
    	);
    	// Validate that the relayer has sent enough gas for the call.
    	// See https://ronan.eth.link/blog/ethereum-gas-dangers/
    	assert(gasleft() > req.gas / 63);
    
    	return (success, returndata);
    }
    

    在使用 Address.call 方法的时候,根据元交易参数,指定了 callgasvalue 值。需要注意的是,这里并不直接将元交易的 data 字段当作 call 操作的 data,而是将 datafrom 进行 abi 编码后一起作为 call 操作的参数,这在目标合约(也就是 req.to)中会被解析,从而得到交易的发送者,在下面会详细讲解。

    assert(gasleft() > req.gas / 63) 简单理解为避免中继器(代为执行元交易的人)恶意地或无意地使用足够低的 gas 使得交易执行成功,而元交易执行失败。详情可以在 ethereum gas dangers 中学习。

    ERC2771

    要支持元交易,仅实现元交易智能合约是不够的,因为目标合约无法知道实际的元交易 from 是谁。如果没有额外的措施,它将只能够从 msg.sender 中获取,由于在元交易合约实现中,是通过 Address.call 调用的,因此将得到的发送者是元交易合约的地址。ERC2771 则解决了该问题。

    abstract contract ERC2771Context is Context
    

    ERC2771Context 继承了 Context,而 Context 中简单封装了从 msg.sendermsg.data ,以便规范这两个功能的使用,且能够让其在子合约中修改其行为。要求使用 Context 合约获取 msg 相关的数据,而不是直接使用 msg.sender 等。

    abstract contract Context {
        function _msgSender() internal view virtual returns (address) {
            return msg.sender;
        }
    
        function _msgData() internal view virtual returns (bytes calldata) {
            return msg.data;
        }
    }
    

    ERC2771Context 就修改了 Context 合约的方法。

    function _msgSender() internal view virtual override returns (address sender) {
    	if (isTrustedForwarder(msg.sender)) {
    		// The assembly code is more direct than the Solidity version using `abi.decode`.
    		assembly {
    		sender := shr(96, calldataload(sub(calldatasize(), 20)))
    		}
    	} else {
    		return super._msgSender();
    	}
    }
    

    先通过 isTrustedForwarder(msg.sender) 验证元交易的调用方是期望的元交易合约地址。assembly 代码将上文的元交易合约中 req.to.call{...}(abi.encodePacked(req.data, req.from)) 编码进的 data 部分内容的 req.from 获取到,然后再返回该值。

    元交易使用概览

    让我们来尝试简单使用元交易合约,要支持元交易,你所编写的合约必须继承 ERC2771Context。在这里简单实现一个 NFT 合约,在部署它之前,你必须先部署元交易合约,将元交易合约地址作为参数传递给 NFT 合约构造函数。

    // SPDX-License-Identifier: GPL3.0
    pragma solidity ^0.8.0;
    
    import "@openzeppelin/contracts/utils/math/SafeMath.sol";
    import "@openzeppelin/contracts/metatx/ERC2771Context.sol";
    import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
    
    contract NFT is ERC2771Context, ERC721 {
        using SafeMath for uint256;
    
        uint256 private _currentTokenId = 0;
    
        constructor(
            string memory name,
            string memory symbol,
            address trustedForwarder
        ) ERC721(name, symbol) ERC2771Context(trustedForwarder) {}
    
        function safeMint() public virtual {
            safeMint("");
        }
    
        function safeMint(bytes memory _data) internal virtual {
            uint256 tokenId = _getNextTokenId();
            _incrementTokenId();
            _safeMint(_msgSender(), tokenId, _data);
        }
        
        function getCurrTokenId() public virtual view returns (uint256) {
            return _currentTokenId;
        }
    
        /**
         * @dev calculates the next token ID based on value of _currentTokenId
         * @return uint256 for the next token ID
         */
        function _getNextTokenId() internal virtual view returns (uint256) {
            return _currentTokenId.add(1);
        }
    
        /**
         * @dev increments the value of _currentTokenId
         */
        function _incrementTokenId() internal virtual {
            _currentTokenId++;
        }
    
        function _msgSender() internal view virtual override(Context, ERC2771Context) returns (address) {
            return ERC2771Context._msgSender();
        }
    
        function _msgData() internal view virtual override(Context, ERC2771Context) returns (bytes calldata) {
            return ERC2771Context._msgData();
        }
    }
    

    在这个示例中,如果 Alice 没有足够的 ETH 支付 gas 费,来铸造一个 NFT,她可以签署一个元交易,元交易的 data 是由 abi.encodeWithSignature(functionSelector, parmas...) 得到的,将该元交易递交给具有足够 ETH 的 Bob,Bob 调用元交易合约 MinimalForwarder.execute(req, signature),从而让 Alice 的元交易成功执行。

    OpenZeppelin 的完整代码实现

    延伸阅读

    引用

    展开全文
  • 都2021年了 还没用过微服务吗?中台架构还只是听说过?2020年的双十一,天猫订单处理峰值达到58.3万笔/秒,2020年的双十,数据量高达1200万+。2021年的12306网站单...
  • 莫慌,我送你套神级pdf文档 随着 Spring Boot 使用越来越广泛,Spring Boot 已经成为 Java 程序员面试的知识点,很多同学对 Spring Boot 理解不是那么深刻,经常就会被几个连环追问就给干趴下了! 今天小编就给大家...
  • 5、Seata全局事务与分支事务源码剖析 6、Seata数据源代理扩展源码剖析 7、Seata事务隔离级别底层源码剖析 8、Seata事务超时、阶段失败解决方案源码剖析 9、生产环境AT模式与TCC模式性能差异分析 上课参与抽奖 今天...
  • 一、前言 MySQL调优对于很多程序员而言,都是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行MySQL的优化之前必须要了解的...、优化的哲学 注意:优化有风险,涉足需谨慎...
  • 41.Hachoir----Hachoir 是一个用于按字段查看和编辑进制流文件的 Python 库,它可以采用类似浏览目录和文件一样“浏览”任何进制流/文件,它还提供了提取进制文件数据等功能。 42.PyPDF2----PyPDF2 是一个...
  • 5) 保持现状或出现更差的情况都是失败! 2、优化的需求 1) 稳定性和业务可持续性,通常比性能更重要! 2) 优化不可避免涉及到变更,变更就有风险! 3) 优化使性能变好,维持和变差是等概率事件! 4) 切记优化,应该是...
  • 05 js练习之二级联动 06 jquery以及jquery对象介绍 07 jquery选择器 08 jquery的查找筛选器 09 jquery练习之左侧菜单 第44章 01 jquery属性操作之html,text,val方法 02 jquery循环方法和attr,prop方法 03 jquery...
  • 本文中则会对Java虚拟机的类加载机制以及执行引擎进行全面分析。 一、初窥类加载机制及加载过程详解 每个编写出的.java文件都存储着需执行的程序逻辑,经过Java编译器编译后,会为每个.java文件生成对应的.class字节...
  • 基础知识 1.外部脚本 如果你有大量的 JavaScript 代码,我们可以将它放入一个单独的文件。 ... <script src="/path/to/script.js"></script>...这里,/path/to/script.js 是脚本文件从网站根目录开始的绝对...
  • 借汉诺塔理解栈与递归 单调栈 双端单调队列 单调队列优化的背包问题 01背包问题 完全背包问题 多重背包问题 串的定长表示 串的堆分配实现 KMP 一、引子 分析总结 三、基本操作 四、原理 五、复杂度分析 ...
  • PE接受失败:一场被迫发生的行业革命 刘旌 • 4小时前 • 内容 2018年后,确定性失灵了 文 刘旌 编辑 洪鹄 2018,一个必定成为新商业世界分水岭的年份——不仅是对众多新经济公司,对于狂奔猛进的VC和PE们或许更是...
  • Springbean的作用域 bean的作用域 创建一个bean定义,其实质是用该bean定义对应的类来创建真正实例的“配方”。...这样可以灵活选择所建对象的作用域,而不必在Java Class定义作用域。Spring Framew...
  • 对某款国家内容过滤系统Dos安全缺陷分析 Author: jianxin [80sec]EMail: jianxin#80sec.comSite: http://www.80sec.comDate: 2009-1-2From: http://www.80sec.com/release/dos-with-XXX.txt [ 目录 ] 0×00 ...
  • 【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址(1) 爬取结果: 火狐(Firefox)如何移除addsec...
  • SQL的整个解析、执行过程原理? https://blog.csdn.net/w372426096/article/details/87919935 sql语句各种条件的执行顺序,如select, where, order by, group by? 写的顺序:select ... from... ...
  • 数据库技术知识点总结

    千次阅读 2021-06-12 07:08:54
    1:类的UML表示:空心三角形实线连接 2:接口的UML表示:空心三角形虚线连接 3:聚合关系的UML表示:空心菱形实线连接 ...8:通过需求分析过程,需要系统的描述整个应用系统的功能特征,性能特征和约束,...
  • 区块链,如瑞士仪表般精密,如互联网般惊世骇俗,它在以一般的节奏颠覆社会。 当新兴技术来临时,你可以选择规避——如果明天也可以规避的话。区块链也一样。 作为一个现象概念,金融科技创新在过去几年迎来了...
  • 论文的可复现性,能否量化分析

    千次阅读 2020-02-17 15:50:05
    2020-02-17 05:32:40 作者 | Edward Raff 编译 | Mr Bear 编辑 | 丛末 对于每一名研究者来说,复现论文是理解一...在 NeurIPS 2019 上,科学研究者 Edward Raff 对此进行了深入分析,揭开了论文可复现性的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,219
精华内容 1,687
关键字:

原神二级地址解析失败