Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py
5 t1 m. \7 I$ Z/ l8 @' j4 F: C& i+ o" ?
  1. pip install web3.py
复制代码
' S2 v( p8 S8 m  w! S, p4 V/ M
: G* q" H2 r6 c
2、注册 Infura 获得节点服务  @! ], y9 x, Q7 K: [1 y# ?
使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL
  ]% j. d5 _; ^' v) I 04ab0f6855e74cb6b49a35b1f466da1f.png
4 ^# S5 R. Z: a+ E1 X- b6 S) f* Q$ U+ w
可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。) L0 I5 x/ p6 t& L" X; X3 @% `

# f0 ~9 h( H( O$ y: b3、代码示例 + u. I, a& j3 Q4 ]9 e: K% K
  1. ; F2 L; a; N8 g" ?# |; c
  2. from web3 import Web3$ f9 t' Q9 m6 `" J7 p  ]: p5 k( A$ J
  3. import json
    6 H5 l; U5 M" _* h% }5 q; ?& m8 f
  4. import time
    ! |: z6 A* J$ _% I
  5. import os4 c1 I( A. C$ E5 [3 N9 R- L
  6. import logging
    ! r3 q# i' Y" ?8 a
  7. from django.conf import settings
    9 m( y. ?' A6 S' O" q8 t
  8. from decimal import Decimal
    8 N( _* }8 K3 P

  9. ( ?6 y$ K4 g2 D8 z2 T" K4 m
  10. : U/ S' @* S  l6 C# j8 h: Z
  11. class PayEthOrToken(object):
    / I( p9 l3 F! ^" |0 v" ?% N
  12.     6 A* i9 E: E0 I
  13.     def __init__(self):% b* {4 }2 R: z3 S
  14.         # 设置web33 V# z9 D5 ]$ ~% j
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))
    ' v$ t5 k5 v, ]" K: d# \
  16.         # token合约地址4 U" z; H" N1 L8 h0 b
  17.         self.contract_address = 'your contract address'
    : l+ z8 h$ m, F9 `# v  r$ e
  18.         # 主钱包地址
    3 K# [9 c" }, s- i0 p) Y
  19.         self.wallet = 'your wallet address'+ ?5 y. E7 {, e' J" c* C4 O
  20.         # 钱包的私钥
    6 k( ^4 `0 Y  S* U
  21.         self.wallet_key = 'your wallet key'
    / Z) C( n) ?5 l1 r5 q9 F
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得
    0 v& o6 o& S* d* l: v5 B
  23.         with open('test.json', 'r') as f:
    . h/ `: p8 E3 ~- o
  24.             self.abi = json.loads(f.read())
    6 g" ]6 N! n" h( Z
  25.         # 生成合约/ J7 h5 ?. x2 S0 i- g/ k, n
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)* p* y3 l  k; d
  27.         # 代币简写
    - J) P( K" M. H
  28.         self.token_name = 'USDT'
    ' ~6 g- G- |4 V  q$ M" Z% a
  29.         2 j* i$ k, v+ [2 g7 Y4 O
  30.     def transfer_usdt(self, to, value):" n4 o& U9 X' |- A: j: {) |- p$ f
  31.         '''进行代币转账
    . k3 j  C  O8 ~3 e2 W6 ~$ O$ ~5 o
  32.         args:
    0 l  V- O! t# e( \
  33.             to str:接收代币的地址8 E  i8 ]1 A9 R+ A& I: s
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型4 ~4 u, S/ _: H* e) V+ w3 o1 Y
  35.         returns:2 y/ e' l: X" W" s$ T4 R3 ?7 e1 p! a
  36.             (str, str):返回交易哈希,以及异常信息% |% z# w5 l5 @
  37.         '''
    / |" ]; V& }; |$ T
  38.         try:4 L5 W2 R+ n2 E% t0 K
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')
    9 i1 N, J) B2 t3 `  z% A4 _; N
  40.             # 如果代币不足返回异常* H9 ^" x5 }- Q( V# s5 L/ P; M4 w
  41.             if Decimal(token_balance) < Decimal(value):
    + I* B0 X$ J6 T3 C; Z$ q7 {" c
  42.                 return None, 'Platform USDT token is insufficient, please try again later'& K4 R' v6 A; t: Q% N, ]
  43.             # 进行转账代币* t( j* {: z9 z6 J  T. g
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)$ z5 M" m; v9 j( i( e1 d* j) Y
  45.             tx = {
    ( V( \, X8 _' Y7 t
  46.                 'from': self.wallet,5 ?/ l- `: A+ R& V; v1 Q
  47.                 'nonce': nonce,7 b6 K4 H$ g; y. `4 ]0 [- `- u
  48.                 'gas': 100000,( F* [5 }- w# h! D  l& Z+ Z* I+ I4 N' V
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),& W9 L0 S% ], W, K
  50.                 'chainId': 1
    6 i, x- S/ L/ V' J  q+ u9 r
  51.             }
    4 G+ C- n" q4 j' Q) o  S2 v2 k; ]
  52.             to = Web3.toChecksumAddress(to)
    ! q/ g+ h4 m$ X- v5 {* E. {
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)/ {: _+ A; C8 ]& k' R& A
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)
    * F- n( e8 @2 ^! S  P* O
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)4 w! M5 |" F' I9 }% V( A; B
  56.             return self.web3.toHex(tx_hash), 'pay success'2 U9 B( C; w- O' @* C( w8 M
  57.         except Exception as e:5 I# R# p3 k) }% _& k, Z
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')8 j4 h, J* c; _- O4 t: W
  59.             logging.exception(e)  {9 U; j* f5 K1 I
  60.             return None, str(e)
    5 y% \' n  R0 a3 i2 H- }! J: v
  61.     ( M+ t- j: R: B1 i; U
  62.     def transfer_eth(self, to, value):% P5 F  v; H* K3 P
  63.         '''进行eth转账+ G4 U0 m7 c' b! D
  64.         args:
    2 s" H) @) g; [4 |1 T# Z4 d! T0 T$ t2 x, m
  65.             to str:接收以太坊的地址
    & h; u- Q* L  `- U9 }, f8 P$ a
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型
    7 `6 I2 t7 x1 F# B+ U6 O! |* i
  67.         returns:
    , l, e5 p, a, I7 f) d& `) h. J' L9 T
  68.             str:返回交易哈希
    , s# d# u& C0 D/ u2 c# x) k
  69.         ''': Y% U+ i4 s# U/ N0 Q! N
  70.         try:
    / A- r: K/ n; Q! c0 z0 ~4 @
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether'); @& N3 k. i1 }7 Q& j2 C& X1 O2 R
  72.             # 如果代币不足返回异常, `; z* F. \: S% y
  73.             if Decimal(token_balance) < Decimal(value):# D# B9 d% y3 u# a* p1 _/ q
  74.                 return None, 'Platform ETH token is insufficient, please try again later'1 [$ [  z9 r0 n) }* M
  75.             # 获取 nonce,这个是交易计数; a6 X0 |; y. w" h' S
  76.             to = Web3.toChecksumAddress(to)
      k, B* m$ l; I6 w3 A; C9 P
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)/ Z/ ^) n( E$ q% _
  78.             tx = {" M+ a9 A! ?2 \2 A; I& L
  79.                 'nonce': nonce,
      m) Y0 Q  l3 \8 O  p1 X4 e5 ]' y
  80.                 'to': to,/ ]1 M6 l& d. K8 k5 R8 l, F# F- ~# B
  81.                 'gas': 100000,
    ! j  j# _; Q) E9 f
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    6 n' d- ~1 n# Z' F! h
  83.                 'value': self.web3.toWei(value, 'ether'),4 q5 l( J/ G+ k" g; J' z
  84.                 'chainId': 1
    / A* |  @/ n, X' J9 ~- f4 b6 m* S
  85.             }$ y' R7 T' X/ x0 m$ Q# v
  86.             # 签名交易6 Z( C& |8 m, A. S$ \" p
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)
    0 D' S) g. f' Y% N' C- m
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)
    ; R% H, c: j' V" d2 X6 J
  89.             return self.web3.toHex(tx_hash), 'pay success'
    0 N* A. O  j2 M$ T; t5 L' T
  90.         except Exception as e:
    / ~+ u2 C& U! I8 L
  91.             logging.error(f'转账eth时发生异常:{e}')% D7 E4 y% J' l7 m
  92.             logging.exception(e)# G; _8 N6 t; e
  93.             return None, str(e)/ g! Q' e0 ~) N
复制代码

7 r9 W" [& O' M7 x7 c2 r
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13