国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

以太坊錢包開發(fā)系列4 - 發(fā)送Token(代幣)

Honwhy / 3354人閱讀

摘要:一系列的類似的對(duì)象,如果無返回值時(shí),可以省略。表示函數(shù)聲明自己不會(huì)改變狀態(tài)變量的值。表示函數(shù)可以接收,否則表示不能。哈哈,恭喜大家,到這里這里就完整的實(shí)現(xiàn)了一個(gè)基于以太坊去中心化網(wǎng)頁(yè)錢包。

本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:[使用 ethers.js 開發(fā)以太坊Web錢包4 - 發(fā)送Token (代幣)
](https://learnblockchain.cn/20...,請(qǐng)讀者前往原文閱讀

以太坊去中心化網(wǎng)頁(yè)錢包開發(fā)系列,將從零開始開發(fā)出一個(gè)可以實(shí)際使用的錢包,本系列文章是理論與實(shí)戰(zhàn)相結(jié)合,一共有四篇:創(chuàng)建錢包賬號(hào)、賬號(hào)Keystore文件導(dǎo)入導(dǎo)出、展示錢包信息及發(fā)起簽名交易、發(fā)送Token(代幣),本文是第四篇,Token(代幣、通證)是以太坊的一大特色,既然開發(fā)錢包,則發(fā)送Token 功能必不可少。

合約 ABI 信息

首先我們需要明白,進(jìn)行Token轉(zhuǎn)賬的時(shí)候,其實(shí)是在調(diào)用合約的轉(zhuǎn)賬函數(shù),而要調(diào)用一個(gè)合約的函數(shù),需要知道合約的 ABI 信息。

其次 通常我們所說的Token, 其實(shí)指的是符合 ERC20 標(biāo)準(zhǔn)接口的合約, ERC20 接口定義如下:

contract ERC20Interface {

    string public constant name = "Token Name";
    string public constant symbol = "SYM";
    uint8 public constant decimals = 0;

    function totalSupply() public constant returns (uint);

    function balanceOf(address tokenOwner) public constant returns (uint balance);

    function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
    function approve(address spender, uint tokens) public returns (bool success);

    function transfer(address to, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);


    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

ABI 全稱是 Application Binary Interface,它就是合約接口的描述,因此有了合約的接口定義,就可以很容易通過編譯拿到ABI 信息,比如像下圖在Remix 的編譯選項(xiàng)卡就可以直接復(fù)制ABI。

生成的 ABI 描述大概長(zhǎng)這樣:

[
...
    {
        "constant": true,
        "inputs": [],
        "name": "totalSupply",
        "outputs": [
            {
                "name": "",
                "type": "uint256"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [
            {
                "name": "tokenOwner",
                "type": "address"
            }
        ],
        "name": "balanceOf",
        "outputs": [
            {
                "name": "balance",
                "type": "uint256"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    ...
]

它是一個(gè)JSON形式的數(shù)組,數(shù)組里每一個(gè)元素,都是對(duì)函數(shù)接口的描述,在外部調(diào)用合約的時(shí)候就需要遵從這個(gè)接口,以上面的接口為例,通常一個(gè)接口描述包含下述幾個(gè)字段:

name: 函數(shù)會(huì)事件的名稱

type: 可取值有function,constructor,fallback,event

inputs: 函數(shù)的輸入?yún)?shù),每個(gè)參數(shù)對(duì)象包含下述屬性:

name: 參數(shù)名稱

type: 參數(shù)的規(guī)范型(Canonical Type)。

outputs: 一系列的類似inputs的對(duì)象,如果無返回值時(shí),可以省略。

constant: true表示函數(shù)聲明自己不會(huì)改變狀態(tài)變量的值。

payable: true表示函數(shù)可以接收ether,否則表示不能。

接下來在構(gòu)造合約對(duì)象就需要是使用ABI。

構(gòu)造合約對(duì)象

ethers.js 構(gòu)造合約對(duì)象很簡(jiǎn)單,僅需要提供三個(gè)參數(shù)給ethers.Contract構(gòu)造函數(shù),代碼如下:

 var abi = [...];
 var addr = "0x...";
 var contract = new ethers.Contract(address, abi, provider);

合約的地址在合約部署之后,可以獲得,關(guān)于Token合約部署及ERC20相關(guān)的概念,這里不展開講,不熟悉的同學(xué),可以參考我另一篇文章創(chuàng)建自己的數(shù)字貨幣。

只有就可以是使用 contract 對(duì)象來調(diào)用Token合約的函數(shù)。

獲取Token余額及轉(zhuǎn)移Token 獲取Token余額

結(jié)合UI來實(shí)現(xiàn)以下獲取Token余額,UI如下:

在HTML里,定義的標(biāo)簽如下:

    
      TT Token:
      
          

對(duì)應(yīng)的邏輯代碼也很簡(jiǎn)單:

     var tokenBalance = $("#wallet-token-balance");
     // 直接調(diào)用合約方法
    contract.balanceOf(activeWallet.address).then(function(balance){
        tokenBalance.val(balance);
    });
轉(zhuǎn)移Token

轉(zhuǎn)移Token的UI效果如下:

界面的HTML代碼如下:

轉(zhuǎn)移代幣:

發(fā)送至:
金額:
發(fā)送

上面定義了兩個(gè)文本輸入框及一個(gè)“發(fā)送“按鈕,在邏輯處理部分,轉(zhuǎn)移Token代幣盡管和獲取余額類似,同樣是調(diào)用合約的方法,不過轉(zhuǎn)移代幣需要發(fā)起一個(gè)交易,因此需要測(cè)量gas 消耗。
點(diǎn)擊發(fā)送時(shí)運(yùn)行一下(關(guān)鍵)代碼:

var inputTargetAddress = $("#wallet-token-send-target-address");
var inputAmount = $("#wallet-token-send-amount");
var submit = $("#wallet-token-submit-send");

var targetAddress = ethers.utils.getAddress(inputTargetAddress.val());
var amount = inputAmount.val();

submit.click(function() {
// 先計(jì)算transfer 需要的gas 消耗量,這一步有默認(rèn)值,非必須。
    contract.estimate.transfer(targetAddress, amount)
      .then(function(gas) {

          // 必須關(guān)聯(lián)一個(gè)有過簽名錢包對(duì)象
          let contractWithSigner = contract.connect(activeWallet);

          //  發(fā)起交易,前面2個(gè)參數(shù)是函數(shù)的參數(shù),第3個(gè)是交易參數(shù)
          contractWithSigner.transfer(targetAddress, amount, {
              gasLimit: gas,
              // 偷懶,直接是用 2gwei
              gasPrice: ethers.utils.parseUnits("2", "gwei"),
            }).then(function(tx) {
                console.log(tx);
                // 介紹刷新上面的Token余額,重置輸入框
            });  
      });
}

上述有一個(gè)地方都要注意一下,在合約調(diào)用 transfer 之前, 需要連接一個(gè)signer,因?yàn)榘l(fā)起交易的時(shí)候需要用它來進(jìn)行簽名,在ethers.js API里 Wallet 是 signer(抽象類)的實(shí)現(xiàn)類。

所有會(huì)更改區(qū)塊鏈數(shù)據(jù)的函數(shù)都需要關(guān)聯(lián)簽名器,如果是視圖函數(shù)則只需要連接provider。

ethers.js 的 Contract 提供了一個(gè)非常方便方法:contract.estimate.functionName 來計(jì)算預(yù)測(cè)交易的gasLimit。

在發(fā)起交易的時(shí)候,可以提供一個(gè)可選的Overrides參數(shù),在這個(gè)參數(shù)里可以指定如交易的 gasLimit 、 gasPrice,如果我們不指定這個(gè)參數(shù)時(shí),會(huì)默認(rèn)使用 contract.estimate 獲得的值作為 gasLimit,以及 provider.getGasPrice() 的值來指定 gasPrice。

哈哈,恭喜大家,到這里這里就完整的實(shí)現(xiàn)了一個(gè)基于以太坊去中心化網(wǎng)頁(yè)錢包。

哈哈,恭喜大家,到這里這里就完整的實(shí)現(xiàn)了一個(gè)基于以太坊去中心化網(wǎng)頁(yè)錢包。

這是一條硬廣,歡迎訂閱深入淺出區(qū)塊鏈技術(shù)小專欄,目前僅需69元, 訂閱就可以查看完整源碼,還有其他驚喜哦~。
戳鏈接收看詳細(xì)的視頻課程講解。

參考文檔

Ethers.js

深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。

深入淺出區(qū)塊鏈知識(shí)星球最專業(yè)技術(shù)問答社區(qū),加入社區(qū)還可以在微信群里和300多位區(qū)塊鏈技術(shù)愛好者一起交流。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/99159.html

相關(guān)文章

  • 以太錢包開發(fā)系列4 - 發(fā)送Token(代幣

    摘要:一系列的類似的對(duì)象,如果無返回值時(shí),可以省略。表示函數(shù)聲明自己不會(huì)改變狀態(tài)變量的值。表示函數(shù)可以接收,否則表示不能。哈哈,恭喜大家,到這里這里就完整的實(shí)現(xiàn)了一個(gè)基于以太坊去中心化網(wǎng)頁(yè)錢包。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:[使用 ethers.js 開發(fā)以太坊Web錢包4 - 發(fā)送Token (代幣)](https://learnblockchain.cn/20...,請(qǐng)讀者前往...

    HmyBmny 評(píng)論0 收藏0
  • 以太錢包開發(fā)系列1 - 創(chuàng)建錢包賬號(hào)

    摘要:錢包功能一個(gè)錢包通常主要包含的功能有賬號(hào)管理主要是私鑰的管理創(chuàng)建賬號(hào)賬號(hào)導(dǎo)入導(dǎo)出賬號(hào)信息展示如以太幣余額代幣余額。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:[使用 ethers.js 開發(fā)以太坊 Web 錢包 1 - 創(chuàng)建錢包賬號(hào))](https://learnblockchain.cn/20...,請(qǐng)讀者前往原文閱讀 以太坊去中心化網(wǎng)頁(yè)錢包開發(fā)系列,將從零開始開發(fā)出一個(gè)可以實(shí)際使用的錢...

    1fe1se 評(píng)論0 收藏0
  • 區(qū)塊鏈技術(shù)學(xué)習(xí)指引

    摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個(gè)指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實(shí)應(yīng)用場(chǎng)景,想做區(qū)塊鏈應(yīng)用開發(fā),可進(jìn)一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請(qǐng)讀者前往原文閱讀 本章的文章越來越多,本文是一個(gè)索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...

    Cristic 評(píng)論0 收藏0
  • 5分鐘!用以太錢包發(fā)幣

    摘要:之前寫過一篇通過部署合約發(fā)幣的文章,整個(gè)過程比較繁瑣,今天介紹一個(gè)更加加單快速的發(fā)幣方法。直接使用以太坊錢包來發(fā)幣。 之前寫過一篇通過remix-ide部署合約發(fā)幣的文章https://www.jianshu.com/p/99f...,整個(gè)過程比較繁瑣,今天介紹一個(gè)更加加單快速的發(fā)幣方法。直接使用以太坊錢包來發(fā)幣。 一、Ethereum wallet 1、首先你需要安裝好Ethereu...

    ZweiZhao 評(píng)論0 收藏0
  • 以太錢包開發(fā)系列3 - 展示錢包信息及發(fā)起簽名交易

    本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:[使用 ethers.js 開發(fā)以太坊 Web 錢包 3 - 展示錢包信息及發(fā)起簽名交易)](https://learnblockchain.cn/20...,請(qǐng)讀者前往原文閱讀 以太坊去中心化網(wǎng)頁(yè)錢包開發(fā)系列,將從零開始開發(fā)出一個(gè)可以實(shí)際使用的錢包,本系列文章是理論與實(shí)戰(zhàn)相結(jié)合,一共有四篇:創(chuàng)建錢包賬號(hào)、賬號(hào)Keystore文件導(dǎo)入導(dǎo)出、展示錢包信息及發(fā)起簽...

    tuniutech 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<