Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py
6 [2 V  C; E& l$ M6 H1 b" a5 z! X; c
  1. pip install web3.py
复制代码
; D5 J6 Z. [7 m6 R8 ]

9 C! V' j' `" U6 @2、注册 Infura 获得节点服务
4 l# i# s- G1 y# w4 _使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL' N: j+ W$ }# c$ f6 X$ K  H; u
04ab0f6855e74cb6b49a35b1f466da1f.png 7 ^. }1 B8 }% _
) ?+ Q+ H% r, h0 k# y( v7 N. B
可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。
/ E! J0 B0 K4 o' g1 Y' I
$ F! }& q8 P4 u2 x5 k3、代码示例 . X1 C( a% [9 i2 @% V% B

  1. 3 Y+ H) B: x/ I8 W" w
  2. from web3 import Web3
    6 X5 O4 I  A# u3 B3 @
  3. import json
    , g1 x* p9 W' \. N& W6 Y8 N; q. d
  4. import time" |* ~4 u0 F5 c& d
  5. import os
    3 {# Z/ p8 n# r) e( s
  6. import logging
    ( X$ A. k+ C. P6 g
  7. from django.conf import settings) S2 q% C; A4 K+ r7 Z
  8. from decimal import Decimal7 r- X% ~% L, j0 }4 V; I! u

  9. ) u9 R+ o. r7 ~, V! q3 I% x
  10. 0 h! C# \/ o  F1 u2 L! x1 @
  11. class PayEthOrToken(object):- \& `% m7 g/ n% w- ]/ Z
  12.    
    3 H& X0 A, e1 H7 `2 Y6 k
  13.     def __init__(self):
    ! K0 K& ]: [: Q9 [
  14.         # 设置web3
    ( d- Y0 z& V- o* ^/ i
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))% S# e. i* X. r
  16.         # token合约地址
    ) `$ e9 M" ]/ w% {" f: {
  17.         self.contract_address = 'your contract address'( i: g; S- H0 b+ h8 c- K& F
  18.         # 主钱包地址
    % U! a0 h. c3 d
  19.         self.wallet = 'your wallet address'4 Q2 ?* ^' |! c0 u) T! ]* M
  20.         # 钱包的私钥
    * `: p. E. m1 R2 \
  21.         self.wallet_key = 'your wallet key'
    0 i& \/ ?: D' |! G! j0 f3 v
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得
    6 R1 N! V5 ~4 f- ^% a
  23.         with open('test.json', 'r') as f:" m- C. W; D: f" v: S5 m
  24.             self.abi = json.loads(f.read())6 i/ ]: |- }7 p3 L0 a/ i
  25.         # 生成合约
    % f) q' ]+ P! x& O0 N- \4 j* j3 x  a( H
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)" `4 [; c- V6 Z7 [9 p$ ^  W0 u  R3 d
  27.         # 代币简写
    ; c5 b( K& N# x1 L% q1 `
  28.         self.token_name = 'USDT'1 O' p  Y* P% \
  29.         3 p  a1 K+ ]* l2 X* ?7 K* z0 |
  30.     def transfer_usdt(self, to, value):
    9 C$ Y! [0 ^: I/ v; W( _
  31.         '''进行代币转账" S( [& H9 j* G9 Q& t% j
  32.         args:& O# |2 J8 s. e: Z8 g
  33.             to str:接收代币的地址
    . T0 o  s8 b. D# O& H" i
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型1 O* A. A* @2 L. E" k& Y+ ?+ R
  35.         returns:8 }: P: R. \  P. K( j
  36.             (str, str):返回交易哈希,以及异常信息
    2 v7 e7 o1 }7 r4 N8 n3 [/ i
  37.         '''
    % D8 M9 C. M' x1 i- c) D: p& ~
  38.         try:- Q# _4 ?9 M$ q: p1 @& l
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')  G! d. v& @3 P! \: ^) O; r
  40.             # 如果代币不足返回异常9 p* I" j1 Q4 j9 v7 y1 f* |' T/ D
  41.             if Decimal(token_balance) < Decimal(value):( `; B% g5 Q0 ~( E( c& Y) O
  42.                 return None, 'Platform USDT token is insufficient, please try again later'
    1 Z- \# m' D5 j2 @  s
  43.             # 进行转账代币2 B5 A' n$ M, Q
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)
    % M, R4 s# u3 K3 F; l: h
  45.             tx = {
    ; t4 C" J$ R! E; I, U
  46.                 'from': self.wallet,
    6 g' P7 Z4 G' L2 T% ?$ ?+ A+ ?
  47.                 'nonce': nonce,
    1 \; J5 v& w# M# Z$ |
  48.                 'gas': 100000,
    ; q+ k) `- W- _3 G  `) U
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),/ e; `4 p9 a1 x( B3 h
  50.                 'chainId': 16 m7 u, |& r- Z3 q7 s  }) E
  51.             }
    % e5 J* U; O* t3 L" W5 f3 _" h9 D3 \
  52.             to = Web3.toChecksumAddress(to)
    2 }" a$ L( l6 f
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)
    % K$ D9 ]" s( j  t
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)/ n. D5 v9 V- }
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)3 f; J. e4 M5 A( }
  56.             return self.web3.toHex(tx_hash), 'pay success'1 B* n" m/ Z/ X5 j" b: c
  57.         except Exception as e:+ Y( _3 J) l2 C3 n: x
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')1 u- v% l$ r, I6 O% `- }3 R2 j
  59.             logging.exception(e)1 [' @8 \. g2 k+ h* k
  60.             return None, str(e)
    $ _( R8 \( F  c. t5 S
  61.     - i- ~. i7 R& [
  62.     def transfer_eth(self, to, value):2 i* e' g' B+ f
  63.         '''进行eth转账
    2 R8 ~: K! r; N# }  w6 R
  64.         args:. c3 _' D/ t6 k, Y( L
  65.             to str:接收以太坊的地址8 W% C. _# q: \4 `
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型; n9 ~# p2 j% i4 w
  67.         returns:
    2 M- u, @: W& E; f% L" d
  68.             str:返回交易哈希7 e3 h' N& v+ L: q/ C9 z. G+ @
  69.         '''
    % d2 Z9 r9 i9 \) @- n* W
  70.         try:
    " s& [9 o& T5 g. D+ q
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')/ X9 f1 ?& c( A- t5 B" u
  72.             # 如果代币不足返回异常( W0 Y4 Z( a. j: P6 l% |
  73.             if Decimal(token_balance) < Decimal(value):: @6 `( M" d" L
  74.                 return None, 'Platform ETH token is insufficient, please try again later'# x) B7 W1 k% U" Y
  75.             # 获取 nonce,这个是交易计数
    & f: V+ f6 x) d* t
  76.             to = Web3.toChecksumAddress(to)8 @) e$ v. X& `( ~9 ~0 U/ g* L
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet), a$ X8 U/ O" F9 _2 b) h
  78.             tx = {
    & i" j: s# K! ^: n- @" O
  79.                 'nonce': nonce,
    " y2 v) L- h; |5 [, c/ x/ G
  80.                 'to': to,) ]% {& W- C* E8 l) L# z
  81.                 'gas': 100000,
    7 T: D- q3 ^* ~# g$ R+ j$ r/ ^
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    ; z# J' D* g' c$ f, r
  83.                 'value': self.web3.toWei(value, 'ether'),2 b. k, O2 D+ j! e+ Z5 C. T* S
  84.                 'chainId': 1
    & j2 b6 K  B7 j  |$ Q+ Q- |5 ^
  85.             }& V1 l+ ~2 W* H. f# c
  86.             # 签名交易. t9 m! @2 L& G( [; ]4 {; h
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)" Z$ w8 D$ V. J
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)
    / E  M: @9 I8 T9 ^- a& _, A  G$ e
  89.             return self.web3.toHex(tx_hash), 'pay success'
    ! v( T4 v% W, C- M7 H; _
  90.         except Exception as e:
    3 b2 L1 x; l2 ]7 R8 C3 M' r' `$ E. n
  91.             logging.error(f'转账eth时发生异常:{e}')
    5 b1 k  W# V' s9 {( n
  92.             logging.exception(e)% ?* Y( `) u0 H) F2 E6 P
  93.             return None, str(e)4 ?& C  t7 ?4 Q" K! t
复制代码
" P& g. K( I3 a* ?- w/ X
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13