Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py. E; w9 r8 W6 X
& `- i# a5 X* s) I
  1. pip install web3.py
复制代码
* @0 `, k6 f! N3 F4 D) G) y

  t; T( ^: E% d3 K- A' U2、注册 Infura 获得节点服务1 f2 Z# v* ]/ K& I/ ~5 U  L
使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL/ H' U: M# ~5 D) k! h7 y* }
04ab0f6855e74cb6b49a35b1f466da1f.png % h% T+ L  b+ S( Q  J: ?9 g# N
9 Q1 J# E0 O, P0 L( F3 P
可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。
! t) l4 I# _) R7 m& P0 k+ z/ A# l/ k. Z" L$ \. {8 d6 V
3、代码示例
( a  j# d5 i8 b: u* a! f
  1. 1 h, W) F* y7 M7 e1 S
  2. from web3 import Web3
    2 }6 x8 r9 O: M6 T7 J! P. j7 ^* N! a
  3. import json8 d7 M1 p7 c' g4 |9 N
  4. import time
    4 E$ a) m! P* \7 Q4 R# ~
  5. import os
    % q. i# O! r* b8 l! j
  6. import logging! X$ J$ R" k) E0 \) W9 c
  7. from django.conf import settings& A1 V- P$ Z/ i) C# T' G! E
  8. from decimal import Decimal
    3 L) S) U; S+ R9 I' N
  9. 3 {# f, b; }3 }) C4 L* W3 S* G
  10. 6 u* q1 d$ j( M' x+ z
  11. class PayEthOrToken(object):+ H& S1 P  P/ [0 D9 L
  12.     # l4 ~6 ]) R; O' x% t; b; H
  13.     def __init__(self):% N7 l8 c( c+ v% ~# Z
  14.         # 设置web3
    4 v. ?$ ]& O! ]0 }6 F
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))
    3 }+ q! _/ u7 A" \, i! u
  16.         # token合约地址
    - q6 j$ H  o+ K/ |" E
  17.         self.contract_address = 'your contract address'' @, R" \) K. L2 ~' }! N! u
  18.         # 主钱包地址4 o; L; j& r- F$ K5 h. _1 V
  19.         self.wallet = 'your wallet address'
    : Y9 |; F$ S/ d: A( T# i- B
  20.         # 钱包的私钥+ B6 w/ o5 S" |! ]" m
  21.         self.wallet_key = 'your wallet key'& x6 a& L& ~$ }  `
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得: C4 X$ J! e2 p$ ?$ d) S
  23.         with open('test.json', 'r') as f:
    # h* i: T8 I4 ?7 }2 W
  24.             self.abi = json.loads(f.read())
    " ]1 a0 `9 }% @1 F, a
  25.         # 生成合约: K/ Q+ K" {8 |2 Q+ ~2 N+ W
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)8 Q$ B5 m& ~9 U+ F1 i
  27.         # 代币简写4 [: h( _) n1 k
  28.         self.token_name = 'USDT'; H4 y( e% E$ N# X! M4 V$ ]9 G) U
  29.         / f, r- {2 _  m" T  ^
  30.     def transfer_usdt(self, to, value):5 C" H! f$ }2 X1 L( W' l
  31.         '''进行代币转账
    + f1 x' O/ l4 {& q
  32.         args:
      Z, F' {% u, |' j) p" i$ u
  33.             to str:接收代币的地址( W' N3 X% N7 L- ]$ M, V( ?& Z' h+ E
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型
    9 j, S& _8 u0 r. C3 U
  35.         returns:
    9 S1 S9 G5 r$ r
  36.             (str, str):返回交易哈希,以及异常信息, ^+ G" }! T2 k* k: z4 o
  37.         '''# b! y+ }3 o3 X! u
  38.         try:0 i; c* h: ]4 D$ I, w/ c3 p+ \, R, b
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')( T  p% k$ N! r; A
  40.             # 如果代币不足返回异常# c1 M# p$ c. k  o/ ^, |3 n7 f' e
  41.             if Decimal(token_balance) < Decimal(value):
    9 L, G9 U; O/ b' m/ j0 d
  42.                 return None, 'Platform USDT token is insufficient, please try again later'
    ) \) I  `% e. Z' J. a
  43.             # 进行转账代币. L/ I5 m$ r- T- V4 M3 [6 @
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)0 d* R0 I: W) |5 T' D6 a! p' l
  45.             tx = {
    " Z: u6 c& N- `  C. ?) B
  46.                 'from': self.wallet,
    : `* n; X2 A/ w- k
  47.                 'nonce': nonce,, {; Y1 f* V4 t/ \1 b/ K- Z
  48.                 'gas': 100000,9 ^. L, d6 a6 ?2 h% q/ u  o
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    8 H( f% I% u: s$ B
  50.                 'chainId': 1
    % x: l* ^0 I6 B
  51.             }9 Y# o" A* z; c' \  p
  52.             to = Web3.toChecksumAddress(to)' B. a8 S. p$ E+ p% Y  A
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)3 @8 h/ |" D% @' \" S/ E
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)
    - S& T. z9 R  ~" ?
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)  M; y, j' d' l2 K0 b
  56.             return self.web3.toHex(tx_hash), 'pay success'$ W/ q0 S/ A$ }
  57.         except Exception as e:
    3 H& j7 D' O7 G+ B
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')
    6 x& H/ ~; n- v, d5 ~" y
  59.             logging.exception(e): L/ _5 S- m. V2 j8 I2 x5 {$ d
  60.             return None, str(e)
    3 Z$ l8 J, ^4 s  ]- `
  61.    
    + {( R5 t+ F  S6 p
  62.     def transfer_eth(self, to, value):2 ]8 l+ Q6 g# ^* U1 Z
  63.         '''进行eth转账
    1 `6 V8 B3 E3 Y8 M" c% r
  64.         args:
    " C' K: |" u! J8 j
  65.             to str:接收以太坊的地址- b+ ]' l5 K* w; z: q0 y
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型
    7 g( ]! S7 ^* Y
  67.         returns:
    ' f! \/ {7 I( p8 [  Y, E- ]  C0 Y9 n
  68.             str:返回交易哈希
    & y- k' C2 h$ X& B% i
  69.         '''1 e  w+ ]/ ]9 l% C. _
  70.         try:# w9 O/ s8 C( B3 o% Q, Z/ M# {
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')  }* K! R; ?* |" {
  72.             # 如果代币不足返回异常
    1 `5 K8 c( F  Z
  73.             if Decimal(token_balance) < Decimal(value):
    3 {( D" I) |3 `: T9 a) N/ S
  74.                 return None, 'Platform ETH token is insufficient, please try again later'. y: P5 m5 U- A4 y
  75.             # 获取 nonce,这个是交易计数# k6 v# l# Y' Q  Y; l( \
  76.             to = Web3.toChecksumAddress(to)7 ^4 r3 v& }4 Q* S1 R/ k6 A# v
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    / E; A$ ?" C+ [8 v4 f( e$ J: n
  78.             tx = {- L% h. w# X0 e" F$ v6 S' B
  79.                 'nonce': nonce,
    0 D# d7 `0 `* N
  80.                 'to': to,) j$ K0 Q! w  s  L
  81.                 'gas': 100000,3 K7 z" i4 L+ j5 H9 M. [
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    ) ~0 [9 K$ p$ G, C
  83.                 'value': self.web3.toWei(value, 'ether'),& u; d  N& f8 M. K3 L7 Q  Q
  84.                 'chainId': 1  Y" s8 M2 t& v
  85.             }
    & k5 `! V# u/ n1 m6 [
  86.             # 签名交易3 u/ b$ O0 _+ N, p* {$ F; @& o! J
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key). H/ U2 S( i! y; ?! ~
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)
    # \- x$ W: U/ t  I+ ?
  89.             return self.web3.toHex(tx_hash), 'pay success'
    " {9 }  v9 e, f1 {# w
  90.         except Exception as e:
    " I: y, _0 b) G2 x4 N$ h
  91.             logging.error(f'转账eth时发生异常:{e}')
    $ x2 Y- N! o- \1 @0 l2 x- U/ \! Y
  92.             logging.exception(e)& j  T/ `+ p" n8 a" p
  93.             return None, str(e)+ [; r4 \# c# }9 ]7 h/ d& x
复制代码
) }6 y! j/ z1 t2 B: B, j; `9 B9 r8 g
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13