如果觉得我的内容对你有帮助,欢迎关注我的推特账号和小红书账号:飞猪聊web3,获取更多web3的安全知识、基本技能和实用资讯
如果需要更具体、系统、有针对性的教程指导,欢迎大家私聊咨询哦
从之前我分析过的各种BAYC被盗案例中,大家其实可以发现,在助记词和私钥没有泄露的情况下,造成被盗最主要的两个操作就是:不当授权+签名。
关于合约授权的含义及注意事项,之前我已经写过一条单独的线程来解释
在今天的线程中,我会用简单通俗的语言来给大家解释什么是签名、签名的种类、签名存在的风险、如何读懂签名以及如何避免错误签名等问题。希望能帮助大家更加深入的理解签名操作避免不当签名造成的资产损失。
在解释签名的概念之前,大家需要先回顾一下几个相关的名词,我用白话给大家进行了解释,相信会比专业的术语更能方便大家理解
区块链:多人共同维护的记账系统
加密资产:以数据形式记录在区块链账本中的资产,由密码学原理确保交易安全及不可伪造
地址:区块链中的个人账户,由加密算法生成无需中介参与
私钥:管理地址及地址上资产的工具
钱包:管理私钥的工具
如果感觉对这些概念理解的还不够充分,可以回头复习一下我写过的人话讲透web3概念系列线程
理解以上概念之后,我们再来看一下,区块链中发起一笔交易流程是怎样?
用户(地址)发起交易请求;
客户端(钱包应用)基于请求构建交易,交易中包含关键信息如发送地址、接收地址和交易相关数据等;
为了验证发起交易的用户身份,用户需要利用私钥在客户端对生成的交易信息进行签名;
客户端收到签名后的信息会把信息发送给节点,节点对签名进行验证,确认无误之后进行广播打包出块等操作;
在区块链账本中,一笔交易的简化流程如下图所示
从图中可以看出,在区块链记账体系中,用户发起的任何交易都需要用自己的私钥进行签名以进行身份验证和确保数据不会被篡改,具体的原理涉及到非对称加密等数学原理,这里不做详细介绍。大家只要明白交易发起方用私钥签名后,接收方可以利用发送方的公钥(地址)对签名进行验证,能够验证成功就可以证明交易确实由发起方发起且交易信息没被篡改,因为交易信息的任何变化都会导致签名发生变化,进而导致签名无法被成功验证。
说到这里,可能有的小伙伴会比较怀疑,你说任何交易都需要签名,但是在钱包里进行转账交易没有涉及到签名呀?还有进行授权的过程中也没看到哪里需要签名呀?
在实际操作中,我们通过钱包来进行转账交易和授权的操作确实看不到签名的环节,但这并不意味着签名这一步骤不存在,而是钱包为了方便用户操作把签名的步骤跟其他操作打包在一起,从而让用户无法感知罢了,比如转账过程的签名是包含在发起交易的过程中,而授权的过程中也包含了对交易签名的步骤,大家通过钱包输入密码的过程其实就是在利用私钥进行签名。
上文我们说过了,签名的主要作用有两个:1验证用户身份真实无误 2确保交易数据不被篡改,所以一旦对交易进行了签名,就意味着用户认可该笔交易的真实性,那么交易就会被节点广播打包上链。所以签名对于资产安全也是一个至关重要的环节,看不懂的签名一定不要乱签,不然可能会在不知不觉中造成资产损失。
下面我们来说一下我们经常碰到的几种签名类型
签名根据目的不同,也有不同的类型,有的签名是为了确认所有权,比如必须持有某个NFT才能加入某个discord,在加入时就会通过Collab.Land去验证所有权(图1);有些签名是为了同意服务提供方的服务条款,比如登陆os时进行的签名(图2)有的签名目的是为了确认交易条件,比如在os上架已经授权过的NFT时的签名(图3)。
上面的签名都可以看到发起签名的来源以及签名的原始信息,所以叫做明文签名,还有一种签名只是一串字符,看不出任何和签名相关的信息,这种签名叫做盲签名,是非常危险的一种签名,因为你并不清楚你签了什么内容,所以碰到盲签的时候,除非你清楚的知道你在哪里在签什么,否则应该立刻停下来,搞清楚之后再进行
下图1是在x2y2网站上对NFT上架的签名,如果你是在x2y2官网上进行NFT上架的操作,那是可以正常签署的;但是图2是一种特别危险的eth_sign,它的危险性在于签署之后可以被用于任何交易,所以又被叫做以太坊空白支票签名。 因为这种签名的危险性过高,所以签署此签名时metamask钱包会特意用红色文字进行提示。大家如果看到此类签名一定要第一时间拒绝,千万不要签署。
盲签看不到交易详情,所以不确定的情况下一定不能随意盲签;那么明文签名大家能不能看得懂呢?下面我们就来了解一下如何阅读明文签名,理解签名传递的具体信息,以下是同一个NFT在blur(图1)、os(图2、3)、looksrare(图4)上架时的不同的签名页面
通过比较,大家其实可以看出,签名看似复杂,说白了只是要传递要出售的NFT的具体信息,所以它需要包含一些交易信息,比如
出售地址(签署签名的地址)
出售的NFT详情(具体系列以及tokenid)
出售的价格(包含卖家收到的价格、支付给交易市场的交易费用、支付给项目方的费用)
如果是定向出售,还会有购买者的地址
以上这些内容并不是所有签名都必须包含的,比如如果在blur上交易就没有任何交易费用,挂单价格就是实际收到的价格;在x2y2上交易没有版税,只有0.5%的服务费,所以实收价格比挂单价少0.5%
不同交易市场对于同一个概念可能会有不同的表述方式,比如blur上称呼签署签名的地址叫做trader、os叫offerer、looks叫signer;同时不同交易市场的签名也有不同的构成方式,比如blur、os、looks这3个市场对于交易费用的设定都不同;但是不管怎么变化,需要把握的一个原则就是,如果是要出售NFT,一定会有出售价格和接收货款的地址(即签名地址),很多因为签名造成资产损失的案例中,失主进行签名的内容往往只包含了要出售的NFT以及要接收NFT的地址,没有涉及费用的表述,这就意味着要免费赠送给对方,如果这不是自己想要的操作就一定不要签署。
以下是通过os进行私人交易(出售价格为0元的一个签名信息),大家看到此类签名的时候一定要提高警惕,因为签署就意味着把自己的资产无偿赠与了对方。
要破解针对签名的种种骗局,可以从两个方面去识别
首先要认真核对签名请求的发起者和签名调用的合约是否一致,下图中,seaport就是os升级后的合约,如果签名请求的发起者不是opensea.io,就要立刻停止交易。
其次,签名前还需要仔细阅读签名内容,特别要注意核对:出售价格、接收钱款的地址以及签署的NFT是否是自己想要出售的。
最后:如果一旦误签名,要立刻取消该地址在所有平台的全部NFT挂单交易,同时立刻把全部的资产和NFT转移到安全的钱包中。
希望大家都能意识到签名中蕴含的巨大风险,认真检查每次签名,避免出现签名造成的资产损失
本文参考了 @evilcos @Wii_Mee两位老师的以下两篇文章,非常感谢两位大佬在科普web3安全知识方面不遗余力的努力,帮助很多小伙伴避免了很多坑。
如果觉得我的内容对你有帮助,欢迎关注我的推特账号和小红书账号:飞猪聊web3,获取更多web3的安全知识、基本技能和实用资讯