Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py' M' |& {$ K4 y6 z( N/ G

! @. x% T( @6 k9 _. s
  1. pip install web3.py
复制代码
2 d, b7 G$ }. p, R/ m9 ~4 W

  t- O7 G0 z9 C7 g4 t2、注册 Infura 获得节点服务8 H) c, z- B1 l& d8 j- T+ r
使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL
- s% J2 v" l# F% A1 I 04ab0f6855e74cb6b49a35b1f466da1f.png . N2 t4 C& _! V3 {& w

' X% K3 ~) H$ S可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。
4 S- W$ P# h2 R+ _7 E/ F7 n; h, n5 V9 v! \
3、代码示例 6 m" w+ h" O9 Y% p& x7 `. s

  1. ! \; K. g- S6 a1 A" R$ p
  2. from web3 import Web3# l6 {' U  h$ L3 ^
  3. import json
    / n1 w4 D0 u3 ^; j# G% m) O  F. R$ K
  4. import time
    * `& v; P0 }& C) c! T# n  H
  5. import os$ o  @+ J: w* C2 l; E
  6. import logging7 X! {4 [7 f, j
  7. from django.conf import settings+ U$ c& O; e1 x( l; `% C
  8. from decimal import Decimal4 ?- e0 p2 z/ ?* ^8 h  [2 @* j* u

  9. 7 y2 o" j9 e/ R( W8 I/ P! j
  10. ' s9 L/ t+ T  H  o
  11. class PayEthOrToken(object):3 g0 j1 \/ @  f4 n
  12.     / H2 m% F, c: q  Q2 K
  13.     def __init__(self):
    0 L$ W3 ~1 n; M6 D4 D
  14.         # 设置web3" h% V' }# j7 x  e* n  {
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))
    + e8 J# m- u, g& ?: i
  16.         # token合约地址' e; i+ s) `! T1 \; G* v- [. W8 {
  17.         self.contract_address = 'your contract address'% J" s; M9 |4 ~
  18.         # 主钱包地址
    / t3 T/ Q0 ?) l: Q
  19.         self.wallet = 'your wallet address'
    ) e8 F: P1 p" b
  20.         # 钱包的私钥3 L) H: w+ y5 q& U! ^4 {( O
  21.         self.wallet_key = 'your wallet key'
    ( v9 N3 Z8 c4 G. ~
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得8 g, d; z. M& L. e& I- I1 j! n" p
  23.         with open('test.json', 'r') as f:1 m6 t1 X+ @+ t) p. S
  24.             self.abi = json.loads(f.read())! G8 s3 `  G( |5 E' G, w8 @
  25.         # 生成合约  G  q* Z3 e3 D
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)
    % r: G2 r) l! T( y
  27.         # 代币简写$ L- l- y* H2 A1 ?' ]
  28.         self.token_name = 'USDT'8 o: ^  X" A7 j! G+ A5 C, D
  29.         ; w8 q: y1 f% p
  30.     def transfer_usdt(self, to, value):' Z# Z& m; ^+ m' b& |) P* S
  31.         '''进行代币转账0 R) M* S: c: h. ^5 o6 W& ]4 L
  32.         args:: F- ^8 t# M% P5 i
  33.             to str:接收代币的地址
    & D1 K4 s& G9 y/ |/ [, ]9 [
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型1 y* t, p& s; S7 ]) T. P6 o
  35.         returns:# F( {: ?9 B) [: C+ V3 p6 d
  36.             (str, str):返回交易哈希,以及异常信息! Q8 x0 y# R; f- O3 H  H
  37.         ''', R* G* p9 R: g+ G* V; G9 V
  38.         try:4 C0 L2 q* K2 l1 D0 [, Z1 A
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')6 i0 p4 W1 {, `. l" |
  40.             # 如果代币不足返回异常* w/ n- {5 o4 \
  41.             if Decimal(token_balance) < Decimal(value):( @: e1 F+ k5 \: }
  42.                 return None, 'Platform USDT token is insufficient, please try again later'/ }8 a# x0 ]( C# x# |9 o# h
  43.             # 进行转账代币
    8 T! V+ f- A8 Q
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)# L# ?! |& s% L  U% A! l
  45.             tx = {! `0 c0 z( f1 ^/ D- q+ {- t* d
  46.                 'from': self.wallet,
    9 e. _: w# ?0 G' Z6 ]; k4 U. R
  47.                 'nonce': nonce,
    + Z* Z& @+ K: `* @9 r; p0 @2 z
  48.                 'gas': 100000,  z/ n! u( w3 D! C
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),6 f- C7 ~7 u( [4 X) t& K
  50.                 'chainId': 1: u& k7 t, }& q+ |
  51.             }" Y/ |  T, k( w+ p& }) r- y
  52.             to = Web3.toChecksumAddress(to)+ ^* P- i" S) I* M- h0 M7 _  ~
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)" z4 u! K5 A- X$ o9 p4 ]  q% N: {
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)" E1 u. L' `3 U4 c1 N3 w) N
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)
    8 @2 T! x0 G& c/ j" p' C
  56.             return self.web3.toHex(tx_hash), 'pay success'9 Y/ G1 ?$ l% ]" g) n
  57.         except Exception as e:
    4 r: {9 T' ~  n2 s; |
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')
    - i4 |' N. X# D4 x( T5 O$ C2 d
  59.             logging.exception(e)
    , ~7 n2 \, @8 {; v9 R
  60.             return None, str(e)
    / G* G1 ~" M- _7 E4 h1 X  P$ I1 o) D3 F" T
  61.    
    7 g6 |1 ~; g2 L; ~/ w' r
  62.     def transfer_eth(self, to, value):
    ( B* Z0 ]5 B3 J: w9 H3 {
  63.         '''进行eth转账% l; w+ _* v0 \) d' {/ T
  64.         args:
    / Z1 s9 b3 n5 K
  65.             to str:接收以太坊的地址% ~5 @3 k2 o, l7 ^
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型
    4 j0 g4 `8 C7 X6 I9 o
  67.         returns:
    6 l7 b; s; B4 e) w' s7 o
  68.             str:返回交易哈希
    , c; L/ j( y6 V
  69.         '''- Y. M( _$ L9 W- k; c
  70.         try:9 F1 {3 s/ U2 i: H( C5 v& Y
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')* }+ w2 D" ^! Z3 i& u. B, C6 E. F8 E
  72.             # 如果代币不足返回异常+ }! A/ F0 j# W; y4 G" b6 d; L6 R
  73.             if Decimal(token_balance) < Decimal(value):' F5 @) D0 w7 d% {. {- `( w+ k
  74.                 return None, 'Platform ETH token is insufficient, please try again later'+ o& T! d) H# O8 y; A
  75.             # 获取 nonce,这个是交易计数- W: I8 Y( z# U/ F1 s; w% u
  76.             to = Web3.toChecksumAddress(to)
    1 m. n2 d6 Q5 X& K" q
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    % p7 |& X9 I1 n! }
  78.             tx = {# b/ n% ]& u/ B5 o' ?! B3 b3 ?& s
  79.                 'nonce': nonce,
    5 \- s: {$ I& Q% }8 [
  80.                 'to': to,
    3 i7 h- [& n2 M. A  \6 u
  81.                 'gas': 100000,
    . w* U; y3 i: O: w# k) [; j2 V
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),5 Z: M/ P& G5 `* _
  83.                 'value': self.web3.toWei(value, 'ether')," T6 z8 d3 i7 q, _5 [, b/ q4 z
  84.                 'chainId': 1
    ) C  E6 M* W* ?4 _, h3 e
  85.             }- M( `  M' S5 \. P
  86.             # 签名交易
    2 _( b' b- P( u( K5 x# C. m$ O3 z! ?
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)) A" Y: p0 ~5 A4 d# ?' e
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)# R: @$ e& H% y2 h! B( ?8 m( _& q
  89.             return self.web3.toHex(tx_hash), 'pay success'2 }- o0 ^' o6 t7 {
  90.         except Exception as e:) V0 y4 H' o- _$ C; L5 L
  91.             logging.error(f'转账eth时发生异常:{e}')
    : B: I/ p. U/ d4 c5 N
  92.             logging.exception(e)
    $ y% @# T4 q+ ]) p* E
  93.             return None, str(e)
    2 w; }: i$ K' `
复制代码

+ G! F5 w# g1 i9 L2 L3 g  _: e
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13