Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py5 ^5 o+ y% Q$ ]  q1 m8 p( \

8 |% n2 x  c2 U6 K' [2 B2 P2 C
  1. pip install web3.py
复制代码

6 f3 F1 p& o2 x, i' m/ I$ p& u* ?: o# f6 J4 K" D
2、注册 Infura 获得节点服务
- ^# a& D, D) a: A. k# Z使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL8 R( G: j3 c: Y7 Q/ S
04ab0f6855e74cb6b49a35b1f466da1f.png
! M! H; c% \. Y, q1 ~( y
8 J& b# e9 p& w! C5 x可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。5 Q4 k( c8 j7 n/ l7 J

9 C( X4 _" J9 R  j! B: B9 ?3、代码示例
- J0 S3 D$ S+ c( e

  1. * g! L3 U6 f- k/ Q+ ~% r
  2. from web3 import Web38 K: B9 k% j/ j  ]2 F+ Z" i3 r) V
  3. import json
    / B# R) m$ [+ Z; e) ?2 P
  4. import time
    5 V! q# I/ h; B: }7 H8 m" W* F
  5. import os! `4 t" `& {1 W, J" C  [9 V5 s3 R( J4 ~
  6. import logging
    4 B& Q$ ]$ C" O0 ]( C5 F$ i# \
  7. from django.conf import settings9 M0 [" u) e" f- R) N, k* O
  8. from decimal import Decimal
    $ A7 Z  f% Z- F

  9. ; P% [' q% \5 R/ E( t

  10. ! k* q/ e% H  T  `2 }
  11. class PayEthOrToken(object):
    - h, n# Q/ s9 U
  12.     # v! a* ]0 h6 {  G1 j
  13.     def __init__(self):
    7 K4 a1 h8 }4 V4 R' u2 n) y, b
  14.         # 设置web3' n' p+ N' g/ \
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))1 H# U4 R% Y2 n  O
  16.         # token合约地址+ A6 }! S! ?3 Y+ [6 t, h. P% X
  17.         self.contract_address = 'your contract address'
    1 R( x! s" C8 [: x- Q6 D: @$ ~- ]
  18.         # 主钱包地址" ~; X1 @" e' ~) |7 Y( b+ B
  19.         self.wallet = 'your wallet address'- B- t% n5 T( Z9 v- Q% N: a
  20.         # 钱包的私钥, a9 a- K# J/ ~
  21.         self.wallet_key = 'your wallet key'0 ]. Y- q* H" f' i) D: T" Q
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得
    9 B$ s! P: C6 X" G6 ^4 R( l
  23.         with open('test.json', 'r') as f:! }1 \% l  o  P# O5 z7 H' @5 d
  24.             self.abi = json.loads(f.read())
    / o# s; G& H3 p9 z# T/ m' w* e. \, j
  25.         # 生成合约1 X+ B2 X6 ?9 D4 t+ \- x4 I
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi). Z, `8 ]/ x; {' ^: r$ Q
  27.         # 代币简写; M/ B6 v9 g" A+ ?; i; I: w. @% |3 V
  28.         self.token_name = 'USDT'
    # r6 d" ^0 d- Q" y" {# h0 f
  29.         
    ! v- A1 Z( ?) k; D
  30.     def transfer_usdt(self, to, value):4 r2 E) x* h$ W4 }
  31.         '''进行代币转账' x7 Q1 ~: T* ]$ E  w. a
  32.         args:" F; J: Y6 e" I% U4 o
  33.             to str:接收代币的地址  Z. b6 V/ F( ^
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型
    4 ?+ E; B1 a5 n4 p; L
  35.         returns:: S6 E* ^& u" h( M1 b2 U
  36.             (str, str):返回交易哈希,以及异常信息
    6 W  v; u3 `; n% V9 B2 v' X
  37.         '''! |" v1 j2 ?" g& ?! k4 J
  38.         try:6 \1 ]  r; f/ n& B# f
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')
    * _% j2 Y+ b$ c* }0 s) n# X% T& h7 l
  40.             # 如果代币不足返回异常. }8 F  e& ~' E) g
  41.             if Decimal(token_balance) < Decimal(value):
    , J/ U7 h8 Q% H5 k  K) M! I
  42.                 return None, 'Platform USDT token is insufficient, please try again later'
    9 I/ l% G2 ]+ R' ]& \
  43.             # 进行转账代币
    ' V  V, V4 H) l! h$ z+ N
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    ' X/ O5 `8 v# R! Y" L+ A
  45.             tx = {
    % f' E5 `! s1 P; y9 w+ `! \
  46.                 'from': self.wallet,
    + Y7 \5 `0 z  y! w) o$ f2 \
  47.                 'nonce': nonce,# j' d; c' g1 s4 g  d9 ]
  48.                 'gas': 100000,
    6 z) \3 S6 w+ J) X
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    8 \! O+ ~5 v, i) k
  50.                 'chainId': 1
    4 W1 s$ u7 Z6 D" c
  51.             }
    0 n3 E9 r% E( U; }3 F" S# h
  52.             to = Web3.toChecksumAddress(to)
    / Y" `  e, r4 t: c' k
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)
    + _6 Z* C7 U  \0 C
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)* P/ w1 ?4 n+ a5 o2 y! w4 ~
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)
    , g! C* D0 U; Y. l. @& M
  56.             return self.web3.toHex(tx_hash), 'pay success'6 O( n5 G5 U& E4 N5 @& n
  57.         except Exception as e:( \: `/ _7 N# D- A
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')
    ! [2 q+ p) o% F: {
  59.             logging.exception(e): c2 y/ l/ z6 V2 m0 h- |1 o  v* y; o
  60.             return None, str(e)( W  f  o* d  P( \7 w9 c3 U
  61.     9 K- B3 R. t  W
  62.     def transfer_eth(self, to, value):6 Q5 L" X& w' x
  63.         '''进行eth转账
    ! j2 k- B; O: ~5 [1 D, k
  64.         args:) J$ k' S& ?- X
  65.             to str:接收以太坊的地址
    , Q% W$ J% `6 R3 N
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型
    6 S% y  Y# F2 Y: L
  67.         returns:
    0 Z8 V- J' i% ?
  68.             str:返回交易哈希
    # k! Z+ s' ^" D* l4 @: O
  69.         '''" c# |. T( O0 _! U/ K
  70.         try:
    + q( Z* _' V: ^0 V
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')7 |' @& D! U- S% L4 g6 _
  72.             # 如果代币不足返回异常
    4 X7 Q" X- x! U/ a# q3 _
  73.             if Decimal(token_balance) < Decimal(value):
    . u2 l4 r8 Z5 w5 ]
  74.                 return None, 'Platform ETH token is insufficient, please try again later'7 p. a5 Z1 {% e  a3 W3 f5 a' k- z% {
  75.             # 获取 nonce,这个是交易计数' ?3 h7 N3 n, ~$ c& ]. I
  76.             to = Web3.toChecksumAddress(to)
    7 e, k$ J' U  Q
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    . v) Y. m, @$ ~0 {# m
  78.             tx = {8 F& _! h4 p0 T& o
  79.                 'nonce': nonce,4 y- Z' U* L* T3 X
  80.                 'to': to,
    / P  S$ k1 Y) l2 X1 U
  81.                 'gas': 100000,& J% B' f2 x  c, J1 W; H
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    ' U5 i# x! ]0 x- s" v8 u7 R; w
  83.                 'value': self.web3.toWei(value, 'ether'),) G$ f/ s  i" q) K. G
  84.                 'chainId': 1, g+ j& _! o6 B; \3 Q
  85.             }1 q: p6 X6 K% G+ }; k' I. e
  86.             # 签名交易5 ~( i% w; {0 K! ~+ m) l
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)
    * O3 F7 M7 R# o$ q! G& A# r( W
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)
      R1 X9 ]4 N( X/ B* M6 @8 K
  89.             return self.web3.toHex(tx_hash), 'pay success'
    # S. U4 C- K  x" n5 s
  90.         except Exception as e:: @# Q. e+ G+ [8 H
  91.             logging.error(f'转账eth时发生异常:{e}'), B$ \7 Q1 a" g; ]; U
  92.             logging.exception(e)
    % b8 e7 D  M7 I( b3 V
  93.             return None, str(e)
    : I" C# ?4 ]7 c+ J# n* n
复制代码

' O4 J: R, l3 t7 r( `& Z
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13