Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py
4 p4 \, `& X' F9 D4 l% m6 m( O
7 o3 B7 J. A( A3 F
  1. pip install web3.py
复制代码
+ O9 ^: Z" x! r- `

, d3 |' V5 f4 X- b, U2、注册 Infura 获得节点服务
; Q/ G4 c/ A0 V% j使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL
8 Z1 x! L5 Y8 L 04ab0f6855e74cb6b49a35b1f466da1f.png ( u2 i) y8 y' I" o2 d3 y
6 _0 Z- k& V3 c6 K; x! n* Q
可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。
* d( L0 C# K. E( Z
! V. [$ g7 R2 s1 e# P% ?0 A, L3、代码示例
. l) b/ k1 K- q/ r. j3 h# w( F6 x
  1. ( K2 G, T" x+ X- T" J$ C- V, i+ M* J
  2. from web3 import Web3) Z' y7 p# S" f3 j- ^" q, R& N6 v
  3. import json
    : P# A' c$ v: W$ @) V0 _* E  z  R
  4. import time
    * R5 f& u+ z" ^" I
  5. import os
    * y% U- H) d  F& g: @# j
  6. import logging* V3 L$ T# v% G
  7. from django.conf import settings
    * A) O( f5 m" H8 ~3 M* c
  8. from decimal import Decimal4 s0 O0 G$ i$ V( Y5 r, ]5 u

  9. # X' h9 c6 R0 q( _! z8 \
  10. 0 q. s, ~# P" O+ A! k* g
  11. class PayEthOrToken(object):2 }' i" F1 Z! }
  12.    
    ! Z% L7 i4 r( a- I* q
  13.     def __init__(self):
    ) d& d! |( w' e7 G
  14.         # 设置web3
    . J; ?( _  l+ u. l, r9 O9 K
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))
    ! o+ k$ u) Q" T! `7 H5 J1 J9 H
  16.         # token合约地址
    % T, r$ L+ [+ [6 y3 v# V  r& ?" I
  17.         self.contract_address = 'your contract address'8 I5 k  Q! _$ ?) H, v/ q! E6 H
  18.         # 主钱包地址
    9 ]6 y  W9 n* P! v. a- M! @. g
  19.         self.wallet = 'your wallet address'
    $ f; [, C2 R. s  v8 k
  20.         # 钱包的私钥
    3 L  U# I- a  u% b6 Z* U
  21.         self.wallet_key = 'your wallet key'$ E% h' H4 ?6 I$ n6 O
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得3 f% h8 l) |0 X# Z  {1 g) d! n8 p) }  @
  23.         with open('test.json', 'r') as f:' z: X+ C+ |+ _2 x( ^7 g( D3 c
  24.             self.abi = json.loads(f.read())' [1 U' e/ b! g1 t" ^! N
  25.         # 生成合约8 b4 ~9 {- F8 t6 l
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)
    9 B/ g5 m, M; E
  27.         # 代币简写
    % j  [/ Z* z" @% \: c& D% m
  28.         self.token_name = 'USDT'
    3 {0 l3 V" u; q, x
  29.         
    4 K3 I6 Z4 o" b+ d
  30.     def transfer_usdt(self, to, value):
      f1 t( b- I" q7 d( H+ V
  31.         '''进行代币转账
    " ^& @; s6 ?; F" L( m
  32.         args:5 l- D, u1 R/ M) |1 F7 q
  33.             to str:接收代币的地址2 L0 x# y. P  O! B5 R2 j* {: j1 Z
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型
    . l% `2 T& ]0 }& n3 j
  35.         returns:, H% g; C. K# k& C
  36.             (str, str):返回交易哈希,以及异常信息
      g& [* b9 S! q7 i3 B- a
  37.         '''0 g. @# V. P3 O: A" F4 D. K
  38.         try:! ?" p( N2 ^5 ]; k2 x3 S1 t, o, Q
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')
    ! m7 A- @! ^) {9 A2 r( l* R7 E
  40.             # 如果代币不足返回异常4 j9 g+ S% F# b2 Z) k
  41.             if Decimal(token_balance) < Decimal(value):. r1 D  G' E+ }* k4 d2 j
  42.                 return None, 'Platform USDT token is insufficient, please try again later'" N; q5 O* o2 y8 v" N7 A
  43.             # 进行转账代币0 u8 ?& s, ]7 b0 c. b9 x1 M# I
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)1 M, e" D' Q3 t2 b
  45.             tx = {
    $ p  d. q8 m1 o" O; W/ c
  46.                 'from': self.wallet,) }! a8 l* a2 b( p9 ]8 g
  47.                 'nonce': nonce,8 y0 W4 p# q; Q, G; @
  48.                 'gas': 100000,
    + x- ]9 q/ z9 K5 y6 K- h, o
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),0 b, W( v7 c5 g* I( E  H
  50.                 'chainId': 1
    , ~% Y2 {1 x8 t: J" \- I
  51.             }
    2 V0 k- N7 N# t: F
  52.             to = Web3.toChecksumAddress(to)* I" J, P: q* z7 L% c
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)+ {* L+ S# d8 \0 o" d) p' b
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)
    . G4 U+ H; _6 \
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)% b( t3 c& t* }# j$ s3 h' q: X
  56.             return self.web3.toHex(tx_hash), 'pay success'
    % q- Q$ V. e6 q% |3 ?7 ~+ J9 j6 L
  57.         except Exception as e:
    * B5 p# L7 _. i) v! j
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')1 G) b* F. Z  l8 m6 U
  59.             logging.exception(e)
    2 g8 K- n2 [& L* r/ j: x/ s$ u
  60.             return None, str(e)
    0 ]# E, j/ {7 a
  61.     2 G9 U- ?; u8 V  K% \* N) F1 y
  62.     def transfer_eth(self, to, value):; k( z6 [3 h4 l$ H8 y1 \, r$ Q; G- G
  63.         '''进行eth转账- u& l* s6 c1 y5 @% n; G
  64.         args:% L8 e/ {4 n; b8 L. v) O
  65.             to str:接收以太坊的地址: V" I$ L2 Z7 h$ j! L
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型7 L' }1 c( k0 i) i
  67.         returns:5 c, q  p$ j% y4 O. b) c; v
  68.             str:返回交易哈希3 X( M* ]3 X* t
  69.         '''( Q  S* z& M5 [: R
  70.         try:
    , r9 a' Q5 g7 Q$ r
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')
    / t1 X1 `0 {# u
  72.             # 如果代币不足返回异常0 v( U# X) [) [
  73.             if Decimal(token_balance) < Decimal(value):
    4 v( {6 S) G$ O7 \8 Y, [9 u
  74.                 return None, 'Platform ETH token is insufficient, please try again later'
    ) y" i, {. ?1 v. M4 A6 t% g: W0 X
  75.             # 获取 nonce,这个是交易计数; L9 }7 y' X* t0 c1 A# ~: s
  76.             to = Web3.toChecksumAddress(to): s+ e# v7 h6 q4 ~+ w. k. w
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)+ g- o7 \& [& b' D0 H* A! ^: a
  78.             tx = {
    % i' B, w- g2 J$ |5 M8 v6 g
  79.                 'nonce': nonce,5 O7 a( z, l4 U! K
  80.                 'to': to,! k/ ]- D3 o5 G- q# J1 @4 V! [' ~
  81.                 'gas': 100000,
    0 I- x1 D! [- |- Q+ X- R+ {$ _
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),3 o! L6 W* U3 q7 j
  83.                 'value': self.web3.toWei(value, 'ether'),
    , ?9 u$ y7 K* ?' x% k  D- ^& W7 D
  84.                 'chainId': 1
    " O: D7 B; M* }
  85.             }. U4 t4 h' @3 i  k9 b2 z. g! I
  86.             # 签名交易
    , m5 [( e3 ?2 u
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)
      {2 R: @: W: ~* W$ Y% D
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)
    1 W6 b. X: d* R# S
  89.             return self.web3.toHex(tx_hash), 'pay success'
    % H( e5 m4 F) [
  90.         except Exception as e:$ J; v4 L1 \' i) R
  91.             logging.error(f'转账eth时发生异常:{e}')" G$ k% }% A$ U5 M  p
  92.             logging.exception(e)% s" F% P; c4 q
  93.             return None, str(e)* [# u4 C9 h8 D( K% w+ Y7 U  k
复制代码

5 j/ r" E$ E0 [/ A# A# d, u. K5 O% Q+ j
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13