首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

多个tranfer的Gas初探

有个问题,在solidity程序中,一个函数里面能够执行多少次transfer。有没有因为gas太高而失败的情况?

用https://ethereum.org/token里面的那个完整版合约,加了一个函数:

functionmulTransfer(address[] addresses)publiconlyOwner {

for(uint256i=; i

addresses[i].transfer(.1ether);

}

}

合约地址在这里:

https://ropsten.etherscan.io/address/0xd50d358f9908db9d515f94bed590f991f75e1d85

其实是一个符号为TTK,名称是TestToken的ERC20代币

然后准备往合约里面充ether,就用metamask直接向合约地址发送ether,发现报错(这里只是为了复现当时的错误就只设置了0.1eth):

Transaction Error. Exception thrown in contract code.

那就调用合约里面有payable的函数吧,发现只有buy函数才有payable(buy函数是指调用这个函数的人用ether来买TTK代币),那就先设置sellprice和buyprice吧(TTK代币和ether之间的兑换比例)。设置完了,直接然后就调用buy,结果报错。因为初始化的时候把所有的token都转给了owner了,那先用owner地址去调用transfer函数,把部分TTK代币转到合约地址下面。

最后终于给这个合约转入了18ether。

然后我用owner地址去调用mulTransfer函数,先输入了15次同一个地址,成功执行:

上面Gas Limit和Gas Price的数值都是按照metamask默认推荐的,一般metamask会根据当前以太坊网络中排队的待处理的交易量会推荐gas付多少比较稳妥。Gas Price可以理解为每计算一步骤需要花费多少以太坊(这里是53Gwei以太币),Gas Limit可以理解为你估计你调用的这个函数需要计算多少步骤(这里我估计这个函数需要计算的步骤会小于240715),当然这只是一个不准确的说法。

可以看到,实际上Gas Used By Txn也就是可以理解为计算步骤是158286。乘上Gas Price,得出实际矿工费花了0.008389158 ETH。所以你实际只支付了0.008389158ETH。

我把这个transfer数量提高到102呢?

myetherwallet这个在线钱包估计要955843Gas Limit。

然后metamask估计要1433764 Gas Limit,也就是他们对执行这个函数需要的步骤数目各有各的想法。按照metamask的来,直接点submit。

最后执行成功:

花了953652 * 53 Gwei的矿工费。

有上面可以看出,100个以内的transfer是没问题,只是要执行的步骤多一些,大概是每个transfer需要10000个Gas Limit。也就是可以理解为每个transfer需要运行10000个步骤。100以上的transfer就不知道了,因为需要输入100次地址,累。

我想试试一个函数里面有1000个transfer会怎样?

pragmasolidity^.4.23;

contracttest{

function() payablepublic{

}

functionmulTransfer(uint256amount)public{

for(uint256i=; i

}

}

}

所以部署了一个这样的合约。。。。

https://ropsten.etherscan.io/address/0xf67b1e7c73c07ba2fc11e256d73a04bf84a4f60b

合约里面有个没有函数名的函数,就可以直接转账了。转了5ether,准备搞事。

我调用multransfer函数,输入1000次,也就是要transfer 1000次,发现

所以根据4657577是其最大的UNITS,我觉得我可以试一试450次转账。。。

450次的好像成了,但是一直在pending。。。

https://ropsten.etherscan.io/tx/0x62fdb8fa34ee91fe5e07f304a59697afb0aa833aa3b96254e85d9d4d2f3be266

450次的出来了:

实际才用了3423309 Gas Limit。平均下来一个transfer用了7607Gas Limit。

可能这个函数里面输入的数少。不然前面实验是需要10000Gas Limit的。

我试了试600:

Gas Limit默认推荐-1,肯定是出问题了

通过不断尝试,发现,myetherwallet这里,这里他们仅支持4百万以内的Gas Limits,通过他们对Gas Limit的估计,最大就是526次transfer了。我输入527,就跳到-1了。

最大就是526了,也就是支持526次transfer。

我就试试这个526

好像没毛病,用了3997793。我试试更大的。

大杀器:580次transfer:

https://ropsten.etherscan.io/tx/0xc3381c848a233eba7209b7629edfc145c1f1610aa9d62b82a8a028f7ddf782f9

本来想把结果贴上来的,等了10分钟还在pending,不等了,所以大概就是500多次transfer是极限了。

突然有个问题,那些要对几十万个地址进行空投的token,是怎么实现的。。。难道人工点击几千次?还是搞了个python脚本?而且发送token的步骤要比直接调transfer多,当然不清楚到底哪个更加费gas。python脚本的话会把秘钥写在脚本内。要发token必须要联网。so,你能够找到那些项目方的服务器,去找找他们的脚本,可能有意外惊喜~

最后,我发现一个傻逼的事情,我没有设置一键提款的函数,导致这些钱只能通过multransfer函数来提出来,但是一次只能提0.001eth * amout,amout又不能太大,只能500左右。gas又占了0.2eth左右。。。

所以我还是调用了很多次multransfer。。。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180507G190OL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券