Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
1、安装 Web3.py
0 a% v7 g$ h! l5 {5 t" `
+ o% w) \& }8 O; K7 E
  1. pip install web3.py
复制代码

- i! K" u% D$ U/ u% z; U" M( U, n5 X; F
2、注册 Infura 获得节点服务3 D7 o" b- U- _, |; r
使用邮箱注册 Infura 账户后,创建一个项目,即可获得以太坊节点服务,进入设置即可看到链接的URL0 p  [* |* C8 v% q* B
04ab0f6855e74cb6b49a35b1f466da1f.png ( \# |3 [$ a- E5 O
5 J* o# C6 ?  @2 f
可以选择主网测试网等,会有两个链接,一个是使用HTTPS的一个是使用WebSocket,按你的需求选择一个就行了,注意:Infura 个人免费请求次数,是每天有十万个请求。
/ q. I  X8 u% x( @: p2 P' B) V
- d( `. a& o: N1 ^( k$ p% t% }3、代码示例 . O8 |$ n' T9 r0 @  _+ w

  1. * b) M0 `% @8 Z
  2. from web3 import Web34 N' o! M+ J2 M- L0 M
  3. import json1 E1 V$ Q, o5 N# s
  4. import time
    1 T3 h" g! J9 ~' {) r5 K) g
  5. import os
    2 ?! S0 T% T6 n  R  A! W1 T
  6. import logging8 b- {3 f4 J. ~$ p
  7. from django.conf import settings- t. r. `( ]$ O# d1 [' O" N
  8. from decimal import Decimal7 K; W8 F) w* z
  9. 3 z1 @0 b4 v# [- v
  10. 1 y" a; P! O7 W0 o0 U  @
  11. class PayEthOrToken(object):
    ' |- \0 l3 y% f1 p) o) E0 B8 M3 Q
  12.     . N2 w" X! m6 ]0 B5 ^* f% o' r
  13.     def __init__(self):
    . x& N8 G5 u( |1 B7 O
  14.         # 设置web3
    , @+ @9 Y- w2 F, R7 G+ N8 O( Z* a  c: b
  15.         self.web3 = Web3(Web3.HTTPProvider('your infura http url'))# Q  M) l2 g6 b/ w+ x- V- G. }0 s
  16.         # token合约地址
    ) P1 u: K# V% \3 C  U8 |' P
  17.         self.contract_address = 'your contract address'
    3 G7 }" N/ W: l) o
  18.         # 主钱包地址7 b2 q6 S/ ?/ o. Z8 I7 i
  19.         self.wallet = 'your wallet address'6 y4 ?. Y/ g4 e
  20.         # 钱包的私钥
    ! _- q$ f5 o/ N. A
  21.         self.wallet_key = 'your wallet key'
    0 ^! `, p2 K$ {8 l) t
  22.         # 合约的abi test.json 是eth的abi json文件,可以在eth区块链浏览器上获得5 M1 a, Q; j: B
  23.         with open('test.json', 'r') as f:
    % D' y2 e7 a9 l. C3 D
  24.             self.abi = json.loads(f.read())
    % `2 A% c3 t+ p# y( V& B! U, l
  25.         # 生成合约) K0 S2 a1 P6 [4 j5 z
  26.         self.contract = self.web3.eth.contract(address=self.contract_address, abi=self.abi)
      O1 z$ d6 \8 z% a. ~; A1 i
  27.         # 代币简写
    ! }/ x, C, o: C
  28.         self.token_name = 'USDT'; l0 D) `$ W3 M, y( z" t
  29.         
    % v* R, t9 |) R3 @( V1 C6 J# u- S
  30.     def transfer_usdt(self, to, value):
    * T, E4 ~( d: I* D# d
  31.         '''进行代币转账- s0 o8 w4 ~" x+ {6 [
  32.         args:- }3 U' L" a4 p9 i" }
  33.             to str:接收代币的地址
    - x3 ~  u* e) ~0 W% s6 Z5 P
  34.             value str/int:代币数量,以ether为单位,可以是字符串和int类型
    7 {8 s& K: o) [8 e: T8 z2 l. e* N
  35.         returns:
    $ v. e* B4 A* [
  36.             (str, str):返回交易哈希,以及异常信息1 Q, {2 R7 U! L0 v: F+ o! E
  37.         '''
    6 P& Q" e& z' A' _4 B! V
  38.         try:" ~4 X. q8 F, C  c
  39.             token_balance = self.web3.fromWei(self.contract.functions.balanceOf(self.wallet).call(), 'ether')
    2 `  O8 p( p  U) x$ J' O: k
  40.             # 如果代币不足返回异常% j6 O% a4 h# H/ o
  41.             if Decimal(token_balance) < Decimal(value):
    : p& `* Q; g+ t3 b" P" m
  42.                 return None, 'Platform USDT token is insufficient, please try again later'7 w- Q* L8 j& M' m1 C
  43.             # 进行转账代币4 M/ c# E: |  U3 q$ J1 F' A
  44.             nonce = self.web3.eth.get_transaction_count(self.wallet)+ \# {# c3 _* l+ g4 u/ j
  45.             tx = {
    0 h5 q4 u+ n5 ]
  46.                 'from': self.wallet," Q* D! X& I  F4 M' |  n) V8 M, S
  47.                 'nonce': nonce,
    9 [0 M$ H& E/ H9 g
  48.                 'gas': 100000,
    / B1 a  l! |" w8 X( _* @
  49.                 'gasPrice': self.web3.toWei('50', 'gwei'),: Q# c$ v; [, M9 K2 u* U
  50.                 'chainId': 1
    . J7 S- C) \7 [3 q0 F- c
  51.             }! r5 A4 s  r/ v# L; j* j
  52.             to = Web3.toChecksumAddress(to)! \' H6 a5 k8 h5 K9 ?8 ~# T# Q( }$ ?
  53.             txn = self.contract.functions.transfer(to, self.web3.toWei(value, 'ether')).buildTransaction(tx)
    : B5 P; D' ]- J) g& }
  54.             signed_txn = self.web3.eth.account.sign_transaction(txn, private_key=self.wallet_key)
    & ]: N* W  h$ V( C" n" n( ]
  55.             tx_hash = self.web3.eth.send_raw_transaction(signed_txn.rawTransaction)* e+ \+ X7 {; A/ Q' w
  56.             return self.web3.toHex(tx_hash), 'pay success'. Q3 w) E6 Q  W$ ~: z- S
  57.         except Exception as e:2 Q" O- ^; a& i* f& T. B
  58.             logging.error(f'转账{self.token_name}代币时发生异常:{e}')5 z0 }# b6 J* m6 x
  59.             logging.exception(e)1 h* n1 v; `) g4 J* N/ T/ x
  60.             return None, str(e)
    * r3 `7 U+ J9 o. l
  61.    
    0 N! L$ {. ]. i2 y# Z; j; _0 o
  62.     def transfer_eth(self, to, value):
    ) a9 I# U7 x$ e) c( `9 ]9 [2 i
  63.         '''进行eth转账5 |3 k8 C0 j+ J% ~; C& z
  64.         args:
    0 `. H" V4 M9 ^+ Q6 j7 _
  65.             to str:接收以太坊的地址' I7 S% c) T) }3 O1 ~+ m
  66.             value str/int:数量,以ether为单位,可以是字符串和int类型
    ) U5 Y/ h6 C6 j4 |/ f
  67.         returns:4 E$ v' I, y2 @1 @5 z0 v
  68.             str:返回交易哈希
      b! X7 u0 D5 b* s( j+ J6 ?
  69.         '''
    " ^; {2 }: K% j  c" {
  70.         try:
    , {# |* _0 a9 j3 N" Y
  71.             token_balance = self.web3.fromWei(self.web3.eth.get_balance(self.wallet), 'ether')
    6 L7 D, T( A  E$ L  E
  72.             # 如果代币不足返回异常
    + t2 f& [  N8 }# ]3 P5 r( c
  73.             if Decimal(token_balance) < Decimal(value):  J+ H* z+ l- L1 i9 D
  74.                 return None, 'Platform ETH token is insufficient, please try again later'
    6 e2 j5 i4 k4 Y7 T5 A1 n- h5 H
  75.             # 获取 nonce,这个是交易计数
    ! T5 U4 F9 H# s6 M4 V( `  E7 u, N
  76.             to = Web3.toChecksumAddress(to)! Z1 d  q& E2 P* d
  77.             nonce = self.web3.eth.get_transaction_count(self.wallet)6 `, F  @+ N3 X# k1 O3 {
  78.             tx = {; D- }; z* h* d# a3 G& Y
  79.                 'nonce': nonce,. ~& }! f9 d" O+ E5 ?/ H1 h
  80.                 'to': to,  T1 Y( q( M& N) }# a% o7 _
  81.                 'gas': 100000,
    6 F+ p, j+ S* v, _1 g6 }- o+ {
  82.                 'gasPrice': self.web3.toWei('50', 'gwei'),( W" i7 [; N# e% {) }7 o- j# H
  83.                 'value': self.web3.toWei(value, 'ether'),5 p8 W  J5 D1 B7 y4 K
  84.                 'chainId': 13 l) z' g5 U: g2 v: p
  85.             }: K& k+ ~& B' L9 g& O+ r8 `+ h) G# I
  86.             # 签名交易
    & P2 Z8 p+ t5 v# e9 k& L0 B
  87.             signed_tx = self.web3.eth.account.sign_transaction(tx, self.wallet_key)5 i6 U: m+ Y# |4 m
  88.             tx_hash = self.web3.eth.send_raw_transaction(signed_tx.rawTransaction)
    6 a$ Q0 b/ R* o! O
  89.             return self.web3.toHex(tx_hash), 'pay success'! J& C' X6 i# J2 G
  90.         except Exception as e:
    2 e7 `; Z, G1 Z! a
  91.             logging.error(f'转账eth时发生异常:{e}')6 b, B' N% T1 R! f$ R
  92.             logging.exception(e)
    ( s4 m0 x* v* ^% f9 m8 d
  93.             return None, str(e)
    & s% G/ a4 D9 R1 z7 g, Z
复制代码
8 r& I% D. X( S, P; }# ^. J
标签: Python 代币转账
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

常德小学生 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13