Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py
3 \) j7 k5 Q5 w% \* r1 Z8 l4 Q& E4 Y5 Z
  1. pip install web3.py
复制代码

6 [' ]8 B$ x: t6 o/ E) v5 T+ V  o+ a6 D. P: w) q
2、注册 Infura 获得节点服务( E) ~5 ^4 M/ J8 d6 g/ W
使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL9 b( {# G' p; u# |8 x6 _
04ab0f6855e74cb6b49a35b1f466da1f.png
/ V! t( K8 b7 ]0 e) E9 P8 B
1 h' o9 u4 w$ I可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。
8 S& u( I; t& i, f
# \7 c1 P: a( z* H* k, E" j/ T3、代码示例 % \3 m! S9 o" }

  1. 2 r: h& B  H6 \5 W/ P; O1 q
  2. from web3 import Web3
    6 B/ C1 s  w3 u, h
  3. import json
    9 Y7 }% e1 V) r0 ]
  4. import time
    5 F) m( k! \5 y; _7 i
  5. import os0 {2 L6 f* z8 H/ l
  6. import logging
    7 O: ?2 N9 l+ {( k4 |! Q3 t
  7. from django.conf import settings
    & i# `/ ?/ U1 A3 V; j9 b2 t4 K) R* E
  8. from decimal import Decimal
    / L( i6 @) w' f& B/ k6 R5 _% z

  9. # I; A& G# E) p, p  C: x
  10. ' U3 V# E! s( P3 g' e& n7 }
  11. class PayEthOrToken(object):
    1 F( g, d" {) {  f
  12.    
    * P! ^6 X1 L: B! @) A
  13.     def __init__(self):7 I" q  w' @; [; z
  14.         # 设置web3- a- r; l3 d5 {# I# D1 A3 I" U
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))
    " [+ _7 w! z/ t& q2 [3 c- I& c
  16.         # token合约地址
    7 m9 \- f7 Q) w0 J) q* u' U
  17.         self.contract_address = 'your contract address'0 c5 W6 c& p6 O* L/ d/ d% p
  18.         # 主钱包地址: A' T$ y1 P$ _* p2 g" E& M
  19.         self.wallet = 'your wallet address'
    ' V8 L9 z; |& o; R( n
  20.         # 钱包的私钥# V4 I6 a$ N" m8 |
  21.         self.wallet_key = 'your wallet key'
    " [5 v7 L1 K. l% S$ D* O. z
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得  u- ~) b1 y3 Q$ P8 m8 D
  23.         with open('test.json', 'r') as f:% |1 l/ }) z! O, {" o7 o! o
  24.             self.abi = json.loads(f.read()), ]7 f4 p8 ]. f: F. m
  25.         # 生成合约
    6 D! x$ E4 w: C  Y/ }& d6 l
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)
    3 {  @- H* s1 ^. p. r
  27.         # 代币简写2 v4 ^$ g; |0 p4 r7 E  B8 M! y
  28.         self.token_name = 'USDT'
    4 o- [4 M6 e3 S
  29.         - T) ^) ~5 X2 z" {- M: |
  30.     def transfer_usdt(self, to, value):
    6 D" u; B' K* p" R/ f# _
  31.         '''进行代币转账
    - N! _) a) q2 J) p/ i* c
  32.         args:
    . e+ r! B. D5 G4 ^5 a3 N- X
  33.             to str:接收代币的地址2 }7 j' I! D- Z2 |/ D2 ~. l
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型
    # \+ z9 v$ P/ t9 k
  35.         returns:. J- S1 J- Y2 P" K' ?. J% f4 S
  36.             (str, str):返回交易哈希,以及异常信息
    + \4 Y3 ^( c: a
  37.         ''', T* v3 h# M( l* ^+ X3 f3 H+ y
  38.         try:- }) y- A0 ^( \( J1 \
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')( v9 u3 \; H. h. |. j, H
  40.             # 如果代币不足返回异常. K- I4 ^, B7 Q0 @, {' [9 P& Q6 h" E
  41.             if Decimal(token_balance) < Decimal(value):( d' d+ G5 i) D" P1 B
  42.                 return None, 'Platform USDT token is insufficient, please try again later'% K8 M( g+ q& V7 z0 c
  43.             # 进行转账代币- z; s/ s0 M# R" \4 C
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet); U$ I' G7 W+ J& A5 d/ |* V# X  ]7 `
  45.             tx = {; l; J3 ]) ]' _1 {- _
  46.                 'from': self.wallet,8 l; I9 D+ @( o' l# \
  47.                 'nonce': nonce,: i$ q( L1 e( B! X
  48.                 'gas': 100000,) t' P: ?' r/ Z- t! ]
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),' e0 |4 G' x2 l
  50.                 'chainId': 15 [, e, r) |4 ^  z4 N0 z/ B- g
  51.             }7 }, n. ]: o  Y1 t( X% J1 i
  52.             to = Web3.toChecksumAddress(to)& W8 V+ n9 a! _
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)$ g4 N5 ]- l+ Y4 J9 l( D3 E. c. z$ s
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)
    ( X: \" f# _7 `2 B' U: o
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)
    ! }; i# H) i+ ?) m& h- A
  56.             return self.web3.toHex(tx_hash), 'pay success'5 N& m  ^! a' X2 G- Y$ ]6 Q  S2 T* }$ T
  57.         except Exception as e:* }& p9 Q) B8 f8 W
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')
    8 M" y( d7 {: A. E# U
  59.             logging.exception(e)
    * j8 ~! b$ X# o; p3 ?
  60.             return None, str(e)
    * p! v- }( t3 x/ m0 K* \0 {' B& G9 j6 B
  61.    
    : `6 r+ B( e% H4 M& ~& u
  62.     def transfer_eth(self, to, value):
    6 W2 Q6 l7 ^8 D+ e: E) W; M6 X
  63.         '''进行eth转账
    9 U& X  D( G7 N+ \8 v2 P
  64.         args:
    8 _8 [$ O* A! Y
  65.             to str:接收以太坊的地址
    * z3 k5 x0 G3 L
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型
    3 E- A0 K% `7 _( e  G' ]6 e1 N
  67.         returns:
    : K/ b1 e# M' \7 }9 ?
  68.             str:返回交易哈希
    4 b# N. W: B& {3 G8 J- H
  69.         '''( R, [4 i& u( R' n4 a  E
  70.         try:* d: W+ P9 c9 V+ _: H+ |
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')
    9 C3 H1 @* \" N0 ~. o
  72.             # 如果代币不足返回异常3 _& o8 v# A  }: Z4 f- ^  G
  73.             if Decimal(token_balance) < Decimal(value):
    ! W1 F) h$ v: \: D8 m
  74.                 return None, 'Platform ETH token is insufficient, please try again later'
    - {) h+ V" M3 ]8 d& G9 j
  75.             # 获取 nonce,这个是交易计数- Y: [$ L  K6 e/ W7 v- ?7 P; M
  76.             to = Web3.toChecksumAddress(to)
    " b$ J. P% T& [' U: y! {8 C4 A$ `
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    # w8 o; A! o. W% z4 z$ {; V; D1 h' Y
  78.             tx = {
    # Z* I. |) `- m
  79.                 'nonce': nonce,8 c) t! o; `+ {0 o; T2 r
  80.                 'to': to,7 F; ^4 }% I0 B0 i# `* \
  81.                 'gas': 100000," n+ \) i' X! K% g& e7 ~$ q
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),/ v7 A+ a1 b& x7 B: a
  83.                 'value': self.web3.toWei(value, 'ether'),
    ! H: T8 O! O" a2 Q! S9 E9 B9 A0 L
  84.                 'chainId': 1
    4 ~; k3 c; a. Z$ Q! T9 v
  85.             }
    " q" s8 Y, G4 E, L
  86.             # 签名交易' y2 l/ ?, j0 J# }3 @
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)
    ( Q: E* k# Q7 J( Z) d
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)
    8 X, P6 R8 X& C  e& Y3 w; o
  89.             return self.web3.toHex(tx_hash), 'pay success'
    , D9 \6 g' J% ^7 b
  90.         except Exception as e:% d) K( o9 V$ d( T( D6 ?9 j0 p
  91.             logging.error(f'转账eth时发生异常:{e}')
    5 L& g' T2 v$ A. s
  92.             logging.exception(e)
    " x/ ^1 J, I% R
  93.             return None, str(e)
    9 s+ Q* m* \/ B  n; M
复制代码
0 S; K, B. N4 l4 N/ `8 J
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13