1919import json
2020import sys
2121import time
22- from ctypes import byref , c_char_p
22+ from ctypes import byref , c_char_p , POINTER , c_void_p , c_int
2323
24+ from bcos3sdk .bcos3callbackfuture import BcosCallbackFuture
25+ from bcos3sdk .bcos3datadef import *
2426from bcos3sdk .bcos3sdkconfig import Bcos3SDKConfig
27+ from client .datatype_parser import DatatypeParser
2528from client_config import client_config
26- from bcos3sdk .bcos3sdk_wrap import NativeBcos3sdk , BcosCallbackFuture , \
27- s2b , b2s
29+ from bcos3sdk .bcos3sdk_wrap import NativeBcos3sdk , \
30+ BCOS_AMOP_SUB_CALLBACK_FUNC , BCOS_AMOP_PUBLISH_CALLBACK_FUNC
2831from client import clientlogger
2932from client .bcoserror import BcosException
3033from client .common import common
@@ -126,6 +129,20 @@ def init_clib_sdk(self):
126129 self .chainid = self .bcossdk .bcos_sdk_get_group_chain_id (self .bcossdk .sdk , s2b (self .group ))
127130 return 0
128131
132+ def get_last_errormsg (self ):
133+ res = self .bcossdk .bcos_sdk_get_last_error_msg ()
134+ return b2s (res )
135+
136+
137+ def get_last_error (self ):
138+ res = self .bcossdk .bcos_sdk_get_last_error ()
139+ return res
140+
141+ def get_last_error_full (self ):
142+ ret = self .get_last_error ()
143+ msg = self .get_last_errormsg ()
144+ return (ret ,msg )
145+
129146 # load the account from keyfile
130147 def load_default_account (self ):
131148 if self .default_from_account_signer is not None :
@@ -174,20 +191,26 @@ def getinfo(self):
174191 return info
175192
176193 def wait_result (self , future : BcosCallbackFuture ):
177- if future .wait ().is_timeout :
194+ (is_timeout , response ) = future .wait ()
195+ if is_timeout :
178196 raise BcosException (f"bcos sdk timeout { future .context .msg } " )
179197 # print(f"response context(callback): {future.context_callback.detail()}")
180- return self .get_result (future .data )
198+ return self .get_result (response .data )
181199
182200 def get_result (self , response_data ):
183201 # print(f"data is {response_data}")
184202 if response_data is None or len (response_data ) == 0 :
185- raise BcosException (f"Response error: { response_data } " )
186- response = json .loads (response_data )
203+ raise BcosException (f"Response error: { [response_data ]} " )
204+ try :
205+ #处理可能不是json的情况
206+ response = json .loads (response_data )
207+ except Exception as e :
208+ return response_data
187209 if "error" in response :
188210 raise BcosException (response_data )
189211 if "result" not in response :
190212 raise BcosException (response_data )
213+
191214 # print(f"response :{response}")
192215 result = response ["result" ]
193216 if type (result ) is str :
@@ -483,3 +506,70 @@ def deployFromFile(
483506
484507 result = self .deploy (contractbin , contract_abi , fn_args )
485508 return result
509+
510+
511+ def event_subscribe (self ,address ,event_name = "" ,contract_abi = "" ,topics = [],fromBlock = - 1 ,toBlock = - 1 ):
512+ event_param = dict ()
513+ event_param ["fromBlock" ] = fromBlock # -1 表示最新
514+ event_param ["toBlock" ] = toBlock # -1表示最新
515+ event_param ["address" ] = [address ] # sample helloWorld address
516+ if topics is not None and len (topics )> 0 :
517+ event_param ["topics" ] = topics
518+ else :
519+ #根据event_name获取topics,一般采用这种方法
520+ parser = DatatypeParser ()
521+ parser .set_abi (contract_abi )
522+ eventtopic = parser .topic_from_event_name (event_name )
523+ event_param ["topics" ]= [eventtopic ]
524+
525+ event_param_json = json .dumps (event_param )
526+ cbfuture = BcosCallbackFuture (sys ._getframe ().f_code .co_name , "" )
527+ subid = self .bcossdk .bcos_event_sub_subscribe_event (self .bcossdk .sdk , s2b (self .group ), s2b (event_param_json ), cbfuture .callback ,
528+ byref (cbfuture .context ))
529+ return (subid ,cbfuture )
530+
531+ def event_unsubscribe (self ,subid ):
532+ self .bcossdk .bcos_event_sub_unsubscribe_event (subid )
533+
534+
535+ def amop_subscribe (self ,topiclist ):
536+ ctopiclist = strarr2ctypes (topiclist )
537+ self .bcossdk .bcos_amop_subscribe_topic (self .bcossdk .sdk , ctopiclist , len (ctopiclist ))
538+
539+ def amop_set_subscribe_topic_cb (self ,cbfunc ,context_ ):
540+ context = 0
541+ if context_ is not None and context_ != 0 :
542+ context = byref (context_ )
543+ self .bcossdk .bcos_amop_set_subscribe_topic_cb (self .bcossdk .sdk ,(BCOS_AMOP_SUB_CALLBACK_FUNC )(cbfunc ),
544+ context )
545+
546+
547+ callback = None
548+ def amop_subscribe_with_cb (self ,topic ):
549+
550+ cbfuture = BcosCallbackFuture (sys ._getframe ().f_code .co_name , "" )
551+
552+ #self.callback = BCOS_AMOP_SUB_CALLBACK_FUNC(cbfuture.amop_callback)
553+ self .bcossdk .bcos_amop_subscribe_topic_with_cb (self .bcossdk .sdk ,s2b (topic ),
554+ cbfuture .amop_callback ,
555+ byref (cbfuture .context ))
556+ return cbfuture
557+
558+ def amop_publish (self ,topic ,data ,future = None ,timeout_ = 10000 ):
559+ if future == None :
560+ future = BcosCallbackFuture (sys ._getframe ().f_code .co_name , "" )
561+ cbfunc = future .amop_publish_callback
562+ #print("publish callback: ",cbfunc)
563+ self .bcossdk .bcos_amop_publish (self .bcossdk .sdk , s2b (topic ),
564+ (s2b (data )), len (data ),
565+ (c_int )(timeout_ ),
566+ cbfunc ,
567+ byref (future .context )
568+ )
569+ return future
570+
571+ def amop_broadcast (self ,topic ,data = None ):
572+ self .bcossdk .bcos_amop_broadcast (self .bcossdk .sdk ,s2b (topic ),s2b (data ),len (data ))
573+
574+ def amop_send_response (self ,peer ,seq ,data ):
575+ self .bcossdk .bcos_amop_send_response (self .bcossdk .sdk ,s2b (peer ),s2b (seq ),s2b (data ),len (data ))
0 commit comments