def call_mpy_with_setcode(sign=True): _src_dir = os.path.dirname(__file__) actions = [] for i in range(TRX_COUNT): code = struct.pack('QBB', N('actiontest'), 1, 0) py_file = os.path.join(_src_dir, 'actiontest.py') with open(py_file, 'rb') as f: src_code = f.read() src_code += b'\n1==(%d)' % (i, ) with open(py_file[:-3] + '2.py', 'wb') as f: f.write(src_code) mpy_code = eosapi.mp_compile(py_file[:-3] + '2.py') code += eosapi.pack_bytes(b'\x01' + mpy_code) act = [ N('eosio'), N('setcode'), [[N('actiontest'), N('active')]], code ] setabi_action = gen_setabi_action() actions.append([act, setabi_action]) cost_time = eosapi.push_transactions2(actions, sign) start = time.time() eosapi.produce_block() print('produce_block: ', time.time() - start) print(1e6 / (cost_time / TRX_COUNT)) return 1e6 / (cost_time / TRX_COUNT)
def init(mpy=True): with producer: if not eosapi.get_account('backyard').permissions: r = eosapi.create_account('eosio', 'backyard', initeos.key1, initeos.key2) assert r with producer: if mpy: with open('../../programs/pyeos/contracts/backyard/backyard.mpy', 'wb') as f: f.write( eosapi.mp_compile( '../../programs/pyeos/contracts/backyard/backyard.py')) r = eosapi.set_contract( 'backyard', '../../programs/pyeos/contracts/backyard/backyard.mpy', '../../programs/pyeos/contracts/backyard/backyard.abi', 1) else: r = eosapi.set_contract( 'backyard', '../../programs/pyeos/contracts/backyard/backyard.py', '../../programs/pyeos/contracts/backyard/backyard.abi', 1) # r = eosapi.set_contract('currency', '../../build/contracts/currency/currency.wast', '../../build/contracts/currency/currency.abi',0) assert r
def deploy_mpy(): src_dir = os.path.dirname(os.path.abspath(__file__)) code = eosapi.N('backyard') for file_name in libs: print('deploy ', file_name) src_code = eosapi.mp_compile(os.path.join(src_dir, file_name)) file_name = file_name.replace('.py', '.mpy') src_id = eosapi.hash64(file_name, 0) itr = db.find_i64(code, code, code, src_id) if itr >= 0: #Something went wrong in mp_compile. #Generating different bytecode each time with the same source code, walkaround this problem for now continue old_src = db.get_i64(itr) if old_src[1:] == src_code: continue mod_name = file_name msg = int.to_bytes(len(mod_name), 1, 'little') msg += mod_name.encode('utf8') msg += int.to_bytes(1, 1, 'little') # compiled python bytecode msg += src_code print('++++++++++++++++deply:', file_name) r = eosapi.push_action('backyard','deploy',msg,{'backyard':'active'}) assert r
def deploy_mpy(): src_dir = os.path.dirname(os.path.abspath(__file__)) code = eosapi.N('backyard') for file_name in libs: print('deploy ', file_name) src_code = eosapi.mp_compile(os.path.join(src_dir, file_name)) file_name = file_name.replace('.py', '.mpy') src_id = eosapi.hash64(file_name, 0) itr = eoslib.db_find_i64(code, code, code, src_id) if itr >= 0: old_src = eoslib.db_get_i64(itr) if old_src[1:] == src_code: continue mod_name = file_name msg = int.to_bytes(len(mod_name), 1, 'little') msg += mod_name.encode('utf8') msg += int.to_bytes(1, 1, 'little') # compiled code msg += src_code print('++++++++++++++++deply:', file_name) r = eosapi.push_message('backyard', 'deploy', msg, {'backyard': 'active'}) assert r producer.produce_block()
def deploy_contract(currency, contract_type=0): if contract_type <= 0: return if contract_type == 1: r = eosapi.set_contract( currency, '../../programs/pyeos/contracts/currency/currency.py', '../../contracts/currency/currency.abi', 1) elif contract_type == 2: with open('../../programs/pyeos/contracts/currency/currency.mpy', 'wb') as f: data = eosapi.mp_compile( '../../programs/pyeos/contracts/currency/currency.py') f.write(data) r = eosapi.set_contract( currency, '../../programs/pyeos/contracts/currency/currency.mpy', '../../contracts/currency/currency.abi', 1) elif contract_type == 3: wast = '../../build/contracts/eosio.token/eosio.token.wast' key_words = b"hello,world\\00" wast = '../../build/contracts/eosio.token/eosio.token.wast' with open(wast, 'rb') as f: data = f.read() #data.find(key_words) replace_str = b"%s\\00" % (currency.encode('utf8'), ) replace_str.zfill(len(key_words)) #replace key works with custom words to break the effect of code cache mechanism data = data.replace(key_words, replace_str) with open('currency2.wast', 'wb') as f: f.write(data) r = eosapi.set_contract( currency, 'currency2.wast', '../../build/contracts/eosio.token/eosio.token.abi', 0) else: assert 0
def test3(count, d=0): keys = list(wallet.list_keys().keys()) for i in range(0, count): currency = 'curre'+n2s(i) # currency = 'currency' key1 = keys[i] key2 = keys[10000+i] if not eosapi.get_account(currency).permissions: r = eosapi.create_account('eosio', currency, key1, key2) assert r if d: if d==1: r = eosapi.set_contract(currency,'../../programs/pyeos/contracts/currency/currency.py','../../contracts/currency/currency.abi', 1) elif d == 2: with open('../../programs/pyeos/contracts/currency/currency.mpy', 'wb') as f: data = eosapi.mp_compile('../../programs/pyeos/contracts/currency/currency.py') f.write(data) r = eosapi.set_contract(currency,'../../programs/pyeos/contracts/currency/currency.mpy','../../contracts/currency/currency.abi', 1) elif d == 3: wast = '../../build/contracts/currency/currency.wast' key_words = b"hello,world\\00" wast = '../../build/contracts/currency/currency.wast' with open(wast, 'rb') as f: data = f.read() #data.find(key_words) replace_str = b"%s\\00"%(currency.encode('utf8'),) replace_str.zfill(len(key_words)) #replace key works with custom words to break the effect of code cache mechanism data = data.replace(key_words, replace_str) with open('currency2.wast', 'wb') as f: f.write(data) r = eosapi.set_contract(currency, 'currency2.wast', '../../build/contracts/currency/currency.abi',0) else: assert 0 eosapi.produce_block() accounts = [] functions = [] args = [] per = [] for i in range(0, count): currency = 'curre'+n2s(i) accounts.append(currency) per.append({currency:'active'}) functions.append('issue') arg = str(i) args.append({"to":currency,"quantity":"1000.0000 CUR","memo":""}) ret = eosapi.push_messages(accounts, functions, args, per, True, rawargs=False) assert ret if ret: cost = ret['cost_time'] eosapi.produce_block() print('total cost time:%.3f s, cost per action: %.3f ms, actions per second: %.3f'%(cost/1e6, cost/count/1000, 1*1e6/(cost/count)))
def deploy_mpy(): src_dir = os.path.dirname(os.path.abspath(__file__)) file_name = 'hello.py' src_code = eosapi.mp_compile(os.path.join(src_dir, file_name)) file_name = file_name.replace('.py', '.mpy') mod_name = file_name msg = int.to_bytes(len(mod_name), 1, 'little') msg += mod_name.encode('utf8') msg += int.to_bytes(1, 1, 'little') # compiled code msg += src_code print('++++++++++++++++deply:', file_name) r = eosapi.push_action('kitties', 'deploy', msg, {'kitties': 'active'}) assert r
def prepare_(name, src, abi, full_src_path): _src_dir = os.path.dirname(os.path.abspath(full_src_path)) if src.endswith('.wast'): code_type = CODE_TYPE_WAST elif src.endswith('.py'): code_type = CODE_TYPE_PY else: raise Exception('unknown code type') if code_type == 0: cpp2wast.set_src_path(_src_dir) cpp_src_file = src.replace('.wast', '.cpp') if not cpp2wast.build(cpp_src_file): raise Exception("build {0} failed".format(cpp_src_file)) if src.find('/') < 0: src = os.path.join(_src_dir, src) if abi and abi.find('/') < 0: abi = os.path.join(_src_dir, abi) if not eosapi.get_account(name): print('*' * 20, 'create_account') r = eosapi.create_account('eosio', name, initeos.key1, initeos.key2) assert r old_code = eosapi.get_code(name) need_update = True if old_code: old_code = old_code[0] with open(src, 'rb') as f: code = f.read() if code_type == CODE_TYPE_WAST: code = eosapi.wast2wasm(code) old_code = eosapi.wast2wasm(old_code) if code == old_code: need_update = False elif CODE_TYPE_PY == code_type: code = eosapi.mp_compile(src) if code == old_code[1:]: need_update = False elif (code == old_code[1:] or code == old_code): need_update = False if need_update: print('Updating contract', src) r = eosapi.set_contract(name, src, abi, code_type) assert r, 'set_contract failed'
def deploy_mpy(self, file_name): _abs_file_path = os.path.join(self.src_dir, file_name) if not self.need_update(self.src_dir, file_name, mpy=True): print('++++++++++:', file_name, "up to date") return src_code = eosapi.mp_compile(_abs_file_path) file_name = file_name.replace('.py', '.mpy') mod_name = file_name msg = int.to_bytes(len(mod_name), 1, 'little') msg += mod_name.encode('utf8') msg += int.to_bytes(1, 1, 'little') # compiled code msg += src_code print('++++++++++++++++deply:', file_name) r = eosapi.push_action(self.account,'deploy',msg,{self.account:'active'}) assert r
def deploy_mpy(): src_dir = '../../programs/pyeos/contracts/hello' file_name = 'hello.py' src_code = eosapi.mp_compile(os.path.join(src_dir, file_name)) file_name = file_name.replace('.py', '.mpy') mod_name = file_name msg = int.to_bytes(len(mod_name), 1, 'little') msg += mod_name.encode('utf8') msg += int.to_bytes(1, 1, 'little') # compiled code msg += src_code print('++++++++++++++++deply:', file_name) r = eosapi.push_message('kitties','deploy',msg,{'kitties':'active'},rawargs=True) assert r producer.produce_block()
def prepare(name, src, abi, code_type, full_src_path): _src_dir = os.path.dirname(os.path.abspath(full_src_path)) if code_type == 0: cpp2wast.set_src_path(_src_dir) cpp_src_file = src.replace('.wast', '.cpp') if not cpp2wast.build(cpp_src_file): raise Exception("build {0} failed".format(cpp_src_file)) if src.find('/') < 0: src = os.path.join(_src_dir, src) if abi and abi.find('/') < 0: abi = os.path.join(_src_dir, abi) if code_type == CODE_TYPE_MPY: mpy_file = src[:-3] + '.mpy' with open(mpy_file, 'wb') as f: f.write(eosapi.mp_compile(src)) src = mpy_file if not eosapi.get_account(name).permissions: r = eosapi.create_account('eosio', name, initeos.key1, initeos.key2) assert r old_code = eosapi.get_code(name) need_update = True if old_code: old_code = old_code[0] with open(src, 'rb') as f: code = f.read() if code_type == CODE_TYPE_WAST: code = eosapi.wast2wasm(code) old_code = eosapi.wast2wasm(old_code) if code == old_code: need_update = False elif (code == old_code[1:] or code == old_code): need_update = False if need_update: with producer: if code_type == 0: r = eosapi.set_contract(name, src, abi, 0) else: r = eosapi.set_contract(name, src, abi, 1) assert r, 'set_contract failed'
def deploy_mpy(): src_dir = os.path.dirname(os.path.abspath(__file__)) file_name = 'garden.py' src_code = eosapi.mp_compile(os.path.join(src_dir, file_name)) file_name = file_name.replace('.py', '.mpy') mod_name = file_name msg = int.to_bytes(len(mod_name), 1, 'little') msg += mod_name.encode('utf8') msg += int.to_bytes(1, 1, 'little') # compiled code msg += src_code print('++++++++++++++++deply:', file_name) r = eosapi.push_message('backyard', 'deploy', msg, {'backyard': 'active'}, rawargs=True) assert r producer.produce_block()
def deploy_mpy(self, file_name): _abs_file_path = os.path.join(self.src_dir, file_name) if not self.need_update(self.src_dir, file_name, mpy=True): print('++++++++++:', file_name, "up to date") return src_code = eosapi.mp_compile(_abs_file_path) file_name = file_name.replace('.py', '.mpy') mod_name = file_name msg = int.to_bytes(len(mod_name), 1, 'little') msg += mod_name.encode('utf8') msg += int.to_bytes(1, 1, 'little') # compiled code msg += src_code print('++++++++++++++++deply:', file_name) r = eosapi.push_message('kitties', 'deploy', msg, {'kitties': 'active'}) assert r producer.produce_block() time.sleep(0.2)
def need_update(self, src_dir, src_file, mpy=False): if mpy: id = eosapi.hash64(src_file.replace('.py', '.mpy')) else: id = eosapi.hash64(src_file) code = eosapi.N(self.account) itr = eoslib.db_find_i64(code, code, code, id) if itr < 0: return True old_src = eoslib.db_get_i64(itr) _full_file_path = os.path.join(src_dir, src_file) if not mpy: with open(_full_file_path, 'rb') as f: if old_src[1:] == f.read(): return False else: src_code = eosapi.mp_compile(_full_file_path) if old_src[1:] == src_code: return False return True