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 “提交”
Diff: MbedJSONValue.cpp
- Revision:
- 8:f2a567ee3a46
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MbedJSONValue.cpp Thu Sep 21 02:09:04 2017 +0000 @@ -0,0 +1,246 @@ +#include "MbedJSONValue.h" + +# include <stdlib.h> +# include <stdio.h> + +// Clean up +void MbedJSONValue::clean() { + switch (_type) { + case TypeString: + delete _value.asString; + break; + case TypeArray: + for (int i = 0; i < index_array; i++) + delete array[i]; + index_array = 0; + break; + case TypeObject: + for (int i = 0; i < index_token; i++) { + delete token[i]; + delete token_name[i]; + } + index_token = 0; + break; + default: + break; + } + _type = TypeNull; + _type = TypeNull; +} + +bool MbedJSONValue::hasMember(char * name) +{ + for(int i = 0; i < index_token; i++) + if( !strcmp(name, (*(token_name[i])).c_str() )) + return true; + return false; +} + + +void copy(const std::string& s, std::back_insert_iterator<std::string> oi) { + std::copy(s.begin(), s.end(), oi); +} + +void serialize_str(const std::string& s, std::back_insert_iterator<std::string> oi) { + *oi++ = '"'; + for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) { + switch (*i) { +#define MAP(val, sym) case val: copy(sym, oi); break + MAP('"', "\\\""); + MAP('\\', "\\\\"); + MAP('/', "\\/"); + MAP('\b', "\\b"); + MAP('\f', "\\f"); + MAP('\n', "\\n"); + MAP('\r', "\\r"); + MAP('\t', "\\t"); +#undef MAP + default: + if ((unsigned char)*i < 0x20 || *i == 0x7f) { + char buf[7]; + sprintf(buf, "\\u%04x", *i & 0xff); + copy(buf, buf + 6, oi); + } else { + *oi++ = *i; + } + break; + } + } + *oi++ = '"'; +} + +std::string MbedJSONValue::serialize(){ + std::string s; + serialize(std::back_inserter(s)); + return s; +} + +std::string MbedJSONValue::to_str(){ + switch (_type) { + case TypeNull: + return "null"; + case TypeBoolean: + return _value.asBool ? "true" : "false"; + case TypeInt: { + char buf[10]; + sprintf(buf, "%d", _value.asInt); + return buf; + } + case TypeDouble: { + char buf[10]; + sprintf(buf, "%f", _value.asDouble); + return buf; + } + default: + break; + } + return NULL; +} + + + +void MbedJSONValue::serialize(std::back_insert_iterator<std::string> oi) { + switch (_type) { + case TypeString: + serialize_str(*_value.asString, oi); + break; + case TypeArray: { + *oi++ = '['; + for (int i = 0; i < index_array; i++) { + if (i) + *oi++ = ','; + (*this)[i].serialize(oi); + } + *oi++ = ']'; + break; + } + case TypeObject: { + *oi++ = '{'; + for (int i = 0; i < index_token; i++) { + if (i) + *oi++ = ','; + serialize_str(*(token_name[i]), oi); + *oi++ = ':'; + (*(token[i])).serialize(oi); + } + *oi++ = '}'; + break; + } + default: + copy(to_str(), oi); + break; + } +} + + + +MbedJSONValue& MbedJSONValue::operator[](int i) { + _type = TypeArray; + if (i < NB_TOKEN && index_array == i ) { +#ifdef DEBUG + printf("will add an element to the array\r\n"); +#endif + array[i] = new MbedJSONValue(); + index_array++; + return *(array[i]); + } + if (i < NB_TOKEN && index_array > i) + return *(array[i]); + + //if the user is not doing something wrong, this code is never executed!! + return *(new MbedJSONValue()); +} + +MbedJSONValue& MbedJSONValue::operator[](std::string k) { + _type = TypeObject; + for (int i = 0; i < index_token; i++) { +#ifdef DEBUG + printf("k: %s\r\n", k.c_str()); + printf("str: %s\r\n", token_name[i]->c_str()); +#endif + //existing token + if (!strcmp(k.c_str(), token_name[i]->c_str())) { +#ifdef DEBUG + printf("token found: %d\r\n", i); +#endif + return *(token[i]); + } + } + + if(index_token >= NB_TOKEN) + index_token = NB_TOKEN - 1; + //non existing token + token_name[index_token] = new std::string(k); + token[index_token] = new MbedJSONValue(); + index_token++; + return *(token[index_token - 1]); +} + +MbedJSONValue& MbedJSONValue::operator[](std::string k) const +{ + for (int i = 0; i < index_token; i++) { +#ifdef DEBUG + printf("k: %s\r\n", k.c_str()); + printf("str: %s\r\n", token_name[i]->c_str()); +#endif + if (!strcmp(k.c_str(), token_name[i]->c_str())) { +#ifdef DEBUG + printf("token found: %d\r\n", i); +#endif + return *(token[i]); + } + } + + //if the user is not doing something wrong, this code is never executed!! + return *(new MbedJSONValue()); +} + + +// Operators +MbedJSONValue& MbedJSONValue::operator=(MbedJSONValue const& rhs) { + if (this != &rhs) { + clean(); + _type = rhs._type; + switch (_type) { + case TypeBoolean: + _value.asBool = rhs._value.asBool; + break; + case TypeInt: + _value.asInt = rhs._value.asInt; + break; + case TypeDouble: + _value.asDouble = rhs._value.asDouble; + break; + case TypeString: + _value.asString = new std::string(*rhs._value.asString); + break; + case TypeArray: + for (int i = 0; i < rhs.index_array; i++) + (*this)[i] = rhs[i]; + case TypeObject: + for (int i = 0; i < rhs.index_token; i++) + (*this)[*(rhs.token_name[i])] = rhs[*(rhs.token_name[i])]; + default: + break; + } + } + return *this; +} + + +// Works for strings, arrays, and structs. +int MbedJSONValue::size() const { + switch (_type) { + case TypeString: + return int(_value.asString->size()); + case TypeArray: + return index_array; + case TypeObject: + return index_token; + default: + break; + } + return -1; +} + +