Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py# r. Y) ^) H4 f& c( f1 J9 K; d; D
$ v4 o7 I1 n% c
  1. pip install web3.py
复制代码

! R0 G6 s6 z2 q' k' f
, h5 _# ?$ u% k: b" {8 X( }- ]2、注册 Infura 获得节点服务
' h* b' Y5 \" f. |使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL
& [0 [( ]/ w, m  l6 F 04ab0f6855e74cb6b49a35b1f466da1f.png
/ b$ y) _" U( K, n  J1 ~% I* G7 N8 }( s+ r1 p
可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。( s3 ~% p. H: P$ H

6 Y4 e! K5 Q. ^& \) \3、代码示例
: G( n8 \8 C8 O

  1. 7 C4 F/ x, W7 |* O) E
  2. from web3 import Web35 v8 J$ n$ y, M3 D& ^8 v3 d
  3. import json0 I0 z5 L$ p, E: S! H5 r
  4. import time3 Q2 r# [' n0 [1 B  L3 a
  5. import os& r% ]+ R7 ^' W+ u- K6 `
  6. import logging
    ( c- r. B- L7 i" R$ [
  7. from django.conf import settings
    2 Q9 X, U. r3 `' t
  8. from decimal import Decimal# Z, d3 r- {' U, j" \

  9. 7 g9 g& h1 o! w; _( m* J- R
  10. : Q. G' Q  G4 [# U8 N/ }5 O6 n
  11. class PayEthOrToken(object):9 s9 a& b' ~) h) t- |+ E
  12.    
    : S9 ?# a; o% m5 }3 d
  13.     def __init__(self):  a! q* h5 J* }: ^+ x/ |: }
  14.         # 设置web35 r$ Z7 L# a$ a4 r+ e" y
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))
    4 h4 P) s+ G1 _# ?, t3 a0 M" M0 q
  16.         # token合约地址
    7 L4 e' Y5 s- H- L, ]8 ]& ~2 i( C/ @
  17.         self.contract_address = 'your contract address'
    / s+ q% C) A2 L) o
  18.         # 主钱包地址
    ' F5 V# _7 e+ x. k$ O
  19.         self.wallet = 'your wallet address'4 L' Y5 x  C3 l0 x/ F( M& A% M
  20.         # 钱包的私钥
    1 o# Q4 N& n+ i4 l- l* V
  21.         self.wallet_key = 'your wallet key'  S# m9 @4 }" n! b8 _! F
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得
    6 P: r9 a2 D6 [1 L% D, C( n) x; E
  23.         with open('test.json', 'r') as f:
    7 Q+ |7 X' J$ ?/ V4 q
  24.             self.abi = json.loads(f.read())  m4 H4 q9 n! l2 Z
  25.         # 生成合约. e, w+ g  C2 ], ?- s0 N! y
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)1 e4 p2 q% _4 Z* X' K
  27.         # 代币简写7 J. e, ]8 b2 S
  28.         self.token_name = 'USDT'
    ' A) M& [' I0 P1 J0 J$ j4 Z
  29.         , P/ T, L4 B: O9 Z' R% s! a
  30.     def transfer_usdt(self, to, value):
    . a4 j$ O  {3 S4 c8 N0 h2 [
  31.         '''进行代币转账2 @+ \! v+ H( r
  32.         args:
    / ?' B4 |( ]. m' ^
  33.             to str:接收代币的地址' z2 _, k3 U5 J; P9 q3 M  ~
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型
    & V0 j+ y: g* [( U1 F" k# k
  35.         returns:
    % R; c0 ~- r+ L$ F3 T3 H4 z
  36.             (str, str):返回交易哈希,以及异常信息1 p( ]0 z, c  J8 O! c- d; h
  37.         '''* Q# l9 w0 l3 {- y5 o9 T
  38.         try:
    " o: p% g  L' h: U8 R
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')' d7 g0 p: K8 g, J( q6 t) }6 ]' ^
  40.             # 如果代币不足返回异常
    & q9 Q$ H" U8 [# f
  41.             if Decimal(token_balance) < Decimal(value):
    8 n8 I6 ~, |9 X. }/ ~
  42.                 return None, 'Platform USDT token is insufficient, please try again later', W  B* e* ]5 P4 O# u, m: ^' r
  43.             # 进行转账代币
    , @% H5 }. `4 v, t1 z/ R5 @
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)1 \, i( Z" ]( N! F1 z3 U
  45.             tx = {% i' S/ q: Q0 _7 m6 n
  46.                 'from': self.wallet,
    / O0 A* J" P6 _3 I
  47.                 'nonce': nonce,
    # U0 v& A. N& T8 d
  48.                 'gas': 100000,- d1 Z5 {+ q- S" Z  S+ c
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),; z* |! T% @! j2 x, E7 J( A5 O
  50.                 'chainId': 1
    7 \* o/ v# [7 P7 f) C! [
  51.             }! n* o8 D& h/ p: O8 N; }
  52.             to = Web3.toChecksumAddress(to)
    # d2 ^, H$ Y2 y) b/ n
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)
    ) Y9 s0 W8 z, b0 W- e
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)
    0 }1 }3 p: T' `+ _% u
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)
    * k, S! K3 {$ W) m) s4 y$ L
  56.             return self.web3.toHex(tx_hash), 'pay success'/ n+ Z  j7 Z, r% p! T8 _0 a" G7 R( o
  57.         except Exception as e:
    ; H& e0 ~% F! E$ L
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')
    6 I1 Q8 v; @2 f
  59.             logging.exception(e)
    % @( ^7 l2 e  H* W2 Y
  60.             return None, str(e)
    5 S. t  Z7 [7 l- {
  61.     2 ^) p! ]5 `  p; c$ A
  62.     def transfer_eth(self, to, value):
    $ E/ R5 Z4 g% Q: `
  63.         '''进行eth转账! T5 w% E# `% U- \
  64.         args:# \; I4 Q4 y" y* N3 Q$ Z/ x
  65.             to str:接收以太坊的地址
    / [, P2 `  @" i- ~
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型' ^8 t9 G5 x1 N6 T) Y
  67.         returns:
    6 \- I1 |9 v1 R# G0 M
  68.             str:返回交易哈希% t1 t- A( b; u- g- ^
  69.         '''9 d9 k  J! @( Y) S+ J
  70.         try:5 o! r( h5 Y' w: L+ P( Q
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')1 ?' y3 c8 [% z4 v5 R" `" h
  72.             # 如果代币不足返回异常! H6 x9 k/ U: ^
  73.             if Decimal(token_balance) < Decimal(value):
      S% _8 o9 u) m; l( w
  74.                 return None, 'Platform ETH token is insufficient, please try again later'
    ( ]3 G; v6 ~7 y+ F
  75.             # 获取 nonce,这个是交易计数' W2 q+ |* {, M6 k
  76.             to = Web3.toChecksumAddress(to)
    ) |$ E- m4 c- ~3 i. T
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    3 v/ K3 @8 R) x8 h1 h
  78.             tx = {
    , a2 i/ c$ M9 C: x
  79.                 'nonce': nonce,
    1 r$ \# n/ m% ?% j
  80.                 'to': to,
    & _! b) \2 v) A7 r/ r' e
  81.                 'gas': 100000,: O8 m) |/ {- J
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),9 X7 R* K' T) t) s% @, {4 H- `
  83.                 'value': self.web3.toWei(value, 'ether'),
    # c& A; I! D$ b: u8 P9 a: F" Q
  84.                 'chainId': 1# }6 f" ?6 o6 K3 H" w: K
  85.             }
    - F/ M( Z% q4 a3 M& a8 o
  86.             # 签名交易* L1 F' i, L" G( z+ w
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)- {3 J- z* j+ B( N+ F
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)
    2 k) ]% q; i4 y: v4 o0 N
  89.             return self.web3.toHex(tx_hash), 'pay success'
    % s; F9 S& [  G2 u. B
  90.         except Exception as e:' G- G( u: p" @! u, k
  91.             logging.error(f'转账eth时发生异常:{e}')  ~! W5 e+ K) C5 z
  92.             logging.exception(e); c$ t/ w$ _3 Y( a7 w
  93.             return None, str(e)2 W2 @" d1 c7 x+ `
复制代码
  `4 g( Q9 F/ \3 O* L7 `( g' J: L
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13