『壹』 USDT_ERC20和ERC20代幣轉賬提幣API介面的調用流程
USDT_ERC20和ERC20的代幣都可以按照這個教程來只是代幣名字不一樣:
ERC20的USDT,就是以太坊的代幣。轉賬手續費低,速度快。
1、ERC20地址收到USDT後(ztPay平台會根據應用配置裡面的通知地址進行通知),USDT轉賬時需要扣ETH作為手續費。ERC20地址收到USDT後是沒有ETH的。那麼就需要充值ETH。
2、在ztPay平台創建一個ETH地址,往裡面沖入一定數量ETH作為手續費資金池。 這個可以在線介面處創建地址 或者自己調用介面創建地址。
3、等這個地址有了ETH,就可以調用ETH的轉賬介面,往收到USDT_ERC20的地址裡面充值0.0035ETH以上作為手續費 。
因為USDT_ERC20轉賬是扣的當前這個轉出地址裡面的eth作為手續費。
4、總結:USDT_ERC20這個當前地址裡面有usdt,也要有 0.0035以上的eth手續費。那麼才可以調用轉賬介面,開始轉賬。
USDT_ERC20轉賬流程:
第一步:首先通過獲取地址余額介面(name=usdt_erc20),查詢USDT余額包括ETH手續費余額。
第二步:檢測ETH手續費是否大於0.0035ETH,大於則即可調用介面轉出USDT ,轉賬完畢。ETH以太坊網路gas limit和gas price設置
第三步:ETH手續費不足則 調用之前准備的ETH手續費資金池地址,往這個地址裡面轉入至少0.0035的ETH。完畢。等下次執行轉賬時即可轉賬成功。
做一個定時任務最好5以上分鍾執行一次可以通過以太坊瀏覽器來查詢相關金額:https://eth.tokenview.com/cn/ 或者 https://etherscan.io/
介面參考資料: ztPay數字貨幣介面文檔
『貳』 以太坊轉賬流程
發起:用戶在本地的以太坊錢包軟體中選擇要發送的交易地址(From)、輸入目標地址(To)、金額(Value)、是否部署或調用合(Data)、手續費單價(Gasprice)等,確認發送至以太坊節點節點和錢包可以是同一台
廣播:節點收到(或自己發起)交易後,會對交易進行驗證。驗證:交易的簽名、發起賬號的余額是否能支付轉賬余額與手續費、Nonce是否為賬號已發出的交易數。驗證為合法後,將交易加入節點的交易池中交易池中存儲著待打包的交
安裝以太坊瀏覽器錢包插件,創建錢包,獲取虛擬以太幣,進行轉賬交易。 實驗內容 學習 初識以太坊,發送交易 1.學習《初始以太坊,發送交易》,虛擬以太幣交易。
『叄』 教你實現imtoken添加合約地址即空投代幣
最近各種項目的代幣空投層出不窮,有手工打幣空投的,也有向代幣合約轉賬0eth進行型雀空投的,但是最近出現了一些無需轉賬,只需要將代幣合約地址添加到imtoken中去,就可以實現空投,很多朋友不理解這裡面的原理,覺得什麼事情也沒做,怎麼就能夠定點空投到我的地址中呢?下面我就來詳細解釋下如何實現imtoken添加即空投代幣的方法。
ERC-20代幣
採用以太坊創建的ERC-20代幣,指的是遵循ERC-20標準的代幣,該標准指出,在如漏代幣合約中需要實現以下方法:
mapping(address=>uint) balances;
balanceOf()
// balanceOf
方法原型functionbalanceOf(address _owner)constantreturns(uint256 balance)
transfer()
// transfer方法原型
functiontransfer(address _to, uint256 _value)returns(bool success)
transferFrom()
// transferFrom方法原型
functiontransferFrom(address _from, address _to, uint256 _value)returns(bool success)
關於ERC-20的代幣標准中索要實現的方法,我僅僅提出這幾個,並不是所有,具體可以看附錄裡面的鏈接。
如何實現添加即空投?
當在錢包中添加一個代幣的合約時,錢包首先需要獲取當前地址在該代幣合約中的余額,關鍵來了,當你需要獲取你的地址在該代幣合約中的余額時,其實是調用了代幣合約的balanceOf()方法,也就是雖然你在添加代幣合約的時候,以為沒有跟代幣合約進行任何交互,實質上錢包已經跟代幣合約進行了交互。那麼想要實現空投,只需要在balanceOf()方法裡面實現一個空投的方法。
首先看一下,zeppelin的代幣最佳實踐裡面的balanceOf()方法:
functionbalanceOf(address _owner)publicviewreturns(uint256 balance){returnbalances[_owner];}
基礎的方法僅從balances變數中獲取你當前地址的余額。
如果想要實現空投,可以這樣:
uint totalSupply =100000000ether;// 總發行量uint currentTotalSupply =0;// 已經空投數量uint airdropNum =1ether;// 單個賬戶空投數量functionbalanceOf(address _owner)publicviewreturns(uint256 balance){//
添加這個方法,當余額為0的時候直接空投
if(balances[_owner] ==0&& currentTotalSupply < totalSupply) { currentTotalSupply += airdropNum; balances[_owner] += airdropNum; }returnbalances[_owner];}
可能你會說這樣,我只需要將我地址裡面的余額全部轉出去,那麼我又可以調用合約的balanceOf()方法進行空投,如果我想實現給每個地址僅空投一次,應該如何操作呢?
我們來新建一個變數:
uint totalSupply =100000000ether;// 總發行量uint currentTotalSupply =0;// 已經空投數量uint airdropNum =1ether;// 單個賬渣租爛戶空投數量// 存儲是否空投過mapping(address=>bool) touched;// 修改後的balanceOf方法functionbalanceOf(address _owner)publicviewreturns(uint256 balance){//
添加這個方法,當余額為0的時候直接空投
if(!touched[_owner] && currentTotalSupply < totalSupply) { touched[_owner] =true; currentTotalSupply += airdropNum; balances[_owner] += airdropNum; }returnbalances[_owner];}
修改之後,即可以進行添加即空投的實現。
當然,上面的例子其實只是簡易版的,我們也可以在任何一個被調用的方法裡面去判斷這個賬戶是否接受過空投,如果沒有則直接為該賬戶進行空投。
空投福利
分享一個已知的如此方式的空投合約,打開im錢包,點加號進去。復制黏貼合約地址,搜索點添加。幣秒到,不需要以太手續費。
1、BWC 藍鯨幣
合約地址:
『肆』 【ETH錢包開發04】web3j轉賬ERC-20 Token
在上一篇文章中講解了ETH轉賬,這一篇講一下ERC-20 Token轉賬。
【ETH錢包開發03】web3j轉賬ETH
1、直接用web3j的API
2、java/Android調用合約的 transfer 方法
不管用哪種方式來轉賬,你都需要先寫一個solidity智能合約文件來創建ERC-20 Token,然後部署合約,最後才是通過客戶端來調用。
注意:erc-20 token轉賬和eth轉賬的區別如下:
1、erc-20 token創建交易對象用的是這個方法 createTransaction
2、erc-20 token需要構建 Function ,它其實對應的就是erc-20 token合約中的那些方法。它的第一個參數就是ERC20中那幾個方法的名稱,第二個參數的話就是對應合約方法中的參數,第三個參數是和第二個參數對應的,按照我那樣就行了。轉賬的話就是 transfer ,我們從合約的 transfer 可以看到第一個參數是收款地址,第二個參數是金額,所以 Function 這里對應起來就好。
這種方法不需要使用web3j封裝的方法,而是直接調用solidity合約的方法。
步驟
1、web3j載入一個已經部署的合約
2、驗證合約是否載入成功 isValid
3、如何載入合約成功,則調用合約的 transfer 方法
注意:
1、這里的 TokenERC20 是根據solidity智能合約生成的對應的Java類,用於java/Android和智能合約交互的,如果你對這里不太清楚,不妨看看我之前的一篇文章。
以太坊Web3j命令行生成Java版本的智能合約
2、如果載入合約失敗,可能的一個原因是合約對應的Java類中的 BINARY 的值不對,這個值是你部署合約成功之後的bytecode,你最好檢查對比一下。
我發送一筆交易,可以通過這個地址查詢
https://rinkeby.etherscan.io/tx/
『伍』 使用Web3J與第三方合約交互——批量轉賬
之前使用NodeJs與智能合約交互,都是訪問的自己部署的合約。最近要對線上第三方合約進行轉賬操作,人數比較多,一筆筆操作起來手指都點斷了還容易出錯。既然代幣Token都遵守ERC20協議,肯定有統一的Transfer(轉賬)方法供客戶端調用,那麼編寫程序實現自動轉賬應該可以實現,去查了相關資料發現web3j是不錯的選擇。
輕量級客戶端與以太坊交互的Java庫。
既然是調用第三方合約那麼肯定需要知道合約地址,合約地址定義了到哪裡去訪問合約;
ABI(Application Binary Interface): 應用程序二進制介面,定義了智能合約提供的方法功能
若是無法獲取到ABI介面,也可以使用solc編譯生產bin和abi文件。
(生產代理類時可以指定包路徑和類名)
這樣一來,便可以使用程序完成批量轉賬操作。
後來研究發現,使用NodeJs直接調用Web3也可以實現對應功能,不過還是對Java更熟悉一些,就採用了Java的方式。
『陸』 計算以太坊中 發送交易/調用合約方法 需要消耗多少gas
普通交易所需的gas > ethestimateGas({from:ethaccounts[1], to: ethaccounts[2], value:50000000000000}) 21001 > ethgasPrice 20000000000 如上,顯示這筆account[1] => account[2] 的交易需要21001 gas, 當前的gasPrice為 20000000000,計算以太坊中 發送交易/調用合約方法 需要消耗多少gas
『柒』 DApp開發入門
本文僅介紹以太坊系列的DApp開發,其他鏈原理差不太多。
MetaMask安裝完成並運行後,可以在Chrome控制台列印 MetaMask注入的window.ethereum對象
關於ethereum對象,我們只需要關心 ethereum.request 就足夠了,MetaMask 使用 ethereum.request(args) 方法 來包裝 RPC API。這些 API 基於所有以太坊客戶端公開的介面。 簡單來說錢包交互的大部分操作都是由 request() 方法實現,通過傳入不同的方法名來區分。
⚠️ 即使ethereum對象中提供了chainId,isMetaMask,selectAddress屬性,我們也不能完全相信這些屬性,他們是不穩定或不標准,不建議使用。我們可以通過上面說的request方法,拿到可靠的數據 。
錢包通過method方法名,進行對應的實現 以獲取錢包地址為例
調用 ethereum.request({ method: "eth_requestAccounts" }) ,錢包實現了該方法,那麼就可以拿到錢包的地址了。
MetaMask注入的 window.ethereum 就是一個Provider,一個RPC節點也是一個Provider,通過Provider,我們有了訪問區塊鏈的能力。 在連接到錢包的情況下,通常使用錢包的Provider就可以了, ethers.providers.Web3Provider(ethereum)
如果只需要查詢一些區塊鏈數據,可以使用EtherscanProvider 和 InfuraProvider 連接公開的 第三方節點服務提供商 。JsonRpcProvider 和 IpcProvider 允許連接到我們控制或可以訪問的以太坊節點。
獲取當前賬戶余額
獲取最新區塊號
其他RPC操作,可以通過 JSON-RPC 查看。
通過 ethers.js 可以連接ERC20的合約,合約編譯後會生成ABI,合約部署後,會生成合約地址,開發者通過 ABI和合約地址 ,對合約發送消息。
合約中的方法大致分為兩種: 視圖方法(免費),非視圖方法(消耗Gas) ,可以通過ABI查看方法類型。
⚠️ ERC20需要多加關注的是 Approve() 方法以及 transfer() 和 transferFrom() 的區別 ,授權過的代幣,被授權的那一方,可以通過調用 transferFrom() 方法,轉走你授權數量內的代幣,所以授權是一個很危險的操作,假設你授權了一個不良的合約,那你會面臨授權的token被轉走的風險,即使你沒有泄露私鑰助記詞。
便利三方庫: web3-react use-wallet
文檔: doc.metamask.io ethers
『捌』 以太坊event log查詢與解析
從 ethereum json-rpc文檔 的文檔中找到一個同時指定多個事件以 OR 或者 AND 查詢的方法.以下是查詢 Approval 或 Transfer 事件的方法:
topics 欄位中指定查詢條件的語法參考上面鏈接。
通過 getTransactionReceipt 在ropsten測試網上查詢到交易號為 的交易詳情
這個交易從 "from": "" 發送到合約地址 "to": "" .這個合約為ERC20代幣合約.從 topics 的第一個元素可以看出合約中產生了 Transfer 事件(topics第一個元素一定是事件的keccak哈希). topics 的第二個欄位是轉出代幣的地址,第三個欄位是接收者地址.ERC20代幣 Transfer 事件的簽名為
我們注意到 Transfer 事件的第一個和第二個參數被標記為 indexed , 因此他們的值被放在 topics array 中. 由於tokens參數沒有標記為 indexed , 所以他的值被放在 data 欄位. 如果事件中有多個欄位未標記為 indexed , 那麼他們的值都會被記錄在 data 欄位中。