0%

基于pythonsdk操作fisco-bcos

说明

  • FISCO BCOS是由国内企业主导研发、对外开源、安全可控的企业级金融联盟链底层平台,由金链盟开源工作组协作打造,并于2017年正式对外开源
  • 因为需要使用python sdk来操作FISCO BCOS,官方只支持FISCO BCOS2.0

概念介绍

  • 智能合约:可以理解为逻辑代码,比如此次实例中我的智能合约代码就是一个sol文件中
  • 区块链网络:智能合约的代码若要运行,就要放在区块链网络上执行

环境搭建

区块链网络

  • 云服务器搭建成功后,发现无法外网访问,看这里的文档说明云主机的公网IP均为虚拟IP造成的

  • 也就是区块链的服务端,可以参考这里

  • 不启用国密

Python SDK

  • 主要用来操作FISCO BCOS搭建的区块链网络

  • 环境搭建参考这里

  • 我用的win10,使用的python版本为3.7.9,没有使用虚拟环境

  • 没有安装Microsoft Visual C++ 14.0

  • client_config.py 为配置文件:

1
2
channel_host = "XXXXXX.121.XXX"  # 填入channel通信ip
channel_port = 20200 # 节点的channel 端口
  • 把区块链网络层那边产生的证书文件放在bin目录下,一般为:
1
2
channel_ca = "bin/ca.crt"
channel_ca = "bin/ca.crt"

编写代码

  • 合约文件一般放在contracts目录中,如contracts\helloword.sol
  • 合约代码采用的solidity的语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pragma solidity ^0.4.24;

contract HelloWorld{
string name;
event onset(string newname);
constructor() public{
name = "Hello, World!";
}

function get() constant public returns(string){
return name;
}

function set(string n) public{
emit onset(n);
name = n;
}
}
  • 编写部署合约文件,调用合约函数等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

from client.contractnote import ContractNote
from client.bcosclient import BcosClient
import os
from client.datatype_parser import DatatypeParser
from client.common.compiler import Compiler
from client_config import client_config

# 从文件加载abi定义

PATH = lambda p: os.path.abspath(
os.path.join(os.path.dirname(__file__), p)
)

demo_config = client_config
_sol = PATH("./contracts/HelloWord.sol") # 合约文件
_api = PATH("./contracts/HelloWord.abi")

if os.path.isfile(demo_config.solc_path) or os.path.isfile(demo_config.solcjs_path):
Compiler.compile_file(_sol)
# Compiler.compile_file(SimpleInfo_sol)
_bin = PATH("./contracts/HelloWord.bin")
abi_file = _api
data_parser = DatatypeParser()
data_parser.load_abi_file(abi_file)
contract_abi = data_parser.contract_abi


def deploy():
client = BcosClient()
print(client.getinfo())
# 部署合约
print("\n>>Deploy:----------------------------------------------------------")
with open(_bin, 'r') as load_f:
contract_bin = load_f.read()
load_f.close()
result = client.deploy(contract_bin)
print("deploy", result)
print("new address : ", result["contractAddress"])
contract_name = os.path.splitext(os.path.basename(abi_file))[0]
memo = "tx:" + result["transactionHash"]
# 把部署结果存入文件备查
ContractNote.save_address_to_contract_note("demo", contract_name,
result["contractAddress"])
client.finish()
def call():
client = BcosClient()
# stat = StatTool.begin()
# 调用一下call,获取数据
print("\n>>Call:------------------------------------------------------------------------")
to_address = "xxxxxxxx"

client.sendRawTransactionGetReceipt(to_address,contract_abi,"set",["hi"])

data = client.call(to_address, contract_abi, "get")
print(data)
client.finish()


if __name__ == "__main__":
deploy()
# call()

  • client.deploy 部署合约
  • sendRawTransactionGetReceipt 执行修改操作
  • call 执行查询操作

其他实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// pragma solidity ^0.6.3;
pragma solidity ^0.4.24;
pragma experimental ABIEncoderV2;

contract TestStruct {

struct User {
string name; // 对应的是item_id
string user_name;
string issue_date;
string start_date;
string end_date;
}

event onadd(string newname);
event onadduser(string newname,User u);
event onaddusers(uint256 len,User[] u);

mapping (string => User) users;

constructor() public
{
// User memory u = User("alice",10001, "2012-12-01", "start");
User memory u = User("100001","lisa", "2012-12-01", "start", "end");
addUser(u);
}


function addUser (User memory _user) public {

addbyname(_user.name,_user);


}

function addbyname (string memory name,User memory _user) public {

users[name] = _user;
emit onadd(name);
emit onadduser(name,_user);

}

function addUsers (User [] memory _users) public {

for (uint i = 0; i < _users.length; i++) {
//users[_users[i].name] = _users[i];
addUser(_users[i]);
}
emit onaddusers(_users.length,_users);
}

function getUser (string memory username) public view returns (User memory) {

//bytes32 hash = keccak256(abi.encode(username));
return users[username];
}
event on_putbytes(string n,bytes32 b);
function putbytes(string memory uname,bytes32 br) public
{
emit on_putbytes(uname,br);
}
}