codechain基于 Tendermint共识机制的代码链,采用go语言实现,并且依赖于Tendermint环境,建议在ubuntu16.04下开发,
- 为了便于后续的开发,首先建立起git、golang、tendermint代码库、vscode的开发环境,参考 建立开发环境 。
- 为了验证Tendermint的四个节点的运行情况,参考 运行环境组网 。
- 为了验证Tendermint更多的节点加入,参考 Seed模式组网 。
- Tendermint一些难点,可参考 FAQ 。
资产数据采用Mongodb保存,所以请先安装Mongodb。
sudo apt-get install mongodb
codechain采用go语言开发,所以无依赖库,直接下载可执行文件即可运行,预览功能,安装脚本见
https://github.com/little51/codechain/blob/master/release/v0.0.1/codechain_v0.0.1_linux_amd64.sh
如果已经配置好go开发环境,可以编译程序源码。
export GO111MODULE=on
export GOPROXY=https://goproxy.io
cd core
go build
tendermint init
链初始化只做一次,执行完成后,会在~/.tendermint目录下生成配置文件和数据文件。
进入codechain/core目录下执行下面操作:
cd codechain/core
go build
./core
core程序会在26658端口监听tendermint进程发过来的交易。
再开一个命令行,执行:
tendermint node
tendermint会在26657端口监听。
curl -s 'localhost:26657/broadcast_tx_commit?tx="eyJwdWJsaWNrZXkiOiJBNUZFQTY0NUMwOTlGNjlFRTVGQ0Q4QjY3RkU4M0VBQ0QwQ0JBQzQxMEFCQzVCOEZBNUNCNEU0NTFENUY1Q0VDIiwic2lnbiI6IjNiOTM2ODc5MzkyMDJiNTJhZWJlZDA2YjU1ZjY2M2ZiN2M0ZjYyNzU2MGY3OTA3NDM5ZDg4ZjYzMWM5NWI4ZjNjYzdkODBkNzEzMTgwZjRhMDg1MDBkZDU5YTgzNjlhODZmODlhODQ4NDI1NzZjMDJkMTFkYTI3NTdhNzBiZDBkIiwibXNnIjoiZXlKMGIydGxiaUk2SWtWUFJpSXNJbVp5YjIwaU9pSkJOVVpGUVRZME5VTXdPVGxHTmpsRlJUVkdRMFE0UWpZM1JrVTRNMFZCUTBRd1EwSkJRelF4TUVGQ1F6VkNPRVpCTlVOQ05FVTBOVEZFTlVZMVEwVkRJaXdpZEc4aU9pSkVOemM1UkRZelJqZzNRa0kyT1RreE4wTTBSRE5FUkRKQ056WXlNekUxT1RVeE9URTVOVVExUVRWQlJEYzBSakV3UWpjNFJEbEJNamRCT1RZMk5UVkRJaXdpWVcxdmRXNTBJam9pTlRBaWZRPT0ifQ=="'
curl -s 'localhost:26657/abci_query?data="key=key1"'
Web应用目前提供了账户管理和简单的资产管理,可实现账户密钥对的创建,资产的签名、登记。
cd webserver
go build
./webserver
新建账户,返回公私钥对,对资产字符串进行私钥签名,用公钥验证。
curl -X POST http://localhost:4000/account/new
结果如下:
{
"address":"ECDCE3D5B6164768C0D4DFB74BF6B9E2C4D1682B",
"error":"",
"privateKey":"80d7f6a76d6bbc9893efff3721a49432f5ffdba39e0c98256d7e3fdd53e6b807d4e4cf08ec338970efc0e6b8e1dde3d4129a6bb5588ba90f72f9a0d6c0ed62ce",
"publicKey":"D4E4CF08EC338970EFC0E6B8E1DDE3D4129A6BB5588BA90F72F9A0D6C0ED62CE"
}
资产交易需要先进行资产签名,验证发起资产交易账户的公私钥对
测试如下
curl -H "Content-Type: application/json" -d '{"privatekey":"80d7f6a76d6bbc9893efff3721a49432f5ffdba39e0c98256d7e3fdd53e6b807d4e4cf08ec338970efc0e6b8e1dde3d4129a6bb5588ba90f72f9a0d6c0ed62ce","msg":"eyJ0b2tlbiI6IktLSyIsImZyb20iOiJENEU0Q0YwOEVDMzM4OTcwRUZDMEU2QjhFMURERTNENDEyOUE2QkI1NTg4QkE5MEY3MkY5QTBENkMwRUQ2MkNFIiwidG8iOiIiLCJhbW91bnQiOiI2MDAifQ=="}' -X POST http://localhost:4000/account/sign
结果如下:
{"error":"","sign":"25a76ff76196706d63c3190cfb97edd45f322f046cb9d78592eda1368b42c15c63a6780a777a40de626b9b9530e9433f51d8ee300b881ea55941cc53b5b27507"}
在资产交易之前,应该确认发起者拥有足够的token,可以通过资产创世的方式来创建一种新的token
测试如下:
curl -H "Content-Type: application/json" -d '{"publickey":"D4E4CF08EC338970EFC0E6B8E1DDE3D4129A6BB5588BA90F72F9A0D6C0ED62CE","sign":"25a76ff76196706d63c3190cfb97edd45f322f046cb9d78592eda1368b42c15c63a6780a777a40de626b9b9530e9433f51d8ee300b881ea55941cc53b5b27507","msg":"eyJ0b2tlbiI6IktLSyIsImZyb20iOiJENEU0Q0YwOEVDMzM4OTcwRUZDMEU2QjhFMURERTNENDEyOUE2QkI1NTg4QkE5MEY3MkY5QTBENkMwRUQ2MkNFIiwidG8iOiIiLCJhbW91bnQiOiI2MDAifQ=="}' -X POST http://localhost:4000/assets/new
结果如下:
{
"error": "",
"info": "{ \n \"jsonrpc\": "2.0",\n \"id\": \"\",\n \"result\": {\n \"check_tx\": {\n \"code\": 0,\n \"data\": null,\n \"log\": \"\",\n \"info\": \"CheckTx successfully carried out the signVerify\",\n \"gasWanted\": \"1\" \n \"gasUsed\": "0",\n \"events\": [], \n \"codespace\": \"\"},\n \"deliver_tx\": {\n \"code\": 0,\n \"data\": null, \n \"log\": \"\", \n \"info\": \"\",\n \"gasWanted\": \"0\",\n \"gasUsed\": \"0\",\n \"events\": [],\n \"codespace\": \"\"},\n \"hash\": \"91C2DA3A01E9093FB7CF1FD4A30C93A5164A8F20FFCE28020BD7AB1497FB3AE8\",\n \"height\": \"82\"}}\n",
"result": true
}
两个不同账户之间可以进行相同token的交易
curl -H "Content-Type: application/json" -d '{"publickey":"D4E4CF08EC338970EFC0E6B8E1DDE3D4129A6BB5588BA90F72F9A0D6C0ED62CE","sign":"df2d0652c8994ddc14ec70f9532aff7fb9b4ccd3077bf9c88c936a65a18a500e380f639f410d4058deddc2d4047bee070e229b0b5e86aaa97448374ac854770d","msg":"eyJ0b2tlbiI6IktLSyIsImZyb20iOiJENEU0Q0YwOEVDMzM4OTcwRUZDMEU2QjhFMURERTNENDEyOUE2QkI1NTg4QkE5MEY3MkY5QTBENkMwRUQ2MkNFIiwidG8iOiJBNUZFQTY0NUMwOTlGNjlFRTVGQ0Q4QjY3RkU4M0VBQ0QwQ0JBQzQxMEFCQzVCOEZBNUNCNEU0NTFENUY1Q0VDIiwiYW1vdW50IjoiMzAwIn0="}' -X POST http://localhost:4000/assets/new
结果如下:
{
"error": "",
"info": "{ \n \"jsonrpc\": "2.0",\n \"id\": \"\",\n \"result\": {\n \"check_tx\": {\n \"code\": 0,\n \"data\": null,\n \"log\": \"\",\n \"info\": \"CheckTx successfully carried out the signVerify\",\n \"gasWanted\": \"1\" \n \"gasUsed\": "0",\n \"events\": [], \n \"codespace\": \"\"},\n \"deliver_tx\": {\n \"code\": 0,\n \"data\": null, \n \"log\": \"\", \n \"info\": \"\",\n \"gasWanted\": \"0\",\n \"gasUsed\": \"0\",\n \"events\": [],\n \"codespace\": \"\"},\n \"hash\": \"B80F6B79569989513E5F23552CDBB53BA854F468FC2A4BFF1696C4C897660734\",\n \"height\": \"83\"}}\n",
"result": true
}
通过公钥可以来查询到当前所有不同token的资产信息
测试如下:
curl -H "Content-Type: application/json" -d '{"key": "D4E4CF08EC338970EFC0E6B8E1DDE3D4129A6BB5588BA90F72F9A0D6C0ED62CE"}' -X POST http://localhost:4000/assets/query
结果如下:
{
"error":"",
"info":"{\n \"jsonrpc\": \"2.0\",\n \"id\": -1,\n \"result\": {\n \"response\": {\n \"code\": 0,\n \"log\": \"\",\n \"info\": \"D4E4CF08EC338970EFC0E6B8E1DDE3D4129A6BB5588BA90F72F9A0D6C0ED62CE\",\n \"index\": \"0\",\n \"key\": null,\n \"value\": \"eyJhcnJheSI6IFt7InB1YmxpY2tleSI6IkQ0RTRDRjA4RUMzMzg5NzBFRkMwRTZCOEUxRERFM0Q0MTI5QTZCQjU1ODhCQTkwRjcyRjlBMEQ2QzBFRDYyQ0UiLCJ0b2tlbiI6IktLSyIsImFtb3VudCI6MzAwfV19\",\n \"proof\": null,\n \"height\": \"0\",\n \"codespace\": \"\"\n }\n }\n}",
"result":true
}
在资产签名,资产创世,资产查询测试中,POST请求数据中包含msg字段,该字段是处理后的一段加密Base64的字符串。其原始信息为包含token、from、to和amount四个属性的javascript对象,在前端经JSON.stringify()和Base64.encode()先后处理后形成最终的msg值。
资产会保存到Mongodb中,通过Mongodb客户端可以查询chain数据库的assets集合。
参见 链浏览器 的说明。
序号 | 类别 | 任务 | 完成情况 |
---|---|---|---|
1 | 基础 | 开发环境 | 完成 |
2 | 运行环境 | 完成 | |
3 | 一键自动安装应用 | 完成 | |
4 | 资产 | 基本key-value(mongledb) | 完成 |
5 | 账户account与签名 | 完成 | |
6 | 可分隔资产 | 开发中 | |
7 | API | API规划 | 完成 |
8 | WEBUI | 块浏览器 | 开发中 |
9 | 资产管理 | 开发中 | |
10 | 账户管理 | 完成 | |
11 | 网络 | 协调节点 | 完成 |
12 | 节点管理(增减节点) | 开发中 | |
13 | 应用 | 生态系统(代码仓库、分布式应用、资产、价值) | 规划完成 |