Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py
1 `% _/ D' k# n  c1 {( o& m% Q2 G
: C3 n/ N0 C& A* U
  1. pip install web3.py
复制代码

5 `: \: O+ w6 K$ O7 ~% r- B  X0 h1 J7 H4 N2 p! _
2、注册 Infura 获得节点服务& ~0 c2 j4 M) B/ f* i4 A7 b  ~! F6 }
使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL0 b* P. d' U- X) s" u0 I. _
04ab0f6855e74cb6b49a35b1f466da1f.png $ `: p5 u' V9 O& C4 |4 t
3 X3 b+ f' m  R5 ]
可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。
6 u  `8 y& k& B; s" z  G: K
8 t4 N4 F. s6 c6 m; h8 b3、代码示例
0 J5 @( ~$ d0 X! \

  1. $ I& I0 n- k& }9 d
  2. from web3 import Web3
    ( s2 j9 s% s" P+ w
  3. import json& d0 X* a8 a  I4 Q
  4. import time
    0 @) P- _% E: ^4 r% m6 ^$ j
  5. import os
    ; E  Z) `% _: }! i% ^2 N" a6 q
  6. import logging
    ' y" G8 x' ]% V* d
  7. from django.conf import settings
    8 l6 V" j# _3 |/ k
  8. from decimal import Decimal8 ?2 I' x4 h1 A. d- @" x; x
  9.   r3 j: g3 B: F. a: v1 f

  10. 7 r* X: O2 K0 n, Z8 r" ^
  11. class PayEthOrToken(object):
    4 e* k6 {0 U* Z$ @% x
  12.     ) q# t3 h+ @- f$ o) w
  13.     def __init__(self):
    9 h! ~) T; g0 K9 [9 k+ Y
  14.         # 设置web3
    ' C+ T3 r# f/ O5 z' a$ Z
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url')). l/ x8 C" N  g+ O& H- Y
  16.         # token合约地址( ^- ~8 x* _+ O/ I, e/ v
  17.         self.contract_address = 'your contract address'
    : p) r8 F. k; I! Y
  18.         # 主钱包地址
    ( G$ X% f. {; y7 t6 P" {2 \
  19.         self.wallet = 'your wallet address'; I( n5 j+ Y/ Z
  20.         # 钱包的私钥+ |+ R8 z% `$ S
  21.         self.wallet_key = 'your wallet key'
    8 u$ ^2 y; v* t2 r# `9 v
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得
    $ d# v$ n( t' z8 @( }6 {# r
  23.         with open('test.json', 'r') as f:
    ; s+ n0 _, W3 k  ^
  24.             self.abi = json.loads(f.read())
    * E0 j0 L1 H+ T, q: i
  25.         # 生成合约
    2 ~- V# P  r+ |- E& I
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)% Z! I- W9 \/ D, |* p
  27.         # 代币简写- c, `% T! I7 }" h
  28.         self.token_name = 'USDT'0 n) X; V; f. f+ l) t
  29.           K/ A% o) |3 E8 {5 `- f
  30.     def transfer_usdt(self, to, value):. p3 y) m$ E! Q2 i1 N$ f) t* {
  31.         '''进行代币转账
    . O* y* R. `' {! W% W, f7 u
  32.         args:" R# B% W- B6 R. Q
  33.             to str:接收代币的地址8 `  ]6 U' Q) W4 a0 f3 \
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型/ L) W# x$ e/ _: D1 F+ p) G( |
  35.         returns:3 _4 z/ G9 ~* }% @
  36.             (str, str):返回交易哈希,以及异常信息% z' z6 W' D# d! h* q$ X# c
  37.         '''' V  |0 m; J& K
  38.         try:5 V+ N+ u7 G; p% |/ I- P4 S
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')9 L" X) n9 x, Y9 a2 ~/ E+ K
  40.             # 如果代币不足返回异常
    " n% B. h/ p* E4 X
  41.             if Decimal(token_balance) < Decimal(value):4 b8 w/ j; m9 Y6 A
  42.                 return None, 'Platform USDT token is insufficient, please try again later'# H8 R% k( D' M0 ~. x; V, a
  43.             # 进行转账代币
    + q3 d$ i" v, C# _0 M% ?' |
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    8 A8 V/ a. B8 l) D4 }4 T, [
  45.             tx = {
    3 n* n, M& @2 X
  46.                 'from': self.wallet,  z) z8 c* [, N: C7 t
  47.                 'nonce': nonce,3 T) h6 I/ c, {& y& l. o
  48.                 'gas': 100000,
    3 D' v' Q/ A. h1 Q( A
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    , U+ }* f, M! S* F: s( Q: U" u5 @
  50.                 'chainId': 1
    8 H9 {' p! l8 \5 d* r
  51.             }
    ) f* x3 [9 q; h* X3 {
  52.             to = Web3.toChecksumAddress(to)& a& p! C- {! H
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)
    2 `  J: n. S% L( f0 R2 n  A* ^
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)
      `; P' I8 v& ?7 Z* I: Q
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)! J* z# c! M  m
  56.             return self.web3.toHex(tx_hash), 'pay success'" P+ T9 G5 e9 K7 @
  57.         except Exception as e:9 `. c* R8 a0 C* |% A
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')
    ) W: @. ?; q7 I
  59.             logging.exception(e)" s% V4 a6 \9 Q  x( l
  60.             return None, str(e)7 \1 ]0 M% F% d- H, v
  61.    
    ! g" f, W# W1 X# L
  62.     def transfer_eth(self, to, value):
    2 \% M' q& Z) i0 \/ g/ p$ r. |
  63.         '''进行eth转账- r  i/ V2 ~8 k
  64.         args:0 F6 M% \! |5 x1 B
  65.             to str:接收以太坊的地址
    : ?1 Y* s8 A# X  G* h
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型
    " z9 t' V' d& u/ h+ p+ Q
  67.         returns:
    : Y# j( {& C- s7 y
  68.             str:返回交易哈希9 A0 M* I' T% ^: ]9 q
  69.         '''. T" o9 q* v7 `6 R& P) d
  70.         try:
    $ S8 _& v/ k9 a0 Y
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')8 r9 a; v8 y$ j5 T( @5 a
  72.             # 如果代币不足返回异常! {, }8 s% x  Y7 u$ @
  73.             if Decimal(token_balance) < Decimal(value):
    - p! `7 ?- f5 v# g
  74.                 return None, 'Platform ETH token is insufficient, please try again later'
    , g. G. c# E, s
  75.             # 获取 nonce,这个是交易计数
    1 Y: N2 Y5 j+ ^7 X* ]
  76.             to = Web3.toChecksumAddress(to)4 J* b6 D6 P$ J& O; w4 t  v
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    5 V4 ?* W7 o$ c! ^9 v$ n
  78.             tx = {1 A5 q5 t' z% W
  79.                 'nonce': nonce,
    4 f% u2 ?$ u; m- S
  80.                 'to': to,( W+ n+ `" T+ \
  81.                 'gas': 100000,
    * c# F& Z" e$ r# `( e4 d2 t' S
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    1 H* _3 ~, m- ~; z  P: v  n
  83.                 'value': self.web3.toWei(value, 'ether'),
    ( F- o( ?0 I9 }
  84.                 'chainId': 1
    % U7 i3 q7 S6 n# ]! \
  85.             }" }, C5 w  _9 D
  86.             # 签名交易
    ( G- e! H: |, \6 J+ U# H
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)
    2 M8 v3 X6 q1 O2 e! u( t# f5 M
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)2 D/ x4 C% `. x3 I8 B5 R4 K) U) [
  89.             return self.web3.toHex(tx_hash), 'pay success'
    ! X1 @0 A/ T1 ?1 {' z9 r( h
  90.         except Exception as e:
    . j! y& X% B6 y2 w% W6 e
  91.             logging.error(f'转账eth时发生异常:{e}')! m  W0 O$ d( D. l
  92.             logging.exception(e)
    . ^, N4 C- Z* a& Y) P" X
  93.             return None, str(e)
    # A' }9 a$ x0 O5 ^) L2 G4 M9 D: b
复制代码

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

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13