本文讲区块链的一个重要概念 —— 授权。
本文会讲这些内容:
- 什么是授权,什么是授权额度
- 授权涉及的账户
- 怎样用区块链浏览器查询授权情况
- 怎样用Remix查询授权情况
1.什么是授权,什么是授权额度
授权就是区块链的某个账户,授权另一个账户,可以使用自己钱包中一定额度的某代币的行为;
授权额度就是授权的时候会有一个额度,这个额度随着被授权者的使用,越来越少,如果被授权者用完额度,就没有权限了;
授权用在需要其他账户操作自己账户的场景下,比如:
授权量化合约可以操作自己钱包的USDT代币,这样可以自动跑量化策略;
把自己钱包的一部分钱授权给对方的钱包账户,用于给对方付款的时候;
……
授权给对方的钱,对方可以随意操作,如果是钱包账户,则通过私钥签名转账给别人或自己,如果是合约账户,则可以通过合约的方法把钱转走或者购买其他代币。
2.授权涉及的账户
很多初学者不明白的是,授权为什么涉及到三个地址,比如:
A账户,把自己钱包的B代币,授权一定额度给C账户使用,就涉及到了三个地址,两个账户地址,和一个代币地址。
这里的账户可以是钱包账户,也可以是合约账户,这里仅仅以钱包账户来举例。
那是谁可以发起授权呢?这是很多初学者搞不清楚的第二个问题。
很多初学者认为是C账户发起交易,把A账户的钱授权给自己。
举个更确切的例子,帮助你理解:
比如,巴韭特,把自己钱包的美金,授权一个亿给我使用,如果有这样的授权,那应该是谁发起的呢?谁有权发起呢?
如果我能够发起这个授权,把别人钱包的钱授权给我使用,那是很大的bug呀,这样是不是就理解谁发起的问题了。
所以授权操作是B代币的所有者发起的,也就是由A账户发起。
3.怎样用区块链浏览器查询授权情况
在区块链浏览器上可以查看授权额度,也可以授权。
由于以太坊链上,账户是不存储数据的,数据都存储在智能合约中,所以授权的数据其实是存储在B代币的合约中的。
本文用bsc区块链浏览器示例,其他的EVM链都是类似的,但是非EVM链应该会有所不同。我们先在区块浏览器搜索B代币的合约,以USDT为例:
搜索到之后,点击Contract,可以查看源码和合约的方法:
在Contract下的Read Contract里,下面有allowance方法,就可以查看授权的额度。
这个方法有两个参数,owner是账户A的地址,spender是账户B的地址,这里查询到A授权给B的额度是0,也就是没有授权。
如果你已经授权了,那么这里就会有数字显示还剩下多少额度。
同样在Contract下,还有Write Contract选项,这个选项下面的所有方法的执行,都需要先连接钱包,因为都需要发起交易,扣除gas费。
该选项下面的approve方法,就是授权的方法,连接钱包的时候要连接账户A的钱包,spender是账户B地址,amount是授权额度。
发起请求后,会要求用私钥签名,如此就向spender授权了一定额度的B代币了。
4.怎样用remix查询授权情况
上述授权方式,是非程序员使用的方式,如果遇到没有开源的代币,而自己有代币的源代码的时候,可以使用Remix进行授权。
将源代码编译完成之后,在部署选项卡中,At Address里面填写上代币的地址:
点击At Address按钮,就可以看到Deployed Contracts下面多了一行,也就是这个地址所在的合约,展开这一行,就可以看到approve方法,它的使用方式和区块链浏览器一致。
往下拉还可以看到allowance方法,它的使用方式也和区块链浏览器一致,这里就不多讲了。
可能你会疑惑,为什么按钮有黄色,有蓝色之分,其实和在区块链浏览器的Read Contract(蓝色)和Write Contract(黄色)之分一样。
蓝色的是读方法,它不会更改区块链的数据,所以调用这一类方法是读数据,本质上并不是交易,所以无需签名,也无需付gas费。
黄色的是写方法,它会更改区块链数据,由于任何改变区块链数据的都是交易,所以调用这一类方法就是交易,需要连接钱包,需要私钥签名,也需要付gas费。
其他
对于程序员来说,自然还会在编程中用上这些方法,比如js,python,java,它们都有对应的库和客户端,可以方便的读区块链数据和发起交易,这个就在以后再讲吧。
另外要提醒的是,虽然授权很方便,但很多链上的安全隐患,都来自授权,所以授权行为要谨慎。