Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py2 C' s0 r8 n9 L! Q. z
$ J0 ]9 ]: G, n, c7 t# z% W
  1. pip install web3.py
复制代码

6 y4 M+ j1 I) e5 c3 o+ j# D$ M, c9 h' J+ ]% X" n
2、注册 Infura 获得节点服务% J7 U3 d: ]  i3 `! [, g& S# [
使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL, V2 h: _. T8 \, T
04ab0f6855e74cb6b49a35b1f466da1f.png
# a* V. \8 ~6 o1 N; U3 B. A. B. t- B
可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。
1 Z* P  {+ F% {
+ D% ~0 Z) O8 q: u) }) A$ K3、代码示例 9 \5 |3 J/ {. ?% H0 x

  1. 1 [( l; n6 K( w, R, F
  2. from web3 import Web3& z7 w8 B8 |) a; U. V* {& ]! b
  3. import json
    & ?, [8 ]9 v+ t6 V+ d2 |" o
  4. import time1 I' J* p8 |8 T9 B! ?1 U: k& w. v% ^7 {
  5. import os
      z6 B( O) y( J1 ~
  6. import logging4 X$ {$ O4 y3 a6 f& Z/ s* f' M
  7. from django.conf import settings/ V  m" K. C% A+ H! D" z4 I. H# y
  8. from decimal import Decimal$ N3 N/ ~. I4 q5 K' I
  9. ! z" q* x% f1 T  s/ Z2 k3 F. o9 d

  10. 3 `  D2 ?9 p% c
  11. class PayEthOrToken(object):
    # \  e% b4 S, `6 i  w
  12.     - g, R' X/ H$ _) i" i
  13.     def __init__(self):2 Y- k; J* ]' m1 \+ `, i0 r
  14.         # 设置web3% A" _# ^* b$ o9 x3 w4 T
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))
    " G& f2 J9 H' `$ }
  16.         # token合约地址
    $ h- V5 s5 H+ o
  17.         self.contract_address = 'your contract address'% j; Y6 ~+ O$ ^: {) [" K
  18.         # 主钱包地址/ P# L3 p2 K+ x% H% C$ z. [
  19.         self.wallet = 'your wallet address'
      v/ B) B1 G3 U! ~+ O
  20.         # 钱包的私钥% B4 _$ @4 u; i! B1 F0 h4 [
  21.         self.wallet_key = 'your wallet key'
    % i; t+ h) \& {
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得
    / M3 F# O! p) }. f3 v- w* J% q$ I
  23.         with open('test.json', 'r') as f:! |& r9 t: e. g0 Z
  24.             self.abi = json.loads(f.read())
    0 N" c! v! o  g: c* ~; L
  25.         # 生成合约* h' }- f- B. E9 q" ?
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)
    & e% I3 T% K2 Q, b
  27.         # 代币简写
    , n# M; A3 v* q" I$ ~" r. k
  28.         self.token_name = 'USDT'% {$ W0 \# c5 b: |
  29.         $ f4 l! O( F1 U* ]- V- J+ o' h
  30.     def transfer_usdt(self, to, value):1 [/ S2 |, v, ~& ]: d
  31.         '''进行代币转账
    / h' f. A3 X" V+ i
  32.         args:0 D2 |$ L* H% X/ d+ R* n% _& a
  33.             to str:接收代币的地址) o' P* W, H2 n' e8 L; J- N% \
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型
    # F+ b* i7 S$ N5 }, R
  35.         returns:- y# j, G' t! b7 @# G/ T
  36.             (str, str):返回交易哈希,以及异常信息
    6 [$ i0 S+ O/ E* o% L, R6 R
  37.         '''
    ! F% R* p/ L) p
  38.         try:$ s' u+ M: `: n% m- @! _
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')& i1 T2 _+ I' k- C6 U0 o
  40.             # 如果代币不足返回异常
    9 Y) L3 J  G7 A& g0 x& w6 C0 h
  41.             if Decimal(token_balance) < Decimal(value):
      B# N7 o% |9 K+ |! r$ B( ^
  42.                 return None, 'Platform USDT token is insufficient, please try again later'8 B  A7 @8 f( r9 I" E5 t
  43.             # 进行转账代币7 ]$ A6 v* {# G" T# R4 I7 b
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)# P$ T: v1 m9 H  K
  45.             tx = {
    . s0 _* \& y$ _0 t% U6 I( P/ {
  46.                 'from': self.wallet,
    - Y1 o) t8 Z( W1 _) ^
  47.                 'nonce': nonce,
    ( p( f  ~( X; l6 B! D
  48.                 'gas': 100000,5 k6 ]8 T; G# t; D1 C
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    * v* a0 d0 B9 A3 q, K2 P8 g
  50.                 'chainId': 1$ T1 F0 ~1 }1 V, [3 Z
  51.             }1 ?# t1 m6 x% {% }- z
  52.             to = Web3.toChecksumAddress(to)' K! s! Q2 F$ `2 \
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)
    ! V. s8 _; [" W1 p
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)# V  L7 k8 l8 j9 ~3 Q+ J+ A
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)& }# a8 F% p2 ^8 {5 Q/ n
  56.             return self.web3.toHex(tx_hash), 'pay success'' F6 x7 X, s# E% {
  57.         except Exception as e:
    # Z2 H+ o, g) C6 V6 `1 K
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')
    3 z' M1 F* e4 X' m
  59.             logging.exception(e)3 S/ G) z! p) F3 e- x/ f7 B! P
  60.             return None, str(e)
    ' S  Y" ^! x$ I# A4 ~
  61.    
    . X  g5 O7 ]( _! j; u( z
  62.     def transfer_eth(self, to, value):
    2 K) c, I0 M( c$ ^
  63.         '''进行eth转账- U3 n. n! T% H- F( Y
  64.         args:& h  N$ k8 e. i, I
  65.             to str:接收以太坊的地址+ N8 W8 G8 N, s) R; F
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型8 p/ ?/ Z0 E; e- I
  67.         returns:. f+ ~' x9 B' l( _4 u2 u
  68.             str:返回交易哈希
    & b5 M' ~) _% G7 Y7 [9 _
  69.         '''7 G3 W* U- d5 I2 c! k: K$ U
  70.         try:
      b, x( a1 [( c: ?
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')
    ) X+ E' d# [) L0 A+ c& s; g: n
  72.             # 如果代币不足返回异常
    1 ]2 o' q2 r7 P: Y
  73.             if Decimal(token_balance) < Decimal(value):
    1 s" O8 {# B. q( c! @. P  u+ J
  74.                 return None, 'Platform ETH token is insufficient, please try again later'
    $ N3 \' i' R  A
  75.             # 获取 nonce,这个是交易计数9 A. Y8 B) ~0 e
  76.             to = Web3.toChecksumAddress(to)
    7 ~' }& e3 K, u* E! o  q, K" @3 |
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    & ]  a5 M5 W" {* E( f4 A
  78.             tx = {
    5 U+ f) X6 B# a6 j
  79.                 'nonce': nonce,3 |7 d/ P% i5 h3 l) J/ e9 @
  80.                 'to': to,
    8 t* h0 i; r; Z  x/ I
  81.                 'gas': 100000,( L' P: q7 z4 o# S, v2 J2 F! `0 C  S5 K
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    ! N2 @' b7 n6 i' H
  83.                 'value': self.web3.toWei(value, 'ether'),% r+ R; S- K* {' i4 u
  84.                 'chainId': 1
    9 ?# X9 g) l  c, t# z8 E: C7 t
  85.             }
    . T; l. O: q% |% F1 P
  86.             # 签名交易; `4 F  Q/ W# B8 _" ]8 X8 N: j
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)
    7 o7 V! V" |  L) ^0 ?
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)$ I# k  ?3 D6 ~; K+ m
  89.             return self.web3.toHex(tx_hash), 'pay success'' ^  W/ Y% B( p4 e$ r$ |
  90.         except Exception as e:
    + i) a4 v, ?  s+ g' a/ o1 i
  91.             logging.error(f'转账eth时发生异常:{e}')
    ; P5 U0 u) [8 t' Q$ g( U
  92.             logging.exception(e)" r# Y$ I2 S/ j( m8 D
  93.             return None, str(e)
    / _+ |# D: e! C+ e
复制代码

! W7 x) B' K$ A
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13