智能合约之部署到公共测试网

payment

Posted by 土猪 on August 23, 2020

周末狂风,维州有三人被倒下的大树砸死,其中就有一个3岁小童,还居住在我们家附近的,真是让人伤心。如此天气,只能龟缩家中。 带家人一起看连续剧“鬼吹灯”,但是电视剧也不能总看,看多了觉得浑身乏力。于是我又去玩起了智能合约,在ganache这个模仿的本地区块链上玩感到很不过瘾,决定到以太坊的公共测试网上去玩玩。

image.png

这个用truffle framework往公共测试网上的部署过程不必详谈,网上能搜出来不少,无非是装metamask的插件,有了以太坊钱包,然后借助ropsten,注册个号,再到这个网站上去免费申请些测试用的ETH,这里提醒下,别心黑啊,申请5个就差不多了,再多,随时可能钱包里的以太币会清零,哥开始就黑了,结果莫名其妙钱包里以太就不见了,而且没有transaction,奇怪吧,于是我又申请了2个,反正够用就行了。 deploy的时候速度奇慢,还遇到问题,像account[1]之类在ganache上能识别的地址,在公网上识别不了,我研究了半天,只能填写类似’0x02C12b82BBC492978DeD4DBfDEc9FC13Ab93A743’这样的地址才管用,部署速度也很慢,整了很久才部署下去,按目前以太坊价格算,费用大约36美元。

 Pausing for 2 confirmations...
   ------------------------------
   > confirmation number: 14 (block: 8569654)

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:           0.0858848 ETH

image.png

接下来把http provider改成ropsten上注册的项目地址,把contract在json文件里相关位置填上,我以为就可以跟底下的智能合约交互了,结果类似这种交互根本行不通:

tx_hash = self.token_contract.functions.transfer(dest,amount)
        tx_hash = tx_hash.transact()

它总是告错:

ValueError: {'code': -32601, 'message': 'The method eth_sendTransaction does not exist/is not available'}

查了很多资料,有人说因为metamask上的账户没解锁,需要unlock account,但是我试了下不管用,后来终于有人说实话了,通过ropsten跟智能合约交互,不支持eth_sendTransaction,只能用eth_sendRawTransaction,就是需要用如下的方式,创建一个transaction,并且签名,才能跟公网上智能合约交互,里面的wallet_address就是metamask上选一个有以太币的账户,它的地址(公钥),wallet_private_key就是这个钱包账户的私钥。

    #for ropsten
    nonce = w3.eth.getTransactionCount(wallet_address)

    txn_dict = fund_contract.functions.release(account).buildTransaction({
            'chainId': 3,
            'gas': 140000,
            'gasPrice': w3.toWei('40', 'gwei'),
            'nonce': nonce,
    })

    signed_txn = w3.eth.account.signTransaction(txn_dict, private_key=wallet_private_key)

    result = w3.eth.sendRawTransaction(signed_txn.rawTransaction)

    tx_receipt = w3.eth.getTransactionReceipt(result)

如此就管用了,还是用metamask进行发币收币加上自己的代码一起玩,然后查看transaction,这样玩起来才爽。同时我也看看里面的很多异常处理是不是真的管用,比如这个:

image.png

还有个发现,如果智能合约的fallback函数带有nonReentrant或者它调用的函数带这个的,就是不可重入的标志,那么就无法从另外一个智能合约往它上面发以太币,只能用外部账户发送。这是我经历很多挫折才发现的。

接下来,打算再搞个智能合约,取名”hack”,就是试图去黑我部署过的那些智能合约。据说封锁又延期了,不知道要到猴年马月,慢慢玩吧。

相关文章阅读:


支付宝打赏

您的打赏是对我最大的鼓励!