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 “提交”
MbedJSONValue.cpp
- Committer:
- webmaster
- Date:
- 2017-11-03
- Revision:
- 10:aabd720e632c
- Parent:
- 8:f2a567ee3a46
File content as of revision 10:aabd720e632c:
#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; }