智能合约之部署以太坊主网

把智能合约部署到以太坊测试网,感觉不够真实,如果能部署到主网去,应该很有成就感,我原来以为这个就跟往测试网部署差不多,价格估计也跟测试网上显示的差不多,就是改个配置而已,但是事实却让我大跌眼镜。

首先,需要把truffle框架中的truffle-config.js这个配置文件中增加些东西,就是以太坊主网的配置:

live: {
      provider: () => new HDWalletProvider(mnemonic, 'https://mainnet.infura.io/v3/8cf5098b0e754abbacxxxxxxf2d59d'),
      network_id: 1,       // mainnet's id
      gas: 5500000,        // Ropsten has a lower block limit than mainnet
      gasPrice: 80000000000, // 80 GWei
      confirmations: 2,    // # of confs to wait between deployments. (default: 0)
      timeoutBlocks: 200,  // # of blocks before a deployment times out  (minimum/default: 50)
      skipDryRun: true     // Skip dry run before migrations? (default: false for public nets )
    },

这个“https://mainnet.infura.io/v3/8cf5098b0e754abbacxxxxxxf2d59d”是从https://infura.io/dashboard/ethereum上面获取的,它来把我的合约部署到以太坊主网上去。

gas是我愿意为这次合约部署最高支付给矿工的以太坊的汽油,注意,是最高汽油数量,不是我最终要支付的,gasPrice就是我愿意支付的每gas的费用。这可是非常重要的,一开始我没有设置gasPrice,truffle系统给我缺省的就是20GWei,一个GWei = 1000,000,000Wei,你愿意支付的汽油费决定了你的交易有多快被矿工们打包到区块链上去,这个网站可以看得出目前的汽油费对应的打包速度:

https://ethgasstation.info/

image.png

看见没有,118 Gwei只能达到中等速度,112速度都偏慢了,但是哥穷啊,所以我只愿意支付80Gwei,慢点就慢点吧,穷人有的是时间。

我要谈谈我一开始犯的错误,我没有设置gasPrice,系统就缺省给了20gwei,结果没完没了,我就试图取消我的交易,可是,我这里看起来是取消了, 以太坊上不认可啊,上ethscan上一查,还在继续pending呢,问题是我不小心,已经两次试图部署了,就是万一成了,我得付两倍的钱,然后我想,如果我把钱从主账户上转移到别的账户上去,到时候,资金不足,没钱给矿工,交易不就自己取消了?然后我就转账,居然还是pending,这下没辙了。

上网搜了下,这种情况,部署合约的账户只能收钱,不能发钱,发就pending,于是我继续搜素,看如何能取消这几个交易。功夫不负有心人,我先搞清楚了以太坊交易的几个概念:

第一,什么是pending transaction,它就是存在交易池里,没有被矿工打包的交易,矿工要看看这个交易的主人愿意支付的费用是多少,才考虑打包的,所以不同交易优先级不一样,有钱人有限,这个世界就是这么残酷;

第二,什么是nonce,以太坊系统对一个账户发出的交易都有个序列号,这样防止双重支付,由于网络延迟,或者别的原因,一个交易可能达到节点有两次,或者发出者故意为之,那么节点只认最后收到的那个,nonce从零计数,每个交易增加一;

第三,pending transaction和nonce有啥关系,我如何利用来解决我的问题,我可以认为制造一个gasPrice高些的交易,把nonce写成前面的交易的nonce,那么节点就会用新交易来替代pending的那个;

我又看到了这个帖子,完全指导我怎么用metamask钱包来做者这个事情,就是用主账号给自己发一个eth 是0的交易,把gasPrice设置大些,这是要取消以前交易的代价,大概1-2个美刀吧,然后需要设置 这个钱包的高级功能,把nonce设置成前面交易的数字,结果成功取消了前面所有的交易。

接下来,懒惰如我,只会再次用: truffle migrate --network live 这样的命令来继续 部署。我发现,真实情况跟测试网的速度和价格完全不一样,测试网上大概5分钟全部部署完毕,而mainnet上花了约半个小时,这个我能理解,谁叫我穷呢,但是费用就大相径庭了,测试网上说0.08 ETH,而真实网上是0.30 ETH,大概108刀,是美刀! 一个引导合约,一个代币合约,还有一个应用合约。

不过,我还算幸运的,网上说有些人,几个合约部署了其中1个,接下来的失败了,整个都失败,但是钱不会归还了,所以许多人会把合约分成几个,分别部署,避免这种情况的发生。


##  Pausing for 2 confirmations...

> confirmation number: 2 (block: 10872433)

> Saving migration to chain.
>
> ## Saving artifacts
>
> Total cost:          0.28451704 ETH

# Summary

> Total deployments:   3
> Final cost:          0.30238144 ETH
Sort:  

Congratulations @chenlocus! You have completed the following achievement on the Hive blockchain and have been rewarded with new badge(s) :

You distributed more than 13000 upvotes. Your next target is to reach 14000 upvotes.

You can view your badges on your board and compare yourself to others in the Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP