Skip to content

Commit f1c3f10

Browse files
authored
support deploy contracts with params (FISCO-BCOS#67)
check the user account (must be start with 0x)
1 parent b238958 commit f1c3f10

File tree

8 files changed

+83
-21
lines changed

8 files changed

+83
-21
lines changed

Diff for: ci/ci_check.sh

+8-1
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,16 @@ function test_common_rpcInterface()
8686
function test_contract()
8787
{
8888
LOG_INFO "## test contract..."
89+
# deploy contract with params
90+
local contract_addr=$(execute_cmd "python console.py deploy HelloWorldTest testCase | grep "address:" | awk -F':' '{print \$3}' | awk '\$1=\$1'")
91+
local ret=$(execute_cmd "python console.py call HelloWorldTest ${contract_addr} get | grep testCase")
92+
if [ "$ret" == "" ];then
93+
LOG_ERROR "deploy contract HelloWorldTest with params failed, ret: ${ret}"
94+
fi
95+
8996
init_blockNumber=$(getBlockNumber)
9097
# deploy and get contract address
91-
local contract_addr=$(execute_cmd "python console.py deploy HelloWorld save | grep "address:" | awk -F':' '{print \$3}' | awk '\$1=\$1'")
98+
contract_addr=$(execute_cmd "python console.py deploy HelloWorld save | grep "address:" | awk -F':' '{print \$3}' | awk '\$1=\$1'")
9299
updated_blockNumber=$(getBlockNumber)
93100
if [ $(($init_blockNumber + 1)) -ne $((updated_blockNumber)) ];then
94101
LOG_ERROR "deploy contract failed for blockNumber hasn't increased"

Diff for: client/bcosclient.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from utils.contracts import get_function_info
3333
from utils.abi import itertools, get_fn_abi_types_single
3434
from eth_abi import decode_single
35+
from utils.contracts import get_aligned_function_data
3536

3637

3738
class BcosClient:
@@ -435,10 +436,17 @@ def sendRawTransaction(self, to_address, contract_abi, fn_name, args=None,
435436
if to_address != "":
436437
common.check_and_format_address(to_address)
437438
# 第三个参数是方法的abi,可以传入None,encode_transaction_data做了修改,支持通过方法+参数在整个abi里找到对应的方法abi来编码
439+
438440
if bin_data is None:
439441
functiondata = encode_transaction_data(fn_name, contract_abi, None, args)
440-
else:
442+
# the args is None
443+
elif args is None:
441444
functiondata = bin_data
445+
# deploy with params
446+
else:
447+
fn_data = get_aligned_function_data(contract_abi, None, args)
448+
functiondata = bin_data + fn_data[2:]
449+
442450
if to_address is not None and len(to_address) > 0:
443451
from eth_utils import to_checksum_address
444452
to_address = to_checksum_address(to_address)

Diff for: client/common/common.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,14 @@ def print_result(ret):
7676
print_info(" ", "{}".format(ret))
7777

7878

79+
def check_address_startwith_0x(address):
80+
"""
81+
check the address: must be starts with 0x
82+
"""
83+
if address.startswith("0x") is False:
84+
raise ArgumentsError("invalid address {}, must be start with 0x".format(address))
85+
86+
7987
def check_and_format_address(address):
8088
"""
8189
check address
@@ -216,7 +224,6 @@ def print_receipt_logs(logs):
216224
print("{}): log name: {} , data: {}".format(i, log['eventname'], log['eventdata']))
217225

218226

219-
220227
def print_output_and_input(logs, output, txinput, contract_name, contract_path):
221228
"""
222229
parse_output_from_abi
@@ -242,7 +249,7 @@ def print_output_and_input(logs, output, txinput, contract_name, contract_path):
242249
print_info("output result", output_result)
243250
log_result = dataParser.parse_event_logs(logs)
244251
print_receipt_logs(log_result)
245-
#print_info("log result", log_result)
252+
# print_info("log result", log_result)
246253

247254
except Exception as e:
248255
raise BcosException("parse output failed for reason: {}".format(e))

Diff for: client/common/transaction_common.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from eth_utils import to_checksum_address
2323
from client.bcoserror import BcosError, CompileError, ArgumentsError, BcosException
2424
from client.common.transaction_exception import TransactionException
25+
from utils.abi import get_constructor_abi
2526

2627

2728
class TransactionCommon(bcosclient.BcosClient):
@@ -157,14 +158,22 @@ def format_args(self, fn_name, fn_args, needCover=False):
157158
self.gen_contract_abi(needCover)
158159
data_parser = DatatypeParser(self.contract_abi_path)
159160
contract_abi = data_parser.contract_abi
161+
args = None
160162
if fn_args is None:
161163
return (contract_abi, fn_args)
162164
if fn_name in data_parser.func_abi_map_by_name.keys() is None:
163165
raise BcosException("invalid function: {}, the right function list:"
164166
.format(fn_name,
165167
''.join(data_parser.func_abi_map_by_name.keys())))
166-
inputabi = data_parser.func_abi_map_by_name[fn_name]["inputs"]
167-
args = TransactionCommon.format_args_by_abi(fn_args, inputabi)
168+
if fn_name is not None:
169+
inputabi = data_parser.func_abi_map_by_name[fn_name]["inputs"]
170+
args = TransactionCommon.format_args_by_abi(fn_args, inputabi)
171+
# the constructor with params
172+
elif fn_args is not None and contract_abi is not None:
173+
abidata = get_constructor_abi(contract_abi)
174+
if abidata is not None:
175+
inputabi = abidata["inputs"]
176+
args = TransactionCommon.format_args_by_abi(fn_args, inputabi)
168177
return (contract_abi, args)
169178

170179
def call_and_decode(self, fn_name, fn_args=None):

Diff for: client/precompile/permission/permission_service.py

+2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def grant(self, table_name, account_address):
4040
function insert(string table_name, string addr) public returns(int256);
4141
"""
4242
common.check_and_format_address(account_address)
43+
common.check_address_startwith_0x(account_address)
4344
fn_name = "insert"
4445
fn_args = [table_name, account_address]
4546
return self.client.send_transaction_getReceipt(fn_name, fn_args, self.gasPrice)
@@ -51,6 +52,7 @@ def revoke(self, table_name, account_address):
5152
function remove(string table_name, string addr) public returns(int256);
5253
"""
5354
common.check_and_format_address(account_address)
55+
common.check_address_startwith_0x(account_address)
5456
fn_name = "remove"
5557
fn_args = [table_name, account_address]
5658
return self.client.send_transaction_getReceipt(fn_name, fn_args, self.gasPrice)

Diff for: console.py

+15-14
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,7 @@ def usage(client_config):
179179

180180
usagemsg.append('''checkaddr [address]
181181
将普通地址转为自校验地址,自校验地址使用时不容易出错
182-
change address to checksum address according EIP55:
183-
to_checksum_address: 0xf2c07c98a6829ae61f3cb40c69f6b2f035dd63fc
184-
-> 0xF2c07c98a6829aE61F3cB40c69f6b2f035dD63FC
185-
''')
182+
change address to checksum address according EIP55''')
186183
return usagemsg
187184

188185

@@ -410,15 +407,20 @@ def main(argv):
410407
# --------------------------------------------------------------------------------------------
411408
if cmd == "deploy":
412409
'''deploy abi bin file'''
413-
if len(inputparams) > 2:
414-
raise ArgumentsError(("deploy failed, expected at most 2 params,"
415-
" provided: {}").format(len(inputparams)))
416-
# must be at most 2 params
417-
common.check_param_num(inputparams, 1, False)
410+
# must be at least 2 params
411+
common.check_param_num(inputparams, 1)
418412
contractname = inputparams[0].strip()
419413
gasPrice = 30000000
414+
# need save address whether or not
415+
needSaveAddress = False
416+
args_len = len(inputparams)
417+
if inputparams[-1] == "save":
418+
needSaveAddress = True
419+
args_len = len(inputparams) - 1
420+
# get the args
421+
fn_args = inputparams[1:args_len]
420422
trans_client = transaction_common.TransactionCommon("", contracts_dir, contractname)
421-
result = trans_client.send_transaction_getReceipt(None, None, gasPrice, True)[0]
423+
result = trans_client.send_transaction_getReceipt(None, fn_args, gasPrice, True)[0]
422424

423425
print("deploy result for [{}] is:\n {}".format(
424426
contractname, json.dumps(result, indent=4)))
@@ -427,10 +429,9 @@ def main(argv):
427429
blocknum = int(result["blockNumber"], 16)
428430
ContractNote.save_contract_address(name, address)
429431
print("on block : {},address: {} ".format(blocknum, address))
430-
if len(inputparams) == 2:
431-
if inputparams[1] == "save":
432-
ContractNote.save_address(name, address, blocknum)
433-
print("address save to file: ", client_config.contract_info_file)
432+
if needSaveAddress is True:
433+
ContractNote.save_address(name, address, blocknum)
434+
print("address save to file: ", client_config.contract_info_file)
434435
else:
435436
print(
436437
'''\nNOTE : if want to save new address as last

Diff for: contracts/HelloWorldTest.sol

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
pragma solidity ^0.4.24;
2+
3+
contract HelloWorldTest{
4+
string name;
5+
6+
constructor(string _name) public{
7+
name = _name;
8+
}
9+
10+
function get() constant public returns(string){
11+
return name;
12+
}
13+
14+
function set(string n) public{
15+
name = n;
16+
}
17+
}

Diff for: utils/contracts.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
from utils.exceptions import (
4646
ValidationError,
4747
)
48+
from utils.abi import get_constructor_abi
4849

4950

5051
def find_matching_event_abi(abi, event_name=None, argument_names=None):
@@ -123,7 +124,7 @@ def find_matching_fn_abi(abi, fn_identifier=None, args=None, kwargs=None):
123124
raise ValidationError(message)
124125

125126

126-
def encode_abi( abi, arguments, data=None):
127+
def encode_abi(abi, arguments, data=None):
127128
argument_types = get_abi_input_types(abi)
128129

129130
if not check_if_arguments_can_be_encoded(abi, arguments, {}):
@@ -214,6 +215,16 @@ def encode_transaction_data(
214215
return add_0x_prefix(encode_abi(fn_abi, fn_arguments, fn_selector))
215216

216217

218+
def get_aligned_function_data(contract_abi=None, fn_abi=None, args=None, kwargs=None):
219+
if fn_abi is None:
220+
fn_abi = get_constructor_abi(contract_abi)
221+
if kwargs is None:
222+
kwargs = {}
223+
fn_arguments = merge_args_and_kwargs(fn_abi, args, kwargs)
224+
_, aligned_fn_arguments = get_aligned_abi_inputs(fn_abi, fn_arguments)
225+
return add_0x_prefix(encode_abi(fn_abi, fn_arguments, ""))
226+
227+
217228
def get_fallback_function_info(contract_abi=None, fn_abi=None):
218229
if fn_abi is None:
219230
fn_abi = get_fallback_func_abi(contract_abi)

0 commit comments

Comments
 (0)