http://www.7klian.com

如作甚4万名订阅者编写自动空投剧本

假如看不到此输出或呈现错误,请确保您正在运行Parity而且已完全同步。 别的,请确保帐户中有足够的以太币,用于在Ropsten测试网上陈设合约。
readFile()函数的浸染是会见airdrop.csv文件,并逐行读取它。 在每一行中,我们确保该值不为null或为空,而且还利用web3的isAddress()函数来验证通报的地点是否有效。 假如地点正确,我们会将其添加到一个数组中,该数组包括用于构建每个以太坊生意业务的已处理惩罚数据。
  console.log(`
  }
  console.log(“Retrieving logs to inform total amount of tokens distributed so far. This may take a while…”)let polytokenAddress = await polyDistribution.POLY({from:accounts[0]});
    —————————————————————
    ——— Parsing distrib.csv file ———
配置
      network_id: ‘*’, // Match any network id
      for (var i=0; i<event_data.length;i++){
    ——————————————–******** Removing beneficiaries without address data
      console.log(“ERROR:”,err);
· Fast-csv:从CSV文件读取和处理惩罚数据。
· 我们会将地点打包成多个数组,每个数组包括80个地点。为什么是80?颠末多次测试,思量到转让代币的气体本钱,这是抱负的数字。按照您要对每个条目举办的操纵,每次生意业务大概会耗费更多或更少的气体,因此您应该相应地打包条目,以使生意业务不会耗尽气体并回滚。
let allocData = new Array();function readFile() {
然后我们计较事件以及分派了几多大笔。我们可以利用该数据将其与原始文件举办较量。假如我们想花哨的话,我们也可以列出每个得到代币的地点,可能添加一个将CSV文件与事件日志数据举办较量的函数。
此刻我们已经将数据处理惩罚到一个数组中了-我们应该将名为distribData的数组包括几个数组,每个数组最多具有80个地点addresses-我们将从智能合约中为每个数组挪用airdropTokens()函数 。
        }
从理论上讲,举办空投很是简朴。 我们需要做的就是为我们收集的每个地点挪用ERC20令牌的transfer()函数。
          airdropped = airdropped.add(250 * decimalFactor);
            {

对付这个项目,我们将利用一些库和框架:
你的空投乐成了!
           allocData = [];
      host: ‘localhost’,
· PolyToken.sol是POLY代币的合约,这是一个相当牢靠的尺度ERC20代币合约。
接下来,将Polymath Distribution智能合约复制到项目标合约文件夹中。 可以在这里找到文件:https://github.com/PolymathNetwork/polymath-token-distribution/tree/master/contracts
$ npm install web3 fast-csv truffle-contract ethereumjs-testrpc  –save
  var stream = fs.createReadStream(“scripts/data/airdrop.csv”);let index = 0;
  },
      event_data = log;
    }, 
      let r = await polyDistribution.airdropTokens(distribData[i],{from:accounts[0], gas:4500000, gasPrice:gPrice});
首先,建设一个名为scripts的新文件夹,并在该文件夹中建设一个名为csv_allocation.js的新文件。该文件将包括用于运行分派进程的所有代码。
}if(polyDistributionAddress){
· 我们必需读取CSV文件并对其举办处理惩罚,以删除空缺或无效的条目。我们假设某些数据会丢失或某些地点大概会错误,因此我们确保在将它们发送到之前将其删除。
// 80 is the batch size we want to process. (How many accounts per array we want to process and send to the airdropTokens function) Can be omitted, defaults to 80.
            allocData.push(data[0]);index++;

并且,,假如您转到Etherscan并输入已陈设的PolyDistribution条约的地点,则应该看到雷同以下内容:

  let _fromNow = 60 * 5 * 1000; // Start distribution in 1 hour
      console.log(“Allocation + transfer was successful.”, r.receipt.gasUsed, “gas used. Spent:”,r.receipt.gasUsed * gPrice,”wei”);
    }
以下是有关polytoken.sol和polydribution.sol智能合约的一些值得一提的内容,这将有助于领略本教程的其余部门:
var csv = require(‘fast-csv’);
      //console.log(log);
在天天挪用它之前,我们可以做的最后一件事是会见erc20 poly token transfer()函数的事件日志,以便我们可以快速查抄有几多帐户得到了代币。
$ node scripts/csv_allocation.js 0x0… 80
  `);
