Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py
1 d! u% M" O9 _. q; s% ?2 |/ a5 K- c
) H. i, @5 B5 O- p, ^& S: ]
  1. pip install web3.py
复制代码

6 [3 m0 A- ^6 h
1 e$ X( g6 {5 s( K2、注册 Infura 获得节点服务
% K6 _* A! l: n9 C$ y+ G. h6 z使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL
. w6 a: i  B4 c- E- ]* d 04ab0f6855e74cb6b49a35b1f466da1f.png $ @6 K' v* D2 p+ Z3 h: |
& d& [& Q' F1 F) j
可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。2 J; |4 f( n3 m4 s* O: ?
: p  U. y) w7 L% ?! p
3、代码示例
9 ?0 a" ]; r( B

  1. : v( O5 \3 ?/ h- z! N
  2. from web3 import Web3/ E9 L8 ]. G" q* [; |% K' B
  3. import json
    & ~: N7 E+ M  _8 }6 B+ ?8 \  D/ k
  4. import time
    % O7 n2 y; D/ S
  5. import os/ V( e* r* y( ?
  6. import logging, F% u, F2 ^6 R5 O( c
  7. from django.conf import settings0 p9 K  F: ?4 m- l# M7 @5 F
  8. from decimal import Decimal( ]9 j: w( R* r' u. q) {

  9. $ k" O: |9 m6 D( p& Y
  10. " {3 Y& \1 g0 r: Z: W( k- ]
  11. class PayEthOrToken(object):) x$ j6 @! w; x4 ?
  12.    
    7 S7 w6 @7 n$ |8 Q% }3 K! ?
  13.     def __init__(self):5 i4 i- E* f! D1 z
  14.         # 设置web3
    ( Q1 E( b1 y% F* O7 i& A7 Z* G
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))
    5 ~) V4 r3 d& d8 N# f+ W
  16.         # token合约地址1 f; B) H5 d/ Y  U( a
  17.         self.contract_address = 'your contract address': @& _( W+ n7 M5 V' G3 m$ L
  18.         # 主钱包地址
    7 R) A2 K- e" u7 j7 f  Z" W
  19.         self.wallet = 'your wallet address'
      J% j5 N0 Q* M# V! ~" W$ Y1 h
  20.         # 钱包的私钥. ]1 Q. \  @2 A& y% }3 E+ C
  21.         self.wallet_key = 'your wallet key'  K- b2 m! v& _2 W0 g
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得2 L- t) B6 e% ?9 j# v
  23.         with open('test.json', 'r') as f:: Q9 `; h6 w9 [# g/ a
  24.             self.abi = json.loads(f.read()), H3 X% E1 H3 I# w% R
  25.         # 生成合约
    ) n' T$ D. z0 B
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi); {# P) k! {( m# H0 g$ s
  27.         # 代币简写
    * c$ d, l7 X) k2 T% Y, j1 R
  28.         self.token_name = 'USDT'
    & V2 R6 Y# \, i! v7 |6 A
  29.         & l. T4 s9 [0 t; r: R& I
  30.     def transfer_usdt(self, to, value):1 F8 I# @6 e, l/ t
  31.         '''进行代币转账
    6 \& s6 m. t4 X
  32.         args:! W4 h% z7 Q! h" i9 P0 W
  33.             to str:接收代币的地址
    : [$ S4 C9 V, |$ ]( u% m
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型
    6 H. O. p4 c6 z; ]; H8 \! n
  35.         returns:, C& B2 o9 V, k! R( |+ [
  36.             (str, str):返回交易哈希,以及异常信息% q5 i7 C2 y: s( G' H; U
  37.         '''
    " ?* y7 N$ A( e8 {. J* z
  38.         try:- v, R6 J; Z+ ~6 h* v' \$ K8 _% r
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')
    : {4 B/ L" {5 D% G
  40.             # 如果代币不足返回异常; L4 M. s& v) z$ O+ b9 Q! v4 I
  41.             if Decimal(token_balance) < Decimal(value):. |8 C  a+ O8 V( b2 j6 H4 S
  42.                 return None, 'Platform USDT token is insufficient, please try again later'
    2 i( w; _$ C6 Q( J+ C
  43.             # 进行转账代币8 L' O. N% x/ U- n. C' H
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet), g0 H+ p8 I% _+ E
  45.             tx = {3 Q# V; S* p" l' C% R. P9 L
  46.                 'from': self.wallet,8 k) u. [  }, V; _+ x/ n
  47.                 'nonce': nonce,
    0 o) \( _, b8 S7 T- N" Q$ B2 g
  48.                 'gas': 100000,; D$ M) N& r* Y  L# z& F
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),
    ' S0 c7 O$ K- C7 r5 }
  50.                 'chainId': 1. t/ {; i" [% J$ _" j
  51.             }
    ( H. I3 s" N" Q! H2 E9 X* y
  52.             to = Web3.toChecksumAddress(to)  t" k( B1 D) H7 d; y2 p6 k
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)  z) l) r3 h9 w! m9 `
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)8 r. `" E  q, L+ U
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)
    # o3 e  ^. E# S0 O3 H8 P  g
  56.             return self.web3.toHex(tx_hash), 'pay success'8 l8 ]9 B5 K3 k* ?& ?1 y
  57.         except Exception as e:4 \2 |' m6 x% r3 G
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')
    - U+ R; }# h5 A! q9 P
  59.             logging.exception(e)
    * ?$ c# A- g3 K/ ?" ]% U
  60.             return None, str(e)
    3 _% O& i# x$ l
  61.     ) D0 S6 R9 [. c1 X
  62.     def transfer_eth(self, to, value):
      K) z& p. m; O
  63.         '''进行eth转账
    % Q8 i; a2 p+ u# d4 v$ q
  64.         args:
    ! N2 A5 Z& ~7 T6 J0 e* k
  65.             to str:接收以太坊的地址
    - B6 K7 i- D: \, f2 J( b
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型
    . _  L; c7 c1 c. a. d/ q
  67.         returns:- T5 {+ b$ K$ k6 t2 _% V
  68.             str:返回交易哈希
    % u0 D. Y1 ~- ]% N, k
  69.         ''') P/ \! P  `" k& n9 J: M2 f9 Z
  70.         try:7 z. x0 [$ z9 ]
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')0 D, e6 @* o4 v9 u) x* g
  72.             # 如果代币不足返回异常
    . F( [  C" ^/ X: f, I" ?
  73.             if Decimal(token_balance) < Decimal(value):
    ( Q8 z+ J+ q* |2 A' @4 Z
  74.                 return None, 'Platform ETH token is insufficient, please try again later'* \3 H. n( S, d( c3 |3 K- g% C
  75.             # 获取 nonce,这个是交易计数( J4 ]1 p+ h, _; I
  76.             to = Web3.toChecksumAddress(to)
    3 e, {7 T3 j) i( M5 T( a/ k; t
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)+ ~& {$ F! |- S9 E: t8 [
  78.             tx = {
    ! O# D8 F, s( }' C7 Q# g
  79.                 'nonce': nonce,7 e8 _* c9 H1 \! _, B; b3 i; s
  80.                 'to': to,0 Q& k7 s) O% |3 ?  W2 \! s( u
  81.                 'gas': 100000,
    7 F8 L; A" ?2 ~8 \4 p
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),- @- f7 l, u8 G- @
  83.                 'value': self.web3.toWei(value, 'ether'),$ A1 S& q. v- f: R" k2 w' A
  84.                 'chainId': 1
    / s# \9 |' z6 q5 n
  85.             }) ~8 W4 R7 D3 U6 Y% t" I. S
  86.             # 签名交易
    2 [, p% A# G% }! {( u+ @
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)
    " g. L4 b3 X; O# u9 h6 ^
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)' H5 S7 v8 a7 ^4 H. ^: R/ |) g
  89.             return self.web3.toHex(tx_hash), 'pay success'7 ]6 Q- }0 r# W; X" A7 J
  90.         except Exception as e:
    ) h& t' s$ q; Y$ y6 A; S* P1 `
  91.             logging.error(f'转账eth时发生异常:{e}'), g9 B/ q1 r6 F" t/ E* ^8 N. M/ x1 i
  92.             logging.exception(e)
    & h+ u% N8 h9 i' E! B, \
  93.             return None, str(e); r3 k% d3 v' q8 w# D% u3 T
复制代码

- g" l# |3 o  H& N
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13