湖南御码网控信息技术有限公司,注册资金1000万元,公司总部位于长沙市高新区,是一家拥有多项自主知识产权的高新技术研发型企业,同时也是一家专业的密码应用综合解决方案提供商,公司集结了一大批经验丰富的密码应用从业专家,致力于打造以国产密码技术为核心的新网络安全基础设施,构建自主可控的网络安全体系,为密码应用安全性评估及技术改造提供整体解决方案。公司以技术自主创新为驱动力,依据国家各项要求及规范,围绕国产密码算法研发了一系列产品,主要包括:密码服务中台管理系统、密码安全中间件软件、移动认证APP软件、统一身份认证平台、终端安全管理软件等,面向全国用户提供密码综合应用服务,为国家信息安全建设贡献力量。
参与区块链网络中共识投票、交易执行、区块验证和记账的节点。
见证节点,参与区块和交易同步、区块验证,交易执行,并记录完整账本数据,但不参与共识投票。
参与同步和校验区块头信息、验证交易存在性的节点。
| 算法 | 节点数量 | |
|---|---|---|
| Raft | 2n+1 | 联盟链中不需要考虑恶意节点,且需要性能较高的场景 |
| TBFT | 3n+1 | 联盟链中需要考虑恶意节点的场景 |
| HotStuff | 3n+1 | 联盟链中需要考虑恶意节点的场景 |
支持使用C++、Go、Rust、Solidity进行智能合约开发,每种开发语言实现的合约由不同的虚拟机执行,在将合约发布到链上时通过Runtime Type来指定虚拟机类型。
支持国密通信 网络模块参考https://libp2p.io/
配置文件
链配置文件 [node1/chainconfig/bc1.yml]
主要配置项
consensus.nodes #共识节点配置
trust_roots #信任组织和根证书
同一个链bc1.yml需要保持一致,新节点的加入需通过区块链管理平台,否则区块验证不通过
主配置文件 [node1/chain.yml]
主要配置项
node.priv_key_file #共识节点签名证书私钥配置
cert_file #共识节点签名证书配置
net.listen_addr #节点地址配置,不同的节点IP和端口不一样
net.seeds #引导节点地址配置,需要能连通的已启动节点地址
net.tls #共识节点通信TLS证书配置,支持国密
rpc.tls #SDK调用TLS证书配置,支持国密
storage *store_path #区块存储本地路径配置
启动命令
WINDOWS
chain_windows_x86_1.0.0.exe start -c ./node1/chain.yml
LINUX
赋予执行权限 chmod +x chain_linux_x86_1.0.0
export LD_LIBRARY_PATH=$PWD
export WASMER_BACKTRACE=1
chain_linux_x86_1.0.0 start -c ./node1/chain.yml
后台运行 nohup ./chain_linux_x86_1.0.0 start -c node1/chain.yml > panic.log &
服务管理Shell脚本[TODO]
Docker容器[TODO]
客户端证书有获取链的基本信息,调用合约,获取区块信息权限
管理员证书有客户端证书所有权限,额外有添加根证书,部署合约,新增共识节点权限
节点名称如果为
node2签发出来的组织名称为node2.yumawk.com
根据签发的节点证书配置bc1.yml和chain.yml,启动区块链node2
通过管理平台配置链信息,连接区块链
通过管理平台配置客户端证书和管理员证书
通过管理平台信任根证书
通过管理平台添加共识节点
多节点产生共识
存证合约虚拟机文件 [wasm/fact_1.0.0.wasm]
支持C++、Go、Rust、Solidity开发语言进行智能合约开发
GO语言SDK
https://git.chainmaker.org.cn/chainmaker/chainmaker-sdk-go/-/tags/v1.2.5
https://git.chainmaker.org.cn/chainmaker/chainmaker-sdk-java/-/tags/v1.2.4
其他合约开发[TODO]
创建节点
node := chainmaker_sdk_go.NewNodeConfig(
// 节点地址,格式:127.0.0.1:12301
chainmaker_sdk_go.WithNodeAddr(nodeAddr),
// 节点连接数
chainmaker_sdk_go.WithNodeConnCnt(connCnt),
// 节点是否启用TLS认证
chainmaker_sdk_go.WithNodeUseTLS(true),
// 根证书内容,支持多个
chainmaker_sdk_go.WithNodeCACerts(caCertBase64),
// TLS Hostname
chainmaker_sdk_go.WithNodeTLSHostName(tlsHostName),
)
创建客户端连接
if node == nil {
// 创建节点
node = createNodeWithCaCert(nodeAddr, connCnt)
}
chainClient, err := chainmaker_sdk_go.NewChainClient(
// 设置归属组织
chainmaker_sdk_go.WithChainClientOrgId("sina.yumawk.com"),
// 设置链ID
chainmaker_sdk_go.WithChainClientChainId(chainId),
// 设置客户端用户私钥路径
chainmaker_sdk_go.WithUserKeyFilePath(fmt.Sprintf(userKeyPath, orgId)),
// 设置客户端用户证书
chainmaker_sdk_go.WithUserCrtFilePath(fmt.Sprintf(userCrtPath, orgId)),
// 添加节点1
chainmaker_sdk_go.AddChainClientNodeConfig(node),
// 添加节点2
//AddChainClientNodeConfig(node1),
)
if err != nil {
return nil, err
}
//启用证书压缩(开启证书压缩可以减小交易包大小,提升处理性能)
err = chainClient.EnableCertHash()
if err != nil {
return nil, err
}
调用合约[save]
client, err := createClientWithCaCerts()
curTime := fmt.Sprintf("%d", chainmaker_sdk_go.CurrentTimeSeconds())
fileHash := uuid.GetUUID()
params := map[string]string{
"time": curTime,
"file_hash": fileHash,
"file_name": fmt.Sprintf("file_%s", curTime),
}
resp, err := client.InvokeContract(contractName, "save", "", params, -1, true)
if err != nil {
panic(err)
}
fmt.Println(resp)
调用合约[find_by_file_hash]
client, err := createClientWithCaCerts()
fileHash := "5e5eced9b0204c9d891c81aa9d41a209"
params := map[string]string{
"file_hash": fileHash,
}
resp, err := client.InvokeContract(contractName, "find_by_file_hash", "", params, -1, true)
if err != nil {
panic(err)
}
fmt.Println(resp)
配置文件[conf/app.conf]
appname = manage
runmode = prod
[dev]
httpport = 80
mysql.dataSource = root:xxxxxx@tcp(127.0.0.1:5000)/block_chain?charset=utf8mb4
[prod]
httpport = 80
mysql.dataSource = root:xxxxxx@tcp(172.17.0.1:5000)/block_chain?charset=utf8mb4
dev为开发模式,prod为线上模式
数据库脚本[sql/block_chain.sql]
LINUX
赋予执行权限 chmod +x chain_manage_linux_x86_1.0.0
后台运行 nohup ./chain_manage_linux_x86_1.0.0 > panic.log &
服务管理Shell脚本[TODO]
Docker容器[TODO]