if(!BATCH_SIZE) BATCH_SIZE = 80;
  `);let accounts = await web3.eth.getAccounts();let polyDistribution = await PolyDistribution.at(polyDistributionAddress);  for(var i = 0;i< distribData.length;i++){try{
$ mkdir distributionTutorial
      port: 8545,
      .on(“end”, function(){
  await deployer.deploy(PolyDistribution, _startTime);
  console.log(“Please run the script by providing the address of the PolyDistribution contract”);
    require(now >= startTime);

在本文/教程中,我将先容编写node.js剧本的进程,该剧本执行自动代币分发/空投到地点列表。我将利用Polymath代币分发进程编写的代码(这是一个很是尺度的ERC20令牌),并查抄我处理惩罚代币的自动分发而构建的剧本。
           distribData.push(allocData);
  await delay(90000);
    AVAILABLE_AIRDROP_SUPPLY = AVAILABLE_AIRDROP_SUPPLY.sub(airdropped);
    —————————————————————
$ truffle init
上面的代码将在执行truffle migrate–network ropsten时运行它将把PolyDistribution合约陈设到Ropsten(它也处理惩罚POLY Token合约的陈设),将startTime配置为5分钟后确保已正确配置了“starttime”变量,而且在达到“starttime”后实验空投,不然执行将失败。我们正在利用starttime防备人们在代币分发事件开始之前撤回代币。

  events.get(function(error, log) {
  let _now = Date.now();
打开truffle.js并将其内容替换为以下代码:
        if (!airdrops[_recipient[i]]) {
    } catch (err){
              distribData.push(allocData);
每批气体耗损量应大抵沟通。 假如有一批天然气的本钱更低,则意味着该批中的某些地点未转移代币,可能大概是因为它们之前已经转移了代币。
      gas: 3500000,
$ npm init
            }}
    ——————————————–

  },
      gasPrice: 50000000000
上面的呼吁将从您提供的助记符中生成300个帐户。 将地点复制到airdrop.csv。
    {
· 有了数组集后,我们将每个数组通报给智能合约上的airdropTokens()函数,该函数将遍历数组并为每个
订阅者挪用transfer()要领向其发送代币。
代币和代币分发的合约
    ———Performing allocations ————
let batch = 0;console.log(`
  solc: {
testrpc -m “word1 word2 word3…” -a 300
$ node scripts/csv_allocation.js 0x0…
           setAllocation();
    AVAILABLE_TOTAL_SUPPLY = AVAILABLE_TOTAL_SUPPLY.sub(airdropped);
让我们回首一下代码:
假如一切顺利,您应该在节制台上看到以下内容:

      console.log(“———- ———- ———- ———-nn”)
      network_id: ‘3’, // Match any network id
    },
通过Node.js剧本自动执行代币分发进程。
   development: {
    uint airdropped;
            if(index >= BATCH_SIZE)
           //Add last remainder batch
    ——— POLYMATH (POLY) TOKEN SUCCESSFULLY DEPLOYED ———
    optimizer: {
假如您有乐趣相识其余分派的完成方法,可以查察PolyDistribution.sol中的setAllocation()和transferTokens()函数。
      console.log(“———- ———- ———- ———-“);
          sumTokens += event_data[i].args.value.times(10 ** -18).toNumber();
我在Polymath的首要任务之一是辅佐团队拟定代币和代币分发智能合约,我们将在将来几天利用这些合约来推出POLY代币,并向
订阅该平台的4万人执行空投勾当。
    grandTotalClaimed = grandTotalClaimed.add(airdropped);
}
  let polyToken = await PolyToken.at(polytokenAddress);var sumAccounts = 0;
· truffle:它答允我们从javascript轻松编译、迁移和与我们的合约交互。
在本教程中,我们将仅存眷分发给空投吸收者的代币。从上面可以看出,这些代币的分派和转让没有行权期或悬崖期对付其他范例的分派。对付其他范例的分派,环境则差异,那些分派具有一些非凡条件,必需先满意一些非凡条件,才气转让/出售它们。
记下我们方才陈设的Poly Distribution合约的地点,稍后我们将利用它。
  });
假如我们只有很少的订阅者,则可以通过手动执行transfer()函数来完成上述操纵,可是潜在的成千上万的人但愿在启动时当即拥有其代币,逐个执行上述操纵将很是耗时。
最初我规划通过Infura运行此剧本,因此不必在当地运行全节点。这就要求离线签署生意业务记录,这是我利用最新版本的web3中的几个便捷函数完成的。不幸的是,纵然这在testrpc和Ropsten上像魔咒一样事情,在Mainnet上照旧一场劫难。生意业务没有得处处理惩罚,还极其迟钝,昂贵且不行靠。
var PolyToken = artifacts.require(‘./PolyToken.sol’);
      port: 8545,
