主页 > imtoken钱包国际版下载 > Python 与以太坊智能合约交互

Python 与以太坊智能合约交互

imtoken钱包国际版下载 2023-10-16 05:11:09

之前写过基于DYDX闪贷的Cofix与Uniswap套利,只要说明了套利合约中的逻辑以及涉及到的各种合约(cofix、weth、dydx、uniswap)的调用方式即可。 套利机会很少,谁也看不起。 需要一个可以自动查询和发送交易的程序。

先说说为什么选择python,因为简单。 之前用swift(iOS)和以太坊交互以太坊套利,很恶心。 . . Python 需要使用库 web3.py。 文档:github:

需要做一个轮询脚本

之前写过基于DYDX闪贷的Cofix与Uniswap套利,只要说明了套利合约中的逻辑以及涉及到的各种合约(cofix、weth、dydx、uniswap)的调用方式即可。 套利机会很少,谁也看不起。 需要一个可以自动查询和发送交易的程序。

思路

graph LR
A[套利脚本] -- 生成 --> B((触发套利合约的交易))
B((触发套利合约的交易))--查询是否有套利空间-->C[以太坊]

脚本需要实现的是始终检查是否存在套利机会,如果存在则发起交易。

上码

以太经典和以太坊算力差别_以太坊套利_以太坊与以太基金

https://github.com/MLY0813/SwapCofixAndUni/tree/main/CofixAndUni

一、配置

SETTING = {
    "ROPSTEN_URL": "XXX",
    "MAINNET_URL": "XXX",
    "CONTRACT_ADDRESS": "XXX",
    "WALLET_PRIVATEKEY": "XXX",
    "WALLET_ADDRESS": "XXX",
    "ETH_SPAN": [1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900]
}

以太坊套利_以太经典和以太坊算力差别_以太坊与以太基金

2.交易w3节点对象必须的方法和对象

w3 = Web3(Web3.HTTPProvider(SETTING["MAINNET_URL"]))

发送交易方法封装

def sendTransation(tx_dic):
    nonce = w3.eth.getTransactionCount(SETTING["WALLET_ADDRESS"])
    tx_dic["nonce"] = nonce
    tx_dic['gasPrice'] = w3.eth.gasPrice
    sign_tx = w3.eth.account.signTransaction(tx_dic, private_key=SETTING["WALLET_PRIVATEKEY"])
    return w3.eth.sendRawTransaction(sign_tx.rawTransaction)

以太坊套利_以太经典和以太坊算力差别_以太坊与以太基金

def sendTransationWithMoreGas(tx_dic, gwei): nonce = w3.eth.getTransactionCount(SETTING["WALLET_ADDRESS"]) tx_dic["nonce"] = nonce tx_dic['gasPrice'] = w3.eth.gasPrice + w3.toWei(gwei, 'gwei') sign_tx = w3.eth.account.signTransaction(tx_dic, private_key=SETTING["WALLET_PRIVATEKEY"]) return w3.eth.sendRawTransaction(sign_tx.rawTransaction)

sendTransation 和 sendTransationWithMoreGas 的区别在于前者使用默认的gasprice(均价),而后者在均价的基础上按需增加。

交换合约.py

主要包括套利合约的ABI,拼接调用initiateFlashLoan方法的交易。 “initiateFlashLoan”是触发套利合约套利的方法。

def initiateFlashLoan(ethAmount):

以太坊与以太基金_以太经典和以太坊算力差别_以太坊套利

tx_dix = contractObj.functions.initiateFlashLoan(ethAmount).buildTransaction({ 'from': SETTING["WALLET_ADDRESS"], 'gas': 1200000 }) return tx_dix

主程序

轮询方式主要在main函数中实现,这里使用了以太坊机制“estimated gas”。 套利合约需要检测是否有套利空间。 cofix 和 uniswap 都有非常复杂的交易计算。 不需要在脚本中完全模拟双方的交易计算来判断是否有套利空间,是否需要发行交易。 estimateGas 可以预估套利交易的gas消耗量(不允许,仅供参考)。 我们其实想知道的是有没有套利的空间,因为套利合约里已经判断了资金的多少。 因此,可以假设estimateGas返回数据正常以太坊套利,说明此时有套利空间,反之则说明没有套利空间。 在代码中使用 try 来捕获异常,以确定何时发起事务。

        for num in SETTING["ETH_SPAN"]:
            now = int(time.time())
            timeArray = time.localtime(now)

以太经典和以太坊算力差别_以太坊套利_以太坊与以太基金

tx_dic = initiateFlashLoan(w3.toWei(num, "ether")) try: tx_dic_gas = w3.eth.estimateGas(tx_dic) except ValueError: print("unlucky", time.strftime("%Y--%m--%d %H:%M:%S", timeArray)) else: print("success") sendTransationWithMoreGas(tx_dic, "2") time.sleep(20)

本文参与登联社区写作激励计划,好文章好收益,欢迎正在阅读的你加入。