hwelltech block chain cpp sdk
Dependencies: EthernetInterface SDFileSystem mbed-rtos mbed uniqueCPUID
Fork of bcsdk by
bcsdk 是 block chain sdk 的简写。它是由江苏恒为信息科技有限公司开发的 BlockChain 的 基于 mbed os 的 C++ 版本SDK,它能帮助开发者快速的在支持 mbed os 的芯片上开发 BlockChain 的应用。 bcsdk 的demo文件中包含了BlockChain中的 Key、Account、Asset、Transaction等方面的示例。其中: (1) Key 加密私钥是区块链上的主要授权机制。他们控制资产单位的发行和转让。 资产或帐户将定义发行或转移所需的单个密钥。 在 Key_test.cpp 中,我们实现了: 创建HSM密钥 键入密钥别名的名称(例如'gold','silver','bronze'),密钥别名是用于区分密钥的标签。
(2) Asset 资产是一种可以在区块链上发布的值类型。资产的所有单位均可互换,可以在各方之间直接交易,无需发行人参与。 在 Asset_test.cpp 中,我们实现了: 创建资产 键入资产别名的名称(例如'gold','silver','bronze'),资产别名是用于区分资产的标签。 选择“Key”键以使用现有的HSM密键,此密钥将用于此帐户中资产单位的发放和转移。
(3) Account 加帐户是恒为区块链核心平台中的一个对象,通过创建和跟踪控制程序来跟踪区块链上的资产的所有权。创建帐户时,您提供一个或多个“root”密钥和仲裁。 在 Account_test.cpp 中,我们实现了: 创建帐户 1 输入帐户别名的名称(例如'alice','bob'),帐户别名是用于区分帐户的标签。 2 键入名称以生成新的HSM密钥(例如'alice key','bob key'),此密钥将用于此帐户中资产单位的发放和转移。
(4) Transaction 交易包含一个或多个输入,以及一个或多个输出。恒为区块链核心平台的API允许您使用操作(包括发出,支出和返还)构建交易。 在 Transaction_test.cpp 中,我们实现了: 资产的交易 1 添加“账户支出”操作 2 为资产别名选择“Asset” 3 输入“100”作为金额 4 添加“使用帐户控制”操作 5 为帐户别名选择“Account” 6 为资产别名选择“Asset” 7 输入“100”作为金额 8 “提交”
Client.cpp@8:f2a567ee3a46, 2017-09-21 (annotated)
- Committer:
- webmaster
- Date:
- Thu Sep 21 02:09:04 2017 +0000
- Revision:
- 8:f2a567ee3a46
- Child:
- 10:aabd720e632c
test create asset;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
webmaster | 8:f2a567ee3a46 | 1 | #include "Client.h" |
webmaster | 8:f2a567ee3a46 | 2 | //#include <WINSOCK2.H> |
webmaster | 8:f2a567ee3a46 | 3 | #include "mbed.h" |
webmaster | 8:f2a567ee3a46 | 4 | #include "EthernetInterface.h" |
webmaster | 8:f2a567ee3a46 | 5 | //#include "BlockChain.h" |
webmaster | 8:f2a567ee3a46 | 6 | |
webmaster | 8:f2a567ee3a46 | 7 | |
webmaster | 8:f2a567ee3a46 | 8 | Client::Client() |
webmaster | 8:f2a567ee3a46 | 9 | { |
webmaster | 8:f2a567ee3a46 | 10 | m_strIP = "101.201.199.150"; |
webmaster | 8:f2a567ee3a46 | 11 | m_sPort = 80; |
webmaster | 8:f2a567ee3a46 | 12 | m_url = "/info"; |
webmaster | 8:f2a567ee3a46 | 13 | m_host = "testbc.hwelltech.com"; |
webmaster | 8:f2a567ee3a46 | 14 | m_token = "962cd39d-6496-4b23-a2c5-85e445069a78"; |
webmaster | 8:f2a567ee3a46 | 15 | } |
webmaster | 8:f2a567ee3a46 | 16 | |
webmaster | 8:f2a567ee3a46 | 17 | Client::Client(string ip,short port) |
webmaster | 8:f2a567ee3a46 | 18 | { |
webmaster | 8:f2a567ee3a46 | 19 | this->m_strIP = ip; |
webmaster | 8:f2a567ee3a46 | 20 | this->m_sPort = port; |
webmaster | 8:f2a567ee3a46 | 21 | |
webmaster | 8:f2a567ee3a46 | 22 | m_url = "/info"; |
webmaster | 8:f2a567ee3a46 | 23 | m_host = "testbc.hwelltech.com"; |
webmaster | 8:f2a567ee3a46 | 24 | m_token = "962cd39d-6496-4b23-a2c5-85e445069a78"; |
webmaster | 8:f2a567ee3a46 | 25 | } |
webmaster | 8:f2a567ee3a46 | 26 | |
webmaster | 8:f2a567ee3a46 | 27 | Client::~Client() |
webmaster | 8:f2a567ee3a46 | 28 | { |
webmaster | 8:f2a567ee3a46 | 29 | |
webmaster | 8:f2a567ee3a46 | 30 | } |
webmaster | 8:f2a567ee3a46 | 31 | |
webmaster | 8:f2a567ee3a46 | 32 | bool Client::build_post_raw(const string & url,const string & content, string & post_raw) |
webmaster | 8:f2a567ee3a46 | 33 | { |
webmaster | 8:f2a567ee3a46 | 34 | return build_post_raw(url,m_host,m_token,content,post_raw); |
webmaster | 8:f2a567ee3a46 | 35 | } |
webmaster | 8:f2a567ee3a46 | 36 | |
webmaster | 8:f2a567ee3a46 | 37 | bool Client::build_post_raw(const string & url, const string & host, const string & token, const string & content, string & post_raw) |
webmaster | 8:f2a567ee3a46 | 38 | { |
webmaster | 8:f2a567ee3a46 | 39 | bool ret = true; |
webmaster | 8:f2a567ee3a46 | 40 | |
webmaster | 8:f2a567ee3a46 | 41 | post_raw = ""; |
webmaster | 8:f2a567ee3a46 | 42 | post_raw.append("POST "+ url + " HTTP/1.1\r\n"); |
webmaster | 8:f2a567ee3a46 | 43 | post_raw.append("Host: " + host + "\r\n"); |
webmaster | 8:f2a567ee3a46 | 44 | post_raw.append("Connection: keep-alive\r\n"); |
webmaster | 8:f2a567ee3a46 | 45 | post_raw.append("accept: application/json\r\n"); |
webmaster | 8:f2a567ee3a46 | 46 | post_raw.append("content-type: application/json\r\n"); |
webmaster | 8:f2a567ee3a46 | 47 | string authorization = "Basic YmxvY2tnZW5lcmF0b3I6MTM3NzQzMDJlNTcyYmU4MWMxZmRmZjg2NGZiODA2Yjc2NjcxMzg5NzMwZjBjMDYwZDNlODExNTQ4OGRjNjQ2Mg=="; |
webmaster | 8:f2a567ee3a46 | 48 | //if(!token.empty()) |
webmaster | 8:f2a567ee3a46 | 49 | // authorization = Base64Encode(token) |
webmaster | 8:f2a567ee3a46 | 50 | post_raw.append("authorization: " + authorization + "\r\n"); |
webmaster | 8:f2a567ee3a46 | 51 | |
webmaster | 8:f2a567ee3a46 | 52 | char pLen[16] = {0}; |
webmaster | 8:f2a567ee3a46 | 53 | //sprintf_s(pLen, sizeof(pLen), "%d", content.length()); |
webmaster | 8:f2a567ee3a46 | 54 | sprintf(pLen, "%d", content.length()); |
webmaster | 8:f2a567ee3a46 | 55 | string strLen = pLen; |
webmaster | 8:f2a567ee3a46 | 56 | |
webmaster | 8:f2a567ee3a46 | 57 | post_raw.append("Content-Length: " + strLen + "\r\n"); |
webmaster | 8:f2a567ee3a46 | 58 | post_raw.append("\r\n"); |
webmaster | 8:f2a567ee3a46 | 59 | post_raw.append(content); |
webmaster | 8:f2a567ee3a46 | 60 | post_raw.append("\r\n\r\n"); |
webmaster | 8:f2a567ee3a46 | 61 | |
webmaster | 8:f2a567ee3a46 | 62 | return ret; |
webmaster | 8:f2a567ee3a46 | 63 | } |
webmaster | 8:f2a567ee3a46 | 64 | |
webmaster | 8:f2a567ee3a46 | 65 | int Client::http_post(const string & url,const string & content,string & strOut) |
webmaster | 8:f2a567ee3a46 | 66 | { |
webmaster | 8:f2a567ee3a46 | 67 | string post_raw = ""; |
webmaster | 8:f2a567ee3a46 | 68 | build_post_raw(url,content,post_raw); |
webmaster | 8:f2a567ee3a46 | 69 | return http_post_raw(post_raw,strOut); |
webmaster | 8:f2a567ee3a46 | 70 | } |
webmaster | 8:f2a567ee3a46 | 71 | |
webmaster | 8:f2a567ee3a46 | 72 | int Client::http_post_raw(const string &strIn,string &strOut) |
webmaster | 8:f2a567ee3a46 | 73 | { |
webmaster | 8:f2a567ee3a46 | 74 | string strReq; |
webmaster | 8:f2a567ee3a46 | 75 | string strRep; |
webmaster | 8:f2a567ee3a46 | 76 | strReq = strIn; |
webmaster | 8:f2a567ee3a46 | 77 | |
webmaster | 8:f2a567ee3a46 | 78 | //SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
webmaster | 8:f2a567ee3a46 | 79 | TCPSocketConnection sClient; |
webmaster | 8:f2a567ee3a46 | 80 | /* |
webmaster | 8:f2a567ee3a46 | 81 | if(sClient == INVALID_SOCKET) |
webmaster | 8:f2a567ee3a46 | 82 | { |
webmaster | 8:f2a567ee3a46 | 83 | printf("invalid socket!"); |
webmaster | 8:f2a567ee3a46 | 84 | return 0; |
webmaster | 8:f2a567ee3a46 | 85 | } |
webmaster | 8:f2a567ee3a46 | 86 | */ |
webmaster | 8:f2a567ee3a46 | 87 | #ifdef WIN32 |
webmaster | 8:f2a567ee3a46 | 88 | // windows下是这样设置超时时间 |
webmaster | 8:f2a567ee3a46 | 89 | int recvTimeout = 3 * 1000; //30s |
webmaster | 8:f2a567ee3a46 | 90 | int sendTimeout = 3 * 1000; //30s |
webmaster | 8:f2a567ee3a46 | 91 | setsockopt(sClient, SOL_SOCKET, SO_RCVTIMEO, (char *)&recvTimeout ,sizeof(int)); |
webmaster | 8:f2a567ee3a46 | 92 | setsockopt(sClient, SOL_SOCKET, SO_SNDTIMEO, (char *)&sendTimeout ,sizeof(int)); |
webmaster | 8:f2a567ee3a46 | 93 | #elif __LINUX__ |
webmaster | 8:f2a567ee3a46 | 94 | // linux下是这样设置超时时间 |
webmaster | 8:f2a567ee3a46 | 95 | struct timeval timeout = {3,0}; |
webmaster | 8:f2a567ee3a46 | 96 | setsockopt(sClient, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,sizeof(struct timeval)); |
webmaster | 8:f2a567ee3a46 | 97 | setsockopt(sClient, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,sizeof(struct timeval)); |
webmaster | 8:f2a567ee3a46 | 98 | #else |
webmaster | 8:f2a567ee3a46 | 99 | unsigned int timeout = 1500; |
webmaster | 8:f2a567ee3a46 | 100 | sClient.set_blocking(false, timeout); // Timeout after (1.5)s |
webmaster | 8:f2a567ee3a46 | 101 | #endif |
webmaster | 8:f2a567ee3a46 | 102 | |
webmaster | 8:f2a567ee3a46 | 103 | |
webmaster | 8:f2a567ee3a46 | 104 | /* |
webmaster | 8:f2a567ee3a46 | 105 | sockaddr_in serAddr; |
webmaster | 8:f2a567ee3a46 | 106 | serAddr.sin_family = AF_INET; |
webmaster | 8:f2a567ee3a46 | 107 | serAddr.sin_port = htons(m_sPort); |
webmaster | 8:f2a567ee3a46 | 108 | serAddr.sin_addr.S_un.S_addr = inet_addr(m_strIP.c_str()); |
webmaster | 8:f2a567ee3a46 | 109 | if(connect(sClient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) |
webmaster | 8:f2a567ee3a46 | 110 | { |
webmaster | 8:f2a567ee3a46 | 111 | printf("connect error !"); |
webmaster | 8:f2a567ee3a46 | 112 | closesocket(sClient); |
webmaster | 8:f2a567ee3a46 | 113 | return SOCKET_ERROR; |
webmaster | 8:f2a567ee3a46 | 114 | } |
webmaster | 8:f2a567ee3a46 | 115 | */ |
webmaster | 8:f2a567ee3a46 | 116 | while (sClient.connect(m_strIP.c_str(), m_sPort) < 0) { |
webmaster | 8:f2a567ee3a46 | 117 | printf("Unable to connect to (%s) on port (%d)\n", m_strIP.c_str(), m_sPort); |
webmaster | 8:f2a567ee3a46 | 118 | wait(1); |
webmaster | 8:f2a567ee3a46 | 119 | } |
webmaster | 8:f2a567ee3a46 | 120 | printf("Connected to Server at %s\n", m_strIP.c_str()); |
webmaster | 8:f2a567ee3a46 | 121 | |
webmaster | 8:f2a567ee3a46 | 122 | int ret = 0; |
webmaster | 8:f2a567ee3a46 | 123 | |
webmaster | 8:f2a567ee3a46 | 124 | /* |
webmaster | 8:f2a567ee3a46 | 125 | int left = strReq.length(); |
webmaster | 8:f2a567ee3a46 | 126 | unsigned int pos = 0; |
webmaster | 8:f2a567ee3a46 | 127 | ret = send(sClient, strReq.c_str(), strReq.length(), 0); |
webmaster | 8:f2a567ee3a46 | 128 | while (ret < left ) |
webmaster | 8:f2a567ee3a46 | 129 | { |
webmaster | 8:f2a567ee3a46 | 130 | pos = pos + ret; |
webmaster | 8:f2a567ee3a46 | 131 | ret = send(sClient, strReq.c_str() + pos, strReq.length() - pos, 0); |
webmaster | 8:f2a567ee3a46 | 132 | ret = sClient.send(strReq.c_str() + pos, strReq.length() - pos); |
webmaster | 8:f2a567ee3a46 | 133 | if (ret < 0) |
webmaster | 8:f2a567ee3a46 | 134 | { |
webmaster | 8:f2a567ee3a46 | 135 | return SOCKET_ERROR; |
webmaster | 8:f2a567ee3a46 | 136 | } |
webmaster | 8:f2a567ee3a46 | 137 | } |
webmaster | 8:f2a567ee3a46 | 138 | */ |
webmaster | 8:f2a567ee3a46 | 139 | ret = sClient.send_all((char *)strReq.c_str(), strReq.length()); |
webmaster | 8:f2a567ee3a46 | 140 | if (ret < 0) |
webmaster | 8:f2a567ee3a46 | 141 | { |
webmaster | 8:f2a567ee3a46 | 142 | //get last error |
webmaster | 8:f2a567ee3a46 | 143 | //get errno |
webmaster | 8:f2a567ee3a46 | 144 | return ret; |
webmaster | 8:f2a567ee3a46 | 145 | } |
webmaster | 8:f2a567ee3a46 | 146 | |
webmaster | 8:f2a567ee3a46 | 147 | #ifdef DEBUG_LOG |
webmaster | 8:f2a567ee3a46 | 148 | cout<< ">>>>>>>>>>HTTP Request (Length = "<< strReq.length() << "):\n" << strReq << endl; |
webmaster | 8:f2a567ee3a46 | 149 | #endif |
webmaster | 8:f2a567ee3a46 | 150 | |
webmaster | 8:f2a567ee3a46 | 151 | |
webmaster | 8:f2a567ee3a46 | 152 | char recData[BUFSIZE+1] = {0}; |
webmaster | 8:f2a567ee3a46 | 153 | |
webmaster | 8:f2a567ee3a46 | 154 | ret = 0; |
webmaster | 8:f2a567ee3a46 | 155 | //ret = recv(sClient, recData, BUFSIZE, 0); |
webmaster | 8:f2a567ee3a46 | 156 | ret = sClient.receive(recData, BUFSIZE); |
webmaster | 8:f2a567ee3a46 | 157 | strRep.append(recData); |
webmaster | 8:f2a567ee3a46 | 158 | |
webmaster | 8:f2a567ee3a46 | 159 | // 第一次收数据可能没有收完全,所以一直收到没有数据为止,这里会堵塞 |
webmaster | 8:f2a567ee3a46 | 160 | while (ret > 0) |
webmaster | 8:f2a567ee3a46 | 161 | { |
webmaster | 8:f2a567ee3a46 | 162 | memset(recData,0,BUFSIZE); |
webmaster | 8:f2a567ee3a46 | 163 | //ret = recv(sClient, recData, BUFSIZE, 0); |
webmaster | 8:f2a567ee3a46 | 164 | ret = sClient.receive(recData, BUFSIZE); |
webmaster | 8:f2a567ee3a46 | 165 | |
webmaster | 8:f2a567ee3a46 | 166 | if (ret > 0) |
webmaster | 8:f2a567ee3a46 | 167 | { |
webmaster | 8:f2a567ee3a46 | 168 | strRep.append(recData); |
webmaster | 8:f2a567ee3a46 | 169 | } |
webmaster | 8:f2a567ee3a46 | 170 | } |
webmaster | 8:f2a567ee3a46 | 171 | |
webmaster | 8:f2a567ee3a46 | 172 | strOut = strRep; |
webmaster | 8:f2a567ee3a46 | 173 | |
webmaster | 8:f2a567ee3a46 | 174 | #ifdef DEBUG_LOG |
webmaster | 8:f2a567ee3a46 | 175 | cout<< ">>>>>>>>>>HTTP Response (Length = "<< strRep.length() << "):\n" << strRep << endl; |
webmaster | 8:f2a567ee3a46 | 176 | #endif |
webmaster | 8:f2a567ee3a46 | 177 | |
webmaster | 8:f2a567ee3a46 | 178 | // Clean up |
webmaster | 8:f2a567ee3a46 | 179 | //closesocket(sClient); |
webmaster | 8:f2a567ee3a46 | 180 | sClient.close(); |
webmaster | 8:f2a567ee3a46 | 181 | return 0; |
webmaster | 8:f2a567ee3a46 | 182 | } |