# 湖南御码区块链1.0.0 ## 关于 湖南御码网控信息技术有限公司,注册资金1000万元,公司总部位于长沙市高新区,是一家拥有多项自主知识产权的高新技术研发型企业,同时也是一家专业的密码应用综合解决方案提供商,公司集结了一大批经验丰富的密码应用从业专家,致力于打造以国产密码技术为核心的新网络安全基础设施,构建自主可控的网络安全体系,为密码应用安全性评估及技术改造提供整体解决方案。公司以技术自主创新为驱动力,依据国家各项要求及规范,围绕国产密码算法研发了一系列产品,主要包括:密码服务中台管理系统、密码安全中间件软件、移动认证APP软件、统一身份认证平台、终端安全管理软件等,面向全国用户提供密码综合应用服务,为国家信息安全建设贡献力量。 [湖南御码网控信息技术有限公司](http://yumawk.com) ## 系统架构 [基于长安链1.2.5版本开发](https://docs.chainmaker.org.cn/v1.2.5/html/index.html) ## 共识节点(consensus node) 参与区块链网络中共识投票、交易执行、区块验证和记账的节点。 ## 同步节点 (sync node) 见证节点,参与区块和交易同步、区块验证,交易执行,并记录完整账本数据,但不参与共识投票。 ## 轻节点 (light node) 参与同步和校验区块头信息、验证交易存在性的节点。 ## 共识算法 | 算法 | 节点数量 | | | -------- | ---- | ------------------------------------------------ | | Raft | 2n+1 | 联盟链中不需要考虑恶意节点,且需要性能较高的场景 | | TBFT | 3n+1 | 联盟链中需要考虑恶意节点的场景 | | HotStuff | 3n+1 | 联盟链中需要考虑恶意节点的场景 | ## 智能合约 支持使用C++、Go、Rust、Solidity进行智能合约开发,每种开发语言实现的合约由不同的虚拟机执行,在将合约发布到链上时通过Runtime Type来指定虚拟机类型。 ## 共识网络 支持国密通信 网络模块参考https://libp2p.io/ ## 产品演示 **演示地址** [http://chain.yumawk.com](http://chain.yumawk.com) ## 区块链主链(1.0.0) ### 产品部署 **配置文件** > 链配置文件 [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] ### 新增共识节点 1. 通过管理平台签发节点证书 > 客户端证书有获取链的基本信息,调用合约,获取区块信息权限 > > 管理员证书有客户端证书所有权限,额外有添加根证书,部署合约,新增共识节点权限 > > 节点名称如果为 `node2` 签发出来的组织名称为node2.yumawk.com 2. 根据签发的节点证书配置bc1.yml和chain.yml,启动区块链node2 3. 通过管理平台配置链信息,连接区块链 4. 通过管理平台配置客户端证书和管理员证书 5. 通过管理平台信任根证书 6. 通过管理平台添加共识节点 7. 多节点产生共识 ### 合约调用 1. 通过管理平台添加合约 > 存证合约虚拟机文件 [wasm/fact_1.0.0.wasm] 2. 支持C++、Go、Rust、Solidity开发语言进行智能合约开发 3. GO语言SDK > https://git.chainmaker.org.cn/chainmaker/chainmaker-sdk-go/-/tags/v1.2.5 4. JAVA语言SDK > https://git.chainmaker.org.cn/chainmaker/chainmaker-sdk-java/-/tags/v1.2.4 其他合约开发[TODO] ### 代码调用示例 创建节点 ``` go 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), ) ``` 创建客户端连接 ```go 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] ```go 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] ``` go 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) ``` ## 区块链管理平台(1.0.0) ### 产品部署 配置文件[conf/app.conf] ```ini 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] ### 产品截图 ![image-20210929150144239]( /images/image-20210929150144239.png) ![image-20210929150626206](/images/image-20210929150626206.png) ![image-20210929150915040](/images/image-20210929150915040.png) ![image-20210929150935269](/images/image-20210929150935269.png) ![image-20210929150955542](/images/image-20210929150955542.png) ![image-20210929151012773](/images/image-20210929151012773.png) ![image-20210929151211981](/images/image-20210929151211981.png) ![image-20210929151234739](/images/image-20210929151234739.png)