摘要:用途我們為什么需要批量轉幣這樣的智能合約呢大大節約轉幣的資金成本。但是使用這個批量轉幣的智能合約,一般來說,兩百次左右可以一次性操作完,那么也就是兩百次轉幣費只需要支付一次轉幣費即可。大大節約轉幣的人工成本。
一直想寫這篇教程來著,因為你會發現網絡上很少有關于批量轉幣的詳盡的教程,一些提供該工具的網站也并不會將其智能合約代碼開源出來。雖然最終我們會發現原來這個批量轉幣的智能合約原來就這么幾行代碼就夠啦,但是整個流程不明所以的話,給你這個合約代碼我相信你也是用不了的,因此對于新手來說想要寫出這個功能多少還是有不小的難度的。
批量轉幣其實也屬于空投的一種,所謂空投,筆者的理解是利用程序或者人工的方式,將代幣發放至目標賬戶。
注意:這里所說的代幣均指代的是 ERC20 Token,對于更新的代幣例如 ERC721 Token 等,由于本身就優化了這方面,因此不需要我們這樣折騰。
用途我們為什么需要批量轉幣這樣的智能合約呢?
大大節約轉幣的資金成本。很明顯,如果我們人工一次次的進行轉幣操作,那么轉個幾百次所需要的 gas 費用會讓你吃一驚。但是使用這個批量轉幣的智能合約,一般來說,兩百次左右可以一次性操作完,那么也就是兩百次轉幣費只需要支付一次轉幣費即可。
大大節約轉幣的人工成本。和支付費用成本類似,讓你手工轉個幾百次估計怕是要瘋掉了。
有足夠的需求。前面也講到,新的 ERC721 Token 等不需要我們這樣折騰,但是目前 ERC20 Token 幾乎是絕大多數代幣的模板,因此需求足夠大,也就是應用場景足夠大。
前置知識點合約調用合約
授權轉賬方法
合約調用合約要在智能合約中調用其他合約,就需要了解抽象合約的概念,具體細節可以看這里。
以本文所要講的轉幣合約為例,我們要在合約中調用 ERC20 Token 的 transferFrom 方法,那么我們首先要先創建一個 ERC20 Token 的抽象合約,代碼如下:
/** * @dev ERC20 Token abstract constract. */ contract ERC20Token { function transferFrom(address, address, uint256) public returns (bool); }
因為我們只需要用到代幣的 transferFrom 方法,因此我們只需要聲明該方法即可,注意是沒有函數體的空方法。
那么我們在批量轉幣的合約中如何進行調用呢?和大多數面向對象的編程語言一樣,我們只需要創建這個代幣合約,然后調用這個代幣合約實例的授權轉賬方法即可,代碼如下:
/** * @dev calls the ERC20 token"s transferFrom function * @param _token address The address of ERC20 token. * @param _dsts address The addresses which be air dropped. * @param _values uint256 The token values that each address will receive. */ function transfer(address _token, address[] _dsts, uint256[] _values) public payable { ERC20Token token = ERC20Token(_token); for (uint256 i = 0; i < _dsts.length; i++) { token.transferFrom(msg.sender, _dsts[i], _values[i]); } }
我們的批量轉幣代碼是不是非常簡單~可以看到,我們首先創建了 ERC20 Token 的合約實例,然后循環要轉幣的地址列表,每次遍歷中調用目標 ERC20 Token 的 transferFrom 方法即可。
這個函數可以做的更好:對于代碼邊際判斷,我們可以判斷一下 _token 以及 _dsts 是否均為合法賬戶,或者判斷一下 _values 是否均為合法正數值,又或者比較一下 _dsts 和 _values 的數組長度是否相等(健壯的代碼一定是邊際安全的)。。。是否還能完善的更好一些?當然是可以的,比如我們增加一個 Event 事件供調用者監聽以便做出相應處理。。。授權轉賬方法
那么是不是上面的這些代碼就足夠了呢?對于批量轉幣合約來說核心代碼就是這些。
但是!有個前提!
我們在使用這個合約轉幣前,需要授權給這個合約一定的代幣數額、授權給這個合約一定的代幣數額、授權給這個合約一定的代幣數額。
這里就引出了授權轉賬的概念,還是以批量轉幣為例:
首先我們需要明確,假如你擁有 1000 個 SIM 代幣,那么這些代幣就獨屬于你,沒人能拿走(別給我瞎扯什么被盜啊之類的情況,講例子的時候我們純真些。。。)那么如果你啥也不做,想要讓轉幣合約能夠轉走你的 SIM 代幣,顯然這是不可能的,因為是你擁有這些代幣,而不是轉幣合約擁有。
所以此時你就需要把自己的 SIM 代幣授權給轉幣合約,至于授權多少看你要轉多少。一旦你完成授權操作,那么轉幣合約就有權利將你的代幣進行轉賬操作了(等下,我可以之后突然改主意取消授權嗎?可以,你再次授權一次,數目為零即可。)
案例筆者之前花了點時間做了一個 Web 頁面,將批量轉幣的功能做在了上面,下面我們簡單的看下整個流程,配合示例圖會更加清晰 :)
第一步主要是獲取用戶需要批量轉賬的代幣信息,通過用戶填寫的代幣合約地址,然后獲取到基本的代幣信息。
第二步主要是獲取用戶轉幣的數目和賬戶信息,然后需要讓用戶授權相應數目的代幣給我們的轉幣合約。
第三步主要是讓用戶確認信息,并開始空投。
這是批量轉 ERC20 代幣的交易記錄:
Ropsten Transaction 0x630b868e41ecfbd97273371ed33242439230355d9110095b814ae3029b88d829
這里筆者給新手們留個作業,如果我想要批量轉 ETH 怎么辦?如果直接使用上面的代碼可不好使哦,但是思路是一毛一樣的,而且代碼上會更簡潔~
附上一個批量轉 ETH 的交易記錄:
Ropsten Transaction 0x4fcfc6245d7ffecfae7c02eb2f983f203806b83b5a1cf2fc0450a61d7c226401
哦,大家可能還會看到另外一種批量轉幣的合約代碼的寫法,代碼如下:
bytes4 id = bytes4(keccak256("transferFrom(address,address,uint256)")); token_address.call(id, msg.sender, _dsts[i], _valus[i]);
這在低版本的 Solidity 中是可以正常運行的,因為本質上和上面講的是一樣的,但在高版本中廢棄了該用法,因此筆者在嘗試高版本中使用會出現每次批量轉幣的最后一次總是會失敗。所以推薦的做法是通過抽象合約的方式進行調用其他合約的方法。
最后,希望大家在區塊鏈的世界中玩的開心~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24234.html
摘要:原文發表于以太坊智能合約開發第二篇理解以太坊相關概念很多人都說比特幣是區塊鏈,以太坊是區塊鏈。它是以太坊智能合約的運行環境。是由以太坊節點提供。以太坊社區把基于智能合約的應用稱為去中心化的應用。 原文發表于:以太坊智能合約開發第二篇:理解以太坊相關概念 很多人都說比特幣是區塊鏈1.0,以太坊是區塊鏈2.0。在以太坊平臺上,可以開發各種各樣的去中心化應用,這些應用構成了以太坊的整個生態...
摘要:以太坊是什么以太坊是一個建立在區塊鏈技術之上,去中心化應用平臺。運行環境以太坊虛擬機是以太坊中智能合約的運行環境。是由以太坊客戶端提供的是典型的開發以太坊時使用的客戶端,基于語言開發。 本文首發于深入淺出區塊鏈社區原文鏈接:以太坊是什么 - 以太坊開發入門指南原文已更新,請讀者前往原文閱讀 很多同學已經躍躍欲試投入到區塊鏈開發隊伍當中來,可是又感覺無從下手,本文將基于以太坊平臺,以通俗...
摘要:和比特幣協議有所不同的是,以太坊的設計十分靈活,極具適應性。超級賬本區塊鏈的商業應用超級賬本超級賬本是基金會下的眾多項目中的一個。證書頒發機構負責簽發撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 從比特幣開始 一個故事告訴你比特幣的原理及運作機制 這篇文章的定位會比較科普,盡量用類比的方法將比特幣的基本原理講出來...
摘要:基于以太坊項目,以太坊團隊目前運營了一個公開的區塊鏈平臺以太坊網絡。主要特點以太坊區塊鏈底層也是一個類似比特幣網絡的網絡平臺,智能合約運行在網絡中的以太坊虛擬機里。以太坊采用交易作為執行操作的最小單位。 以太坊將比特幣針對數字交易的功能進一步進行了拓展,面向更為復雜和靈活的應用場景,支持了智能合約這一重要特性。 以太坊項目簡介 以太坊:項目最初的目標是打造以個智能合約的平臺,該平臺支持...
閱讀 2649·2021-11-23 09:51
閱讀 2422·2021-09-30 09:48
閱讀 2050·2021-09-22 15:24
閱讀 1014·2021-09-06 15:02
閱讀 3308·2021-08-17 10:14
閱讀 1941·2021-07-30 18:50
閱讀 1986·2019-08-30 15:53
閱讀 3182·2019-08-29 18:43