ERC 20 協(xié)議的產(chǎn)生(優(yōu)點(diǎn)):
- 定義統(tǒng)一的函數(shù)名:名稱、發(fā)行量、轉(zhuǎn)賬函數(shù)、轉(zhuǎn)賬事件等
- 以便交易所、錢包進(jìn)行集成
- 所有實(shí)現(xiàn)了這些函數(shù)的合約都是 ERC20Token
- ERC20 可以表示任何同質(zhì)的可以交易的內(nèi)容: 貨幣、股票、積分、債券、利息...
- 可以用數(shù)量來表示的內(nèi)容 基本上可以ERC20 表示
ERC 20 的缺點(diǎn)
以下是一個(gè)遇到很多次的場景:有一天老板過來找你(開發(fā)者),最近存幣生息很火,我們也做一個(gè)合約吧, 用戶打幣過來給他計(jì)算利息, 看起來是一個(gè)很簡單的需求,你滿口答應(yīng)說好,結(jié)果自己一研究發(fā)現(xiàn),使用 ERC20 標(biāo)準(zhǔn)沒辦法在合約里記錄是誰發(fā)過來多少幣,從而沒法計(jì)算利息(因?yàn)榻邮照吆霞s并不知道自己接收到ERC20代幣)。
ERC20 標(biāo)準(zhǔn)下,可以通過一個(gè)變通的辦法,采用兩個(gè)交易組合完成,方法是:第1步:先讓用戶把要轉(zhuǎn)移的金額用 ERC20 的approve 授權(quán)的存幣生息合約(這步通常稱為解鎖),第2步:再次讓用戶調(diào)用存幣生息合約的計(jì)息函數(shù),計(jì)息函數(shù)中通過 transferFrom 把代幣從用戶手里轉(zhuǎn)移的合約內(nèi),并開始計(jì)息。
同樣由于ERC20 標(biāo)準(zhǔn)沒有一個(gè)轉(zhuǎn)賬通知機(jī)制,很多ERC20代幣誤轉(zhuǎn)到合約之后,再也沒有辦法把幣轉(zhuǎn)移出來,已經(jīng)有大量的ERC20 因?yàn)檫@個(gè)原因被鎖死。
另外一個(gè)問題是ERC20 轉(zhuǎn)賬時(shí),無法攜帶額外的信息,例如:我們有一些客戶希望讓用戶使用 ERC20 代幣購買商品,因?yàn)檗D(zhuǎn)賬沒法攜帶額外的信息, 用戶的代幣轉(zhuǎn)移過來,不知道用戶具體要購買哪件商品,從而展加了線下額外的溝通成本。
如何解決 ERC 20 中存在的問題
使用這個(gè)ERC777:send(dest, value, data) 解決。
ERC777 使用 send轉(zhuǎn)賬時(shí)會分別在持有者和接收者地址上使用ERC1820 的getInterfaceImplementer函數(shù)進(jìn)行查詢,查看是否有對應(yīng)的實(shí)現(xiàn)合約,ERC777 標(biāo)準(zhǔn)規(guī)范里預(yù)定了接口及函數(shù)名稱,如果有實(shí)現(xiàn)則進(jìn)行相應(yīng)的調(diào)用。
即便是一個(gè)普通用戶地址,同樣可以實(shí)現(xiàn)對 ERC777 轉(zhuǎn)賬的監(jiān)聽, 聽起來有點(diǎn)神奇,其實(shí)這是通過 ERC1820 接口注冊表合約來是實(shí)現(xiàn)的。
ERC1820 如此的重要,以至于ERC777單獨(dú)把它拆出來作為一個(gè)EIP。
ERC1820合約提過了兩個(gè)主要接口:
- setInterfaceImplementer(address _addr, bytes32 _interfaceHash, address _implementer)
用來設(shè)置地址(_addr)的接口(_interfaceHash 接口名稱的 keccak256 )由哪個(gè)合約實(shí)現(xiàn)(_implementer)。 - getInterfaceImplementer(address _addr, bytes32 _interfaceHash) external view returns (address)
這個(gè)函數(shù)用來查詢地址(_addr)的接口由哪個(gè)合約實(shí)現(xiàn)。
ERC1820 是一個(gè)全局的合約,有一個(gè)唯一在以太坊鏈上都相同的合約地址,它總是?0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24
?,這個(gè)合約是通過非常巧妙的方式進(jìn)行部署的。
如果面試官問 :有沒有辦法不使用 erc 777 來解決誤轉(zhuǎn)入合約鎖死?
可以查看 erc 20 的源碼 發(fā)現(xiàn) transfer 方法如下 :
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
}
_balances[to] += amount;
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
我們在實(shí)現(xiàn)自己的erc 20 合約的時(shí)候重載?_afterTokenTransfer 這個(gè)方法 。
并且判斷 我們這個(gè)代幣 如果轉(zhuǎn)入的是合約,就要就他實(shí)現(xiàn)一個(gè)接受代幣的方法 。
這種處理方式是有 副作用的 ,比如你轉(zhuǎn)到 uniswap ,等 ,他應(yīng)該是沒有實(shí)現(xiàn)你指定的方法 。
我思考 可以參考 erc 721 的做法增加一個(gè)新的函數(shù) ,叫safexxx 來執(zhí)行轉(zhuǎn)賬的邏輯。
eth 3 種轉(zhuǎn)賬方式的區(qū)別 :
erc 20:
如果要給合約轉(zhuǎn)賬,則需先授權(quán)給合約:合約能使用多少個(gè)幣,然后才能進(jìn)行轉(zhuǎn)賬
舉例說明,如果賬戶A有1000個(gè)ETH,想允許B賬戶隨意調(diào)用他的100個(gè)ETH,過程如下:?
A賬戶按照以下形式調(diào)用approve函數(shù)approve(B,100)
B賬戶想用這100個(gè)ETH中的10個(gè)ETH給C賬戶,調(diào)用transferFrom(A, C, 10)
調(diào)用allowance(A, B)可以查看B賬戶還能夠調(diào)用A賬戶多少個(gè)token
此處的token 需要是只要符合erc20 標(biāo)準(zhǔn)的token
ERC 777
參考上面提到的 :
ERC777 使用 send轉(zhuǎn)賬時(shí)會分別在持有者和接收者地址上使用ERC1820 的getInterfaceImplementer函數(shù)進(jìn)行查詢,查看是否有對應(yīng)的實(shí)現(xiàn)合約,ERC777 標(biāo)準(zhǔn)規(guī)范里預(yù)定了接口及函數(shù)名稱,如果有實(shí)現(xiàn)則進(jìn)行相應(yīng)的調(diào)用。
ERC 2612 (ERC20 permit)
線下簽名授權(quán)文章來源:http://www.zghlxwxcb.cn/news/detail-803754.html
(授權(quán))可以在線下簽名進(jìn)行,簽名信息可以在執(zhí)行接收轉(zhuǎn)賬交易時(shí)提交到鏈上,讓授權(quán)和轉(zhuǎn)賬在一筆交易里完成。 同時(shí)轉(zhuǎn)賬交易也可以由接收方(或其他第三方)來提交,也避免了用戶(ERC20的擁有者)需要有 ETH的依賴。文章來源地址http://www.zghlxwxcb.cn/news/detail-803754.html
到了這里,關(guān)于ERC 20 優(yōu)缺點(diǎn),以及 eth 3 種轉(zhuǎn)賬方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!