Python 利用 Web3.py 实现 ETH 及代币转账的详细教程

尊敬的读者朋友,今晚我们将探讨如何安装Web3.py。作为踏入区块链技术领域之门的基石,Web3.py旨在为Python程序员提供丰富的以太坊区块链交互功能接口,让大家得以直接以Python编写区块链应用程序,仿若成为科技尖端的神秘黑客。事实上,此库的配置犹如套用标准Python软件包般简便,您只需运行终端或命令提示符,键入数行相应指令即可瞬间完成Web3.py的安装。这一过程在您眼中或许奇迹般的快捷,实则平凡至极。

成功安装Web3.py后,您将有机会深入研究以太坊领域。利用其功能,您可执行交易、检索区块链信息,乃至自行研发去中心化应用程序(DApps)。在这个过程中,或许会遇到种种困难与挑战,但只要坚定决心,敢于尝试,相信您定能收获满满。

pip install web3.py

注册节点服务:开启你的区块链之旅

Web3.py已安装完毕,接下来您需进行节点服务器注册,该操作方便快捷,仅需提供电子邮件即可完成。一旦注册成功,您便可立即创建项目并获取以太坊节点服务。此刻,您是否感受到正站在区块链世界的入口处呢?

在设置界面内,您将找到与区块链交互的链接地址。此URL分别对应主网或测试网,两者各司其职。主网为实际应用场景,保障真实可信;而测试网则专用于模拟操练及检测。无论您选择哪种网络,均可获得一对链接,其中一条采用HTTPS协议,另一条则支持其他协议。请根据需求选取合适的链接,即可开启您的区块链探索之旅!

代码示例:让你的区块链梦想成真

现已具备齐备之工具与资源,此刻即可投入代码编写之旅!不必忧虑,本文将提供简易示例代码以助您迅速入门。首要步骤为引入Web3.py库,犹如翻开魔法宝典蓄势待发。然后利用先前获取的URL接入区块链网络,此举如同开启通向全新领域的门户。

在连线成功后,您即可进行交易、查看余额及部署智能合约等操作。试想,一行代码即可对区块链数据产生直接而深远的影响,犹如超级英雄降临人间。请留意每日十万个免费请求次数,尽情探索区块链世界。然而,资源有限,请谨慎使用,珍视每一次宝贵机会。

总结与展望:你的区块链未来

好了,各位挚友,在安装Web3.py、注册节点以及编写代码的过程中,我们已一同迈向了区块链领域。您是否觉得自身已经具备踏入这个无限可能空间的基础技能?请铭记,此乃是第一步,区块链世界浩瀚无穷,前方还有无数未知等待着您去发现与学习。愿您能继续钻研,揭示其深层内核,打造更为精妙复杂的应用程序。

请问您是否已经做好应对区块链带来的挑战与机遇的准备?对于如何在区块链中实现独特的理念或项目,您又有何见解?请在评论区分享您的观点,让我们共同进步。不仅如此,请不要忘记为本文点赞并分享,使更多人参与到这场区块链探索之旅中来!

from web3 import Web3
import json
import time
import os
import logging
from django.conf import settings
from decimal import Decimal
class PayEthOrToken(object):
    
    def __init__(self):
        # 设置web3
        self.web3 = Web3(Web3.HTTPProvider('your infura http url'))
        # token合约地址
        self.contract_address = 'your contract address'
        # 主钱包地址
        self.wallet = 'your wallet address'
        # 钱包的私钥
        self.wallet_key = 'your wallet key'
        # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得
        with open('test.json', 'r') as f:
            self.abi = json.loads(f.read())
        # 生成合约
        self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)
        # 代币简写
        self.token_name = 'USDT'
        
    def transfer_usdt(self, to, value):
        '''进行代币转账
        args:
            to str:接收代币的地址
            value str/int:代币数量,以ether为单位,可以是字符串和int类型
        returns:
            (str, str):返回交易哈希,以及异常信息
        '''
        try:
            token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')
            # 如果代币不足返回异常
            if Decimal(token_balance) < Decimal(value):
                return None, 'Platform USDT token is insufficient, please try again later'
            # 进行转账代币
            nonce = self.web3.eth.get_transaction_count(self.wallet)
            tx = {
                'from': self.wallet,
                'nonce': nonce,
                'gas': 100000,
                'gasPrice': self.web3.toWei('50', 'gwei'),
                'chainId': 1
            }
            to = Web3.toChecksumAddress(to)
            txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)
            signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)
            tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)
            return self.web3.toHex(tx_hash), 'pay success'
        except Exception as e:
            logging.error(f'转账{self.token_name}代币时发生异常:{e}')
            logging.exception(e)
            return None, str(e)
    
    def transfer_eth(self, to, value):
        '''进行eth转账
        args:
            to str:接收以太坊的地址
            value str/int:数量,以ether为单位,可以是字符串和int类型
        returns:
            str:返回交易哈希
        '''
        try:
            token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')
            # 如果代币不足返回异常
            if Decimal(token_balance) < Decimal(value):
                return None, 'Platform ETH token is insufficient, please try again later'
            # 获取 nonce,这个是交易计数
            to = Web3.toChecksumAddress(to)
            nonce = self.web3.eth.get_transaction_count(self.wallet)
            tx = {
                'nonce': nonce,
                'to': to,
                'gas': 100000,
                'gasPrice': self.web3.toWei('50', 'gwei'),
                'value': self.web3.toWei(value, 'ether'),
                'chainId': 1
            }
            # 签名交易
            signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)
            tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)
            return self.web3.toHex(tx_hash), 'pay success'
        except Exception as e:
            logging.error(f'转账eth时发生异常:{e}')
            logging.exception(e)
            return None, str(e)

作者头像
比特派钱包官网创始人

bitpie比特派钱包官方

上一篇:链游为何被视为未来发展趋势?解析区块链游戏未来经济的五大原因
下一篇:比特币怎么开采?挖掘比特币图文教程详解

相关推荐