Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py8 v0 R% `( u3 F1 ^: v  K
; e! Y, |5 \1 |9 s1 |' d) o' O
  1. pip install web3.py
复制代码
  M2 e- ?, \8 E! {4 U2 Y: P

% H5 g2 _; ^! P: W2、注册 Infura 获得节点服务
1 q( e: p, g" m2 G- d; m4 I使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL+ _5 l1 Q9 p4 k2 E& n
04ab0f6855e74cb6b49a35b1f466da1f.png % X6 V+ ]# z! U& c3 w, E) \: i

4 n- D8 b9 Q; X% Q0 q) a6 f可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。
  j+ R: `: Q* s, w+ N' d: t$ S5 Y# ]& Z. _
3、代码示例 0 O  V. _8 X9 U' }/ u$ a# |7 H
  1. ( F/ t, g" [8 Y. P
  2. from web3 import Web3
    4 w; ^! V; b' t& q" r. w; j( e8 f
  3. import json
    9 _! s6 E# z! D( D4 ~
  4. import time
    1 m& o$ d$ _7 g$ Z3 Q. ^2 C
  5. import os
    + H; }9 ]" M( q& p3 t. K
  6. import logging$ O9 G& }  s- l
  7. from django.conf import settings+ I: E" b3 \& r4 k1 S+ p/ O- @- s9 s
  8. from decimal import Decimal& L9 O% ^+ W8 N$ g# O+ h
  9. 4 z  E' E; d- s" z
  10. 6 J4 A6 q) G1 _# x
  11. class PayEthOrToken(object):
    2 y" J) Q; z" v. W5 a1 @" ^
  12.    
    8 t  }$ v; O# b+ V9 J; g
  13.     def __init__(self):/ A3 m% R# `4 `" S7 V8 v' R
  14.         # 设置web33 a' z% z( M, W# U$ o0 K
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))
    ! n3 t% a- Y) e5 P
  16.         # token合约地址! y' W! D: m$ O, c
  17.         self.contract_address = 'your contract address'% Q% f1 G' Z) n( x1 O: u7 l
  18.         # 主钱包地址
    / }. T7 v6 l* Q! r% I
  19.         self.wallet = 'your wallet address'
    * Z8 `4 u( ^" M; ]$ T4 B
  20.         # 钱包的私钥" ~/ n5 q0 c; {* `- z5 i$ l
  21.         self.wallet_key = 'your wallet key'( O: g5 A' H! y% S
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得" i. q( p" H0 k& j$ I+ S: o. m
  23.         with open('test.json', 'r') as f:
    - C! R; Z5 i" K1 E
  24.             self.abi = json.loads(f.read()); ?% S2 v6 y+ b# O8 a- e0 R. R
  25.         # 生成合约
    , h' y- ~5 j: h' g7 k, ]2 L
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)
    . L0 o& e6 H* g" }; Y! G
  27.         # 代币简写
    " m: o& P2 O' E
  28.         self.token_name = 'USDT'
    ( E9 J3 K; \/ ~
  29.         2 N  P( \% J# R: ]: G- s: U
  30.     def transfer_usdt(self, to, value):
    & G8 g( |) k% t- i& |# s5 j" a
  31.         '''进行代币转账1 \6 d, I$ b4 D: z0 J
  32.         args:4 |% t4 K" G) B3 N) W! p
  33.             to str:接收代币的地址! W+ ~4 `( [; c) y6 I
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型& q: c7 H' x1 X3 r* f( D
  35.         returns:: {! l1 B$ H" v* F; _3 ]+ x
  36.             (str, str):返回交易哈希,以及异常信息3 Z+ c! H7 o: v; M8 d; X/ B
  37.         '''
    ( v- O1 v! O. A% A/ U3 R$ R
  38.         try:( r: s' h) s) d! O( X
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')9 _" w  B" Q1 I: }( Z
  40.             # 如果代币不足返回异常6 d2 y3 O) ~3 C3 {! ?! Y) y
  41.             if Decimal(token_balance) < Decimal(value):* a! v# h* |' o1 q0 Z
  42.                 return None, 'Platform USDT token is insufficient, please try again later'; n8 o% Q% u. B1 ^1 }# X/ Y4 A
  43.             # 进行转账代币- L! k' A- Z( b2 R# @
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    + Z: E4 p5 {' F/ {
  45.             tx = {4 e' V& ~9 M7 [4 g8 N
  46.                 'from': self.wallet,
    8 S; J; S/ _( }' L; Z5 [0 Z9 K/ Y
  47.                 'nonce': nonce,- b, n7 @# `1 h5 x2 t6 `8 g$ ]1 S
  48.                 'gas': 100000,+ n" G7 h8 G6 `: `
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),0 u1 a; d4 Y. [; C' z, h
  50.                 'chainId': 1; G( b% x9 }% N% F
  51.             }
    , I: v+ x% J2 o7 }: v7 c* N% u% ^
  52.             to = Web3.toChecksumAddress(to)$ L9 Y  k2 D' l0 p
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)
    7 V4 K, X0 m$ f
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)
    : }) P' W7 V: o  q
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)
    , J! a3 j' n0 m3 ~( v0 j  C' X$ B
  56.             return self.web3.toHex(tx_hash), 'pay success') h) M. L5 U$ Z4 `# x, v
  57.         except Exception as e:
    / D6 V! s* _' C0 M7 Z: q* |9 Y0 e
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')
    , R1 ?& c5 X- H) r; i: `9 `8 h# Y/ a
  59.             logging.exception(e)( ?6 l' t: t2 |! g) ?" ], ^
  60.             return None, str(e)4 p! G( W2 y0 W. z$ V
  61.    
    $ U' n* F# L0 v4 Y9 e
  62.     def transfer_eth(self, to, value):' P* Y+ d2 a$ B' r
  63.         '''进行eth转账
    ; H6 k4 K- D5 K5 u9 R5 f
  64.         args:8 K9 {! B. I$ _5 d. C
  65.             to str:接收以太坊的地址- d% ]" H$ v  l6 R
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型
    4 R3 T8 G" T. e2 O0 W/ u
  67.         returns:! ?) W3 l" j$ G: E: ?
  68.             str:返回交易哈希
    * l+ h. q  ~2 n2 y5 N5 c/ ?/ V. j$ M/ J9 r
  69.         '''8 v; S, p. ]5 R! V4 v4 \; G
  70.         try:5 Z" w: M4 N" w. o
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')
    ( T9 ?. u& [( c4 V! `( u
  72.             # 如果代币不足返回异常& W. A) }5 {2 y0 e& I$ x7 `. _, e
  73.             if Decimal(token_balance) < Decimal(value):
    . i5 _7 }  h: q1 B9 x2 s
  74.                 return None, 'Platform ETH token is insufficient, please try again later'0 O7 B" ^; ~% U# \; }
  75.             # 获取 nonce,这个是交易计数
    % l; ]* z( ]) A# ~, A: q9 W
  76.             to = Web3.toChecksumAddress(to)
    $ Y- v5 x9 l) o5 E  h8 I
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)! Y9 P; ]" q7 \7 ?" i% ?
  78.             tx = {
    1 ^1 l. }2 t9 {8 w
  79.                 'nonce': nonce,9 M2 @4 {9 Z: O
  80.                 'to': to,* |+ J) w4 m1 C1 X
  81.                 'gas': 100000,( K( c8 u: S* ?! P) z
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),; a% s& s* C& x9 K, H
  83.                 'value': self.web3.toWei(value, 'ether'),
    ! X1 ?  M' k( J+ o2 G- D% N
  84.                 'chainId': 1% V. z) }0 D! l7 h
  85.             }! a0 `& j* B! x
  86.             # 签名交易! m% r. B- c- L/ S' |- O
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)+ G1 f# P8 H" c( E9 I- t( d
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)
      ?% ?6 P* @6 v& |5 V
  89.             return self.web3.toHex(tx_hash), 'pay success'9 _# a# q+ o: w) b2 Z6 p
  90.         except Exception as e:( v" @6 d2 a0 K
  91.             logging.error(f'转账eth时发生异常:{e}')7 s0 u5 I3 D3 l, o4 Q- J. ]
  92.             logging.exception(e)1 R0 O! K: D( J+ `
  93.             return None, str(e)
    7 Q/ r4 Q1 _, J3 p9 ]1 l  `
复制代码

1 W5 ?* c1 a$ o0 A6 F- S
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13