服務項目

需求溝通

go 開發代幣

  ERC-20是一門使用智能合約在代太坊區塊鏈實現Tokens的技術,20是分配給此請求的號碼。 在以太坊區塊鏈上發行的絕大部分代幣均符合ERC-20標準。 根據Etherscan.io 顯示,截至目前為止,在以太坊主網絡上共發現了147762個ERC-20代幣Token。

  ERC-20為更大的以太坊生態系統中的以太坊Token定義了一個通用的規則列表,允許開發人員準確預測令牌之間的交互。 這些規則包括如何在地址之間傳輸令牌以及如何訪問每個令牌中的數據。

  目前,Ether不符合ERC-20標準。 需要ERC-20合規交易的協議已經創建了包裹的以太幣Token作為ETH的占位符。 這些“WETH”代幣存放在一個單獨的智能合約中,并以1:1的方式與以太網掛鉤。

  1.ERC-20的歷史由來

  ERC-20于2015年11月19日由Fabian Vogelsteller提出。 它定義了以太坊Token必須實現的常見規則列表,使開發人員能夠編程新Token在以太坊生態系統中的運作方式。 ERC-20令牌標準因為部署簡單,以及與其他以太坊Token標準互操作的潛力,開始受到從事數字貨幣產品(ICO)眾籌公司的歡迎,

  2.應用

  截至目前,有超過147762份ERC-20Token合約在以太坊區塊鏈網絡上運行。最成功的ERC20Token銷售包括EOS,Filecoin,Bancor,Qash和Bankex,已經籌集到大量的資金。

  3.函數

  ERC-20令牌具有以下與方法相關的功能:

  獲取Token代幣總量

  totalSupply() public view returns (uint256 totalSupply)

  獲取具有相應合約地址上的的帳戶的帳戶余額

  balanceOf(address _owner) public view returns (uint256 balance)

  將一定數量的Token代幣發送到地址給其他接收轉賬地址

  transfer(address _to, uint256 _value) public returns (bool success)

  從地址_from到地址_to發送_value數量的Token代幣

  transferFrom(address _from, address _to, uint256 _value) public returns (bool success)

  允許_spender多次退出您的帳戶,最多為_value金額。 如果再次調用此函數,它將使用_value覆蓋當前允許值

  approve(address _spender, uint256 _value) public returns (bool success)

  返回仍然允許_spender從_owner中退出的數量

  allowance(address _owner, address _spender) public view returns (uint256 remaining)

  事件格式

  轉移Token時觸發

  Transfer(address indexed _from, address indexed _to, uint256 _value)

  每當批準(地址_spender,uint256 _value)被調用時觸發

  Approval(address indexed _owner, address indexed _spender, uint256 _value)

  二.ERC20代幣賬戶地址生成

  由于現在很多代幣都沒有在BIP44上注冊相應的序號,因此現在的大多數錢包開發ERC20代幣生成地址時,都使用以太坊的賬戶地址方式生成ERC20代幣的地址。我們這里和正式錢包開發不一樣,咱們將用嚴格的地址生成方式生成ERC20代幣的地址。有關BIP44協議部分內容請看面的章節,這里不再做重復的介紹。

  下面是封裝好的一個生成ERC20地址的函數

  function erc20Address(seed, bipNumber, number, coinMark) {

  if(!seed || !number) {

  console.log("input param seed, coinNumber and number is null")

  return paramsErr;

  }

  var rootMasterKey = hdkey.fromMasterSeed(seed);

  var childKey = rootMasterKey.derivePath("m/44'/" + bipNumber + "'/0'/0/" + number + "");

  var address = util.pubToAddress(childKey._hdkey._publicKey, true).toString('hex');

  var privateKey = childKey._hdkey._privateKey.toString('hex');

  var erc20Data = {coinMark:coinMark, privateKey:privateKey, address:"0x" + address}

  return erc20Data;

  }

  函數說明:seed是隨機種子的Buffer流,bipNumber對BIP44協議上規定的代號,number對應第幾個賬戶,0表示第一個服務器,coinMark幣的標識,例如LET。

  三.ERC20代幣轉賬簽名

  以下是封裝好的一個ERC20交易簽名,上述代碼中包含了單個ERC20交易簽名和批量ERC20交易簽名,代碼中使用到了ethereumjs-tx這個開源庫。

  const transaction = require( 'ethereumjs-tx');

  const paramsErr = {code:1000, message:"input params is null"};

  var libErc29Sign = {};

  function addPreZero(num){

  var t = (num+'').length,

  s = '';

  for(var i=0; i<64-t; i++){

  s += '0';

  }

  return s+num;

  }

  這個函數是單個ERC20代幣交易簽名函數,privateKey是私鑰;nonce交易nonce,標識每一交易;currentAccount當前要轉賬的賬戶地址;contractAddress代幣的合約地址;toAddress數字貨幣轉入地址;gasPrice和gasLimit倆個相乘代表手續費;totalAmount轉賬金額, decimal代幣單位換算。

  function ethereumErc20CoinSign(privateKey, nonce, currentAccount, contractAddress, toAddress, gasPrice, gasLimit, totalAmount , decimal) {

  if(!privateKey || !nonce || !currentAccount || !contractAddress || !toAddress || !gasPrice || !gasLimit || !totalAmount || !decimal) {

  console.log("one of param is null, please give a valid param");

  return paramsErr;

  }

  var transactionNonce = parseInt(nonce).toString(16);

  var gasLimits = parseInt(90000).toString(16);

  var gasPrices = parseFloat(gasPrice).toString(16);

  var txboPrice = parseFloat(totalAmount*(10**decimal)).toString(16)

  var txData = {

  nonce: '0x'+ transactionNonce,

  gasLimit: '0x' + gasLimits,

  gasPrice: '0x' +gasPrices,

  to: contractAddress,

  from: currentAccount,

  value: '0x00',

  data: '0x' + 'a9059cbb' + addPreZero(toAddress.substr(2)) + addPreZero(txboPrice)

  }

  var tx = new transaction(txData);

  const privateKey1 = new Buffer(privateKey, 'hex');

  tx.sign(privateKey1);

  var serializedTx = tx.serialize().toString('hex');

  return '0x'+serializedTx;

  };

  下面函數是批量ERC20交易簽名,下面函數將參數JSON化,參數的意義和上面的函數一致。

  function MultiEthereumErc20CoinSign(erc20SignData) {

  var outErc20Data = [];

  if(erc20SignData === null) {

  console.log("erc30SignData param is null, please give a valid param");

  return paramsErr;

  }

  var calcNonce = Number(erc20SignData.nonce);

  for (var i = 0; i < erc20SignData.signDta.length; i++){

  var transactionNonce = parseInt(calcNonce).toString(16);

  var gasLimit = parseInt(120000).toString(16);

  var gasPrice = parseFloat(erc20SignData.gasPrice).toString(16);

  var totx = parseFloat((erc20SignData.signDta[i].totalAmount)*(10**(erc20SignData.decimal))).toString(16);

  var txData = {

  nonce: '0x'+ transactionNonce,

  gasLimit: '0x' + gasLimit,

  gasPrice: '0x' +gasPrice,

  to: erc20SignData.contractAddress,

  from: erc20SignData.currentAccount,

  value: '0x00',

  data: '0x' + 'a9059cbb' + addPreZero((erc20SignData.signDta[i].toAddress).substr(2)) + addPreZero(totx)

  }

  var tx = new transaction(txData);

  const privateKey1 = new Buffer(erc20SignData.privateKey, 'hex');

  tx.sign(privateKey1);

  var serializedTx = '0x' + tx.serialize().toString('hex');

  outErc20Data = outErc20Data.concat(serializedTx)

  calcNonce = calcNonce + 1;

  }

  return { signCoin:"ERC20", signDataArr:outErc20Data}

  };

文章標簽:
文章評論:

專業的游戲開發/系統開發、品牌設計/網站建設,選仟源!

選擇專業的企業服務公司,服務更靠譜!

立即點擊咨詢>
客服圖標
客服圖標
118旺角心水论坛