Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py
, o. l8 b' [+ k+ G, }
8 I8 X+ O5 L: J* B( P
  1. pip install web3.py
复制代码
' Q7 @) G( v9 g# @1 ^4 }
( m$ y6 n9 z6 S: ~! @
2、注册 Infura 获得节点服务
- Z7 Y) x7 M0 R0 Y; i- A使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL
+ W$ {2 x# A0 W. e& e2 v 04ab0f6855e74cb6b49a35b1f466da1f.png . D' N  z+ a9 h
9 ^( ^( v( E9 \" _# I2 e$ g8 E
可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。
6 ]4 g' z& h) T9 @( I4 G! C8 c) {: d+ a: n! A. z
3、代码示例
! H$ a; T5 A$ e0 c- f& B4 ]4 H

  1. 0 N  e& Q- v6 L# S3 u
  2. from web3 import Web34 h' A$ j0 Z5 ?, {5 D% N4 e# {
  3. import json
    3 J( z. U; E5 V* j3 f/ y2 \+ E
  4. import time
    6 f' F( x5 F; A* s. T
  5. import os
    * o  ]$ t; |8 j2 |( H
  6. import logging# M; x: ~( W; \& @8 R! [
  7. from django.conf import settings+ [. k: S! Z$ P0 S/ p4 R
  8. from decimal import Decimal5 \8 a/ B* x1 ^- \/ v( Y
  9. + Q* J0 v3 l( `! ]  O
  10. ; O, [9 D$ I1 b/ Y% f% d6 \
  11. class PayEthOrToken(object):; R8 I  K& ^5 ^; Q5 }
  12.     4 K1 f6 y: g/ P! q' O
  13.     def __init__(self):! k# a2 J  _* q$ }  d1 |; S1 r, t
  14.         # 设置web3
    8 B; Y7 N$ m9 ?7 }
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))- _2 j. X/ R% U) |0 M
  16.         # token合约地址" Z: a1 c8 G; m9 Z8 h
  17.         self.contract_address = 'your contract address'
    ' q* K" K$ S9 l" h
  18.         # 主钱包地址
    " s4 y/ [+ j6 b# j; w& j; _
  19.         self.wallet = 'your wallet address'' D; v& W! ~7 X. B) P; v) W
  20.         # 钱包的私钥) A/ A0 |! `! e1 Q) f( ^
  21.         self.wallet_key = 'your wallet key'
    : d! Z: E! r; n0 B' k( W9 u
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得
    ) {2 e! d. ], h4 U0 E% |- c
  23.         with open('test.json', 'r') as f:
    9 g/ x$ ]% k7 I% E5 Y! z/ z9 u
  24.             self.abi = json.loads(f.read())
    0 J# D$ L$ D5 \6 a
  25.         # 生成合约, R, F& I  ]4 o( {' X
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)7 W& X, T; h9 P6 P4 j
  27.         # 代币简写4 X$ s# p+ i% O( n* M
  28.         self.token_name = 'USDT'
    / `5 w0 l4 v/ i# p9 z! N) M  r% Q
  29.         
    , \) W; B9 }! P: m2 L$ M1 N1 O
  30.     def transfer_usdt(self, to, value):% }4 D* P* x) L' j# S7 D3 E9 S1 x
  31.         '''进行代币转账5 \* W3 A0 X2 X* ]8 z0 |
  32.         args:8 O1 D- M  u# w/ q" Z- ?
  33.             to str:接收代币的地址- }8 D5 D) A( c  W. w; G- Z
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型7 d8 |  x+ f2 Q; m" I# Z5 j% [
  35.         returns:6 K" K1 {: ~9 B2 Y4 D8 Y3 _
  36.             (str, str):返回交易哈希,以及异常信息
    ' U9 \. D3 R9 t
  37.         '''
    ( m% e; Q1 X8 y  g/ w
  38.         try:
    ( f4 W8 G& w" W4 e
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')( W9 ]* B/ ^- C# [6 |
  40.             # 如果代币不足返回异常
    8 _3 A/ |# w1 X
  41.             if Decimal(token_balance) < Decimal(value):, ^8 O7 p+ p9 s0 n
  42.                 return None, 'Platform USDT token is insufficient, please try again later'
    " Y' M- m1 K/ G- i# R
  43.             # 进行转账代币
    2 }1 g* T( X# \# R
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)/ J/ y0 q1 I) U4 k- w4 h
  45.             tx = {2 j$ _' i. M; A6 m' y
  46.                 'from': self.wallet,
    1 ~8 s- T$ a8 }( l2 }
  47.                 'nonce': nonce,; c" ^7 X* X0 V% t. V/ _' t* |
  48.                 'gas': 100000,
      g$ }2 f; Q( k) [. j- O! u. i
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),) p; ]/ A7 f, @  {5 t# B1 _1 |
  50.                 'chainId': 1; z/ k. s8 x* J1 m) E
  51.             }
    8 \6 \- i0 D9 z4 d; q3 G
  52.             to = Web3.toChecksumAddress(to)$ _& s# L$ r, ?: j0 _0 ^2 \
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)
    $ I9 C0 d3 G* H5 ?1 n* Y* H
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)& s. c% r6 c/ x+ O5 l) S& m1 c+ E2 }" c
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)
    0 t. K5 I" |. ~! H; |8 Z: H5 e
  56.             return self.web3.toHex(tx_hash), 'pay success'; ?4 a0 n  S7 z2 c+ v: X
  57.         except Exception as e:" i/ w& G" v! p; Q6 ^
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')9 s* c6 ^& q# E7 M* ^% {, }" F
  59.             logging.exception(e)
    / q! @& \  |1 O9 d0 `
  60.             return None, str(e)
    0 ]' J8 k, \6 f! @
  61.     2 i  r. y# e! g
  62.     def transfer_eth(self, to, value):
    * Z* }: f5 z  c
  63.         '''进行eth转账
    ( E! V& Q3 b5 y# T2 c8 _" V: y4 u' u
  64.         args:- Q9 C& o9 I9 [: \
  65.             to str:接收以太坊的地址
    ' K& |* c2 x' c. p+ ~1 `( ^
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型) O% A( Q* K# f" S
  67.         returns:
    5 B3 O# F/ [) \6 m* m7 r
  68.             str:返回交易哈希
    + m4 ^% l$ o3 e/ ]) j
  69.         '''
    # i( t' N* |. v- l) u4 I
  70.         try:
    2 V5 m1 a0 E$ G6 g2 [3 q3 |
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')
    + V  U, _6 B4 A7 D: a: J* u
  72.             # 如果代币不足返回异常" f- o$ D9 O( L) A0 ^5 T: @4 v& e
  73.             if Decimal(token_balance) < Decimal(value):
    ) A- }+ r% l5 v; e$ S! j% g8 J
  74.                 return None, 'Platform ETH token is insufficient, please try again later'0 w, w3 a3 s& `9 {' A. f
  75.             # 获取 nonce,这个是交易计数+ W- C0 l5 T6 ^4 u: u* b8 Z8 A
  76.             to = Web3.toChecksumAddress(to)" A7 h/ d: m5 y9 S
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    6 `; H7 d9 g" H" U2 u' D2 f
  78.             tx = {8 k9 O* {; p- d; ^; C( O% Y9 s* q9 J
  79.                 'nonce': nonce,0 q9 S/ I. Z# p+ ~2 J6 v; c
  80.                 'to': to,
    4 I2 V7 l/ T4 F# r* h1 H
  81.                 'gas': 100000,$ G* W. Y  z" e
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    ) _, y% E8 k& J% c
  83.                 'value': self.web3.toWei(value, 'ether'),
    * @0 {5 I  o& |/ h( Q: W- |8 J5 ]/ S
  84.                 'chainId': 1
    ) L3 n% d- Y! h' g9 q) d  _
  85.             }) T- B9 y2 [0 L4 F/ o& j- J' s
  86.             # 签名交易* l4 y" n4 M( z3 g( X
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)
    - F* c2 z) _- F5 Q/ z0 w, Z6 \
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)' `$ b  g8 E8 h; L' y# t
  89.             return self.web3.toHex(tx_hash), 'pay success'
    $ h7 ?3 g$ Q$ |' t+ i9 R
  90.         except Exception as e:
    ; y/ T. f2 e! |  y( u. d
  91.             logging.error(f'转账eth时发生异常:{e}')! r  t# G2 z/ n' ]  H2 t
  92.             logging.exception(e)" a0 r% E3 p) o5 V
  93.             return None, str(e)' D" \2 m) x, c( {/ m3 s+ h9 o0 P
复制代码
* B4 T9 n" s6 K% i+ @! `7 A  x
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13