function airdropTokens(address[] _recipient) public onlyOwnerOrAdmin {
  console.log(“Waiting 2 minutes for transactions to be mined…”)

              allocData = [];
}else{
      console.log(“Attempting to allocate 250 POLYs to accounts:”,distribData[i],”nn”);
让我们从配置项目开始:
          require(POLY.transfer(_recipient[i], 250 * decimalFactor));
};
          sumAccounts +=1;
    },
上面的代码添加了一个超时函数,因此我们给事务留出一些时间来完成对事务简直认,然后我们得到POLY代币的Transfer()事件,并通过作为PolyDistribution合约的from字段过滤事件。
let distribData = new Array();
在继承读取和处理惩罚CSV文件的代码之前,让我们将文件添加到项目中。 我们需要一个名为airdrop.csv的1列CSV文件,该文件的每个地点都有一个吸收代币的地点。 建设此文件并将其添加到scripts / data文件夹。

首先,我们导入答允我们读取文件和处理惩罚csv文件的库。
回到我们的csv_allocation.js剧本中,让我们添加须要的代码以可以或许读取airdrop.csv。 将以下代码添加到csv_allocation.js中:
就这样! 让我们实验一下剧本。 运行以下呼吁:

继承运行truffle migrate–network ropsten假如一切顺利,您应该会在节制台上看到雷同的输出:

// Where 0x0… is the address of the PolyDistribution contract we previously deployed to Ropsten.
          //console.log(`Distributed ${tokens} POLY to address ${addressB}`);}
let BATCH_SIZE = process.argv.slice(2)[1];
在表明白代币和分发合约的事情道理之后,让我们深入研究JS代码。为了使代币分派进程自动化,我们需要做一些工作:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));async function setAllocation() {console.log(`
处理惩罚代币分派
      });  stream.pipe(csvStream);
          if(isAddress && data[0]!=null && data[0]!=” ){
      host: ‘localhost’,
    ——————————————–
  readFile();
从ERC20令牌读取转移事件以验证生意业务
运行以下呼吁以配置全新项目并安装所需的依赖项:
      enabled: true,
  let _startTime = (_now + _fromNow) / 1000;
          let isAddress = web3.utils.isAddress(data[0]);
对付我们处理惩罚的每一批地点,我们都检索事件日志并打印耗费了几多气体,以确保进程乐成。
airdropTokens()的根基浸染是将250个POLY代币(凡是是ERC20代币)分发(挪用ERC20的transfer()函数)到一个地点数组中。 对付我们收到的每个地点,只要他们尚未收到分派,我们就会向他们转移250 POLY。 流程完成后,我们将更新可用的供给并跟踪已经分派了几多代币。
      })
让我们仔细看看这个函数。 JS剧本中的setAllocation()所做的只是遍历用CSV文件中处理惩罚后的数据填充的distribData数组,然后对付每个条目数组,我们继承在智能合约上执行airdropTokens(),并通报该数组。
    – Local Time: ${new Date(_now + _fromNow)}
— unlock ACCOUNT YOU WANT TO UNLOCK> — password $HOME/password.file
数据全部处理惩罚完毕并达到文件末端后,我们将挪用该函数,我们挪用函数来获取80个地点的每个数组并对它们举办处理惩罚。
到此就竣事了,感激你的耐性阅读!

module.exports = {
    for(uint i = 0; i< _recipient.length; i++)
};
      console.log(`A total of ${sumTokens} POLY tokens have been distributed to ${sumAccounts} accounts so far.`);
}
在setAllocation()函数的末端添加以下行:
然后,假如您查察代码的最后几行,将会看到我们正在会见运行剧本时通报的参数,而且假如有PolyDistribution合约的地点,我们将挪用readFile()函数。

假如您可以看到csv文件中每个帐户的transfer()事件,那么恭喜!
      gas: 3500000,
剧本执行
parity — chain ropsten — rpcapi “eth,net,web3,personal,parity” 
          airdrops[_recipient[i]] = true;
      let gPrice = 50000000000;
  var sumTokens = 0;var events = await polyToken.Transfer({from: polyDistribution.address},{fromBlock: 0, toBlock: ‘latest’});
    ——————————————–
读取CSV文件

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。