Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py
, W, n4 ^8 K8 g* G+ U# I% |
( i+ ~5 Y+ b0 x% \" c- A7 J4 {- r4 X6 Q! A
  1. pip install web3.py
复制代码
! F* R" y1 W9 M

: f) y  l  Z3 Y$ q7 W2、注册 Infura 获得节点服务
1 L# |$ Z- h& |. U. \$ L使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL- b+ Z8 A" j: F5 X1 ?! a
04ab0f6855e74cb6b49a35b1f466da1f.png
1 s0 ^& @- s; `" j" ~5 J9 j' R5 N* k" u" ?8 z7 R8 w* j! m
可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。  @! O, |7 K. }6 P- W; I* W; U
4 J  A0 v, x; R# m
3、代码示例 / i+ Q" p' m/ \& C' T1 H" x

  1. 0 }2 B2 Z% h: w# K# b
  2. from web3 import Web3
    4 F/ n0 Q  z% H$ ~2 L+ S$ P
  3. import json
    * C  @& D+ g7 v, a" l
  4. import time2 V5 X) K2 T9 p
  5. import os
      T$ a5 K; W( [! d2 d) \8 b
  6. import logging4 y- c' @+ J5 Z" S" l+ A- T  [  ^
  7. from django.conf import settings( D# P  l2 e. Y4 a0 ]
  8. from decimal import Decimal+ E3 s8 k1 r7 }: v& K' D; h( e6 ~5 d

  9. # F3 [9 d7 d8 R0 ~# G
  10. / P% W# v& v* w) l3 X: |/ a0 ]
  11. class PayEthOrToken(object):
    7 S6 T& m% U# O/ R: J
  12.    
    ' H9 e4 r! t1 J
  13.     def __init__(self):6 K: q% @$ y" u) ~( x- w
  14.         # 设置web3
    ) [, V8 _0 y: ~% W# Z3 v! W* k
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))" s' [$ \7 y* m9 f# n
  16.         # token合约地址
    ' K8 y1 \0 V5 w$ i; H6 e
  17.         self.contract_address = 'your contract address'
    ! g4 i" ]3 A/ P
  18.         # 主钱包地址
    & m0 C( K  k1 K, O7 `* d: v
  19.         self.wallet = 'your wallet address'
    5 d  \5 R0 ]0 x8 [0 F8 u$ b
  20.         # 钱包的私钥
    1 J; Q- \$ E/ l4 _+ `& E6 l! C
  21.         self.wallet_key = 'your wallet key'3 C1 ^; R5 J# k$ m
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得
    ! ^7 X: e& J6 R
  23.         with open('test.json', 'r') as f:6 B) B3 ]0 d2 q$ k2 s. T8 V6 e4 N
  24.             self.abi = json.loads(f.read())
    " T" Z/ {1 n2 s  m( y
  25.         # 生成合约  f& Y4 j9 n' V
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)
    7 x  b( ^% c7 S" _6 u- q# X
  27.         # 代币简写
    * Z3 b4 }4 _' ^; X
  28.         self.token_name = 'USDT'
    2 m" d$ O% q$ c1 P" G4 }& f
  29.         
    ' R% T0 U+ R. T8 ]
  30.     def transfer_usdt(self, to, value):
    # H- x6 J0 v% n8 K. o5 z8 _& f- w
  31.         '''进行代币转账
    ) s: a# v% u2 s  Q' n0 K
  32.         args:
    0 W* w2 B1 O' C) t! L( m
  33.             to str:接收代币的地址$ Y( B' p& U5 k6 \' n7 _- [
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型4 Y% g3 i2 V6 z5 Z8 W
  35.         returns:- i( S+ |% u; D# i' y
  36.             (str, str):返回交易哈希,以及异常信息, V4 v2 s3 {) ?/ T
  37.         '''4 l9 w1 i, e1 _8 w) x' f4 v/ }3 Q
  38.         try:
    7 G! c3 ^& C+ V6 C
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')
    6 I/ f+ Q8 K' t$ l, \0 i
  40.             # 如果代币不足返回异常
    * m5 K: C1 @" |9 `5 c5 X
  41.             if Decimal(token_balance) < Decimal(value):
    6 c% [2 s2 }4 w4 k: W
  42.                 return None, 'Platform USDT token is insufficient, please try again later'
    ' `! C+ T' ~2 q8 `, [4 r; F
  43.             # 进行转账代币
      m5 G4 O0 g+ x! C
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    $ n- }3 M8 D0 h* \$ E
  45.             tx = {
    8 D8 q2 p1 t, A9 @! M
  46.                 'from': self.wallet,
    4 X$ W" t* E# \1 h. j
  47.                 'nonce': nonce,* X) t  s9 |7 t* _: z2 _
  48.                 'gas': 100000,8 k' W; q% }2 n: f
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    2 w! z9 C# N5 U6 S. E8 I
  50.                 'chainId': 1
    * f# H2 r! T8 J$ u( p! r
  51.             }% O6 ]3 [5 Z+ J& g" Z: g
  52.             to = Web3.toChecksumAddress(to)
    " X, Z2 Q. _, n* S
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)+ l* f0 g6 Y& s/ k7 A9 W0 @( b5 T
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)0 a' i% M1 P4 z: b6 S' e! q; E+ @
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)
    # ?* s3 c2 h5 S& C/ l* g+ C( b+ K
  56.             return self.web3.toHex(tx_hash), 'pay success'
    ' n1 i9 }$ t* D& b( Q$ @
  57.         except Exception as e:0 w! }9 c6 ]( P7 Y
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}'), U1 W- w; x) J- ?: M
  59.             logging.exception(e)
    2 t$ _: v  a; a( Z0 ~
  60.             return None, str(e)
    7 O$ Y' j* I% ]5 W
  61.     / [3 {( s% C' v4 f5 N6 J
  62.     def transfer_eth(self, to, value):
    5 {# Q. J, I* h  d: i; z8 @
  63.         '''进行eth转账
    * W( W. u- |: t6 F8 g
  64.         args:7 k7 {5 O! _" l4 m# r. t+ {
  65.             to str:接收以太坊的地址+ n. L. L& f: H  m
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型" J9 \. S  v/ ^# b) |& [) a
  67.         returns:# v' m& f, U3 `& `) m; f' y- G
  68.             str:返回交易哈希
    , R4 H% X( a0 P! C' w7 C
  69.         '''2 Z( c+ \, o  b
  70.         try:' v) x. @7 y+ V9 ]4 z
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')
    4 J; c& Y* E/ y, u' g- H7 a
  72.             # 如果代币不足返回异常
    6 N5 G; x7 S( w/ \
  73.             if Decimal(token_balance) < Decimal(value):
    ( ^$ I/ y; ]$ }* q. s: c
  74.                 return None, 'Platform ETH token is insufficient, please try again later'
    1 m* j& S" M# y+ e) h( @% `$ W7 z
  75.             # 获取 nonce,这个是交易计数
    1 J, q& F+ h0 \7 c* i1 Q( x7 e
  76.             to = Web3.toChecksumAddress(to)
    ! z7 @5 Z4 t% P
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    7 f6 C! ?* U1 u( v( U
  78.             tx = {6 L, c. C) L& _0 l4 S' w5 _
  79.                 'nonce': nonce,
    # ]% a9 j: g/ `- h
  80.                 'to': to,
    1 `. k. u3 _" G0 ^: e2 p2 X
  81.                 'gas': 100000,% n- `' N: y$ [! H% {
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    & Z5 k; M9 f* E
  83.                 'value': self.web3.toWei(value, 'ether'),6 i7 t' N0 _$ g: p
  84.                 'chainId': 1- o8 p6 U  U6 m
  85.             }
    - h4 @) O' x0 S6 ~6 p' l3 ?; R
  86.             # 签名交易, F1 c: n9 X% o; N' T
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)2 L! I6 v2 d" r2 ]: O
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)
    5 v5 l, P: i" O# v2 P; J( v; t$ y
  89.             return self.web3.toHex(tx_hash), 'pay success'
    . w+ @+ U/ R9 T8 C$ S6 F6 I* R
  90.         except Exception as e:1 Z$ \3 }) l% [& j+ _
  91.             logging.error(f'转账eth时发生异常:{e}')
    : G% l6 U7 J/ ^
  92.             logging.exception(e)
    ) S: R+ d# p* x- c  S9 a
  93.             return None, str(e)+ e! u- p6 M3 t8 C4 Z5 \: u
复制代码

# p( n- F7 \3 N1 ^
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13