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