DECENT基金会是一个非盈利基金会,成立于2015年,是全球最早的区块链公司之一。DECENT开发了一个开源的区块链系统,叫做DCore。DCore是一个授权用户可以创建和迁移应用到区块链系统的平台。与顶尖的投资基金和孵化器紧密合作。DECENT致力于通过独特的区块链技术构建区块链生态来帮助开发者和商业伙伴适应未来去中心化的情况,特别是在媒体和娱乐领域。
DCore项目成立于2017年,DCore是一个稳定的、可定制的、合算的开源的可以轻松在上面创建应用的区块链平台。使用DPoS为DApp提供简化的、分布式的和无边界的内容和数据分发方式,来彻底改变数字数据的交换方式。DCore为开发者提供有好的SDK,让开发者和合作伙伴轻松地创建DApp。DCore的快速、功能强大、划算和强大的可定制特点,使之成为任何规模项目的理想区块链选择。
DCT是DCore 的加密资产。
2015年Q2,DECENT 基金会在瑞士成立;
2015年Q3,发布区块链白皮书;
2015年Q4,在斯诺伐克成立第一个办事中心,开始原型开发;
2016年Q1,区块链原型搭建完毕,允许在区块链上进行内容分发;
2016年Q2,原型上线后,团队开始在全球包括美国、欧洲和亚洲进行路演,演示和验证这个区块链内容分发平台;
2016年Q3,通过全球路演,与很多组织建立了合作关系,并于7月份宣布ICO,于9月募集了5881个比特币,同时部分开源了代码;
2016年Q4,在中国上海成立了第一个国际分公司;
2017年Q1,发布第一个DCore测试网络——Caesar;
2017年Q2,发布第二个DCore测试网络——Alberti,并在社区共同帮助下,成立了DCore主干网,同时发布了一个DAPP—— DECENTGO,一个允许任何人上传和下载的内容商店。
2017年Q4,与ALAX(游戏商店)成为合作伙伴;
2018年Q1,DCore重大更新,支持Custom Token,区块链及时消息传输、种子传播和设置。并写大量的用例和文档;
2018年Q3,发布SDK,包括工具包、文档、android代码用例。
DCore是DECENT发布的区块链平台,具有以下特性:
主要包括以下功能:
DCore网络节点主要包括矿工、Seeder和普通节点三种角色的节点,可以通过节点启动的配置设置加入网络的角色。
Miner是网络中负责打包区块的节点,通过挖矿可以获取挖矿奖励。
Seeder通过提供内容存储,可以扩展DCore网络。Seeder主要有一下权利和义务,存储和分发内容、提供解密的一部分密钥、赚取收益。
General node是网络中没有设置要成为miner或者seeder的节点。
DCore的账本是基于其自己实现的一个的对象存储数据库实现的。该数据库支持根据索引进行多层快速回滚。DCore是账户模型,核心的数据结构有Block和Transaction。
Block有一个BlockHeader和区块体,区块头有blockid、签名、公钥、区块高度、父区块blockid、矿工、时间戳、交易merkle root、等信息。区块体里包含区块里所有的交易。
Transaction 主要有以下字段:
struct transaction
{
// 引用的块号
uint16_t ref_block_num = 0;
// 引用块id前缀
uint32_t ref_block_prefix = 0;
// 交易超时时间
fc::time_point_sec expiration;
vector operations;
extensions_type extensions;
vector signatures;
vector operation_results;
}
和一般公链不同的是,DCore的交易必须有ref_block_num
和 ref_block_prefix
,用来表示交易最近使用的上下文的块。DCore的每个交易还有超时时间,这样就不需要在内存中一直保持过期的交易。
DCore采用的是DPoS共识协议来保证网络节点之间达成共识。每一个DCT持有者都可以使用投票工具对候选人进行投票,每24小时进行一次矿工选举,得票高的当选为矿工,出块间隔为5s。如果矿工在轮值期间作恶,通过评级手段会很容易被降级。
由于矿工是通过选举产生并协同出块,出块周期为5s,矿工需要以最小的网络延时来操作节点,以便能够快速地将结果提交给网络并传给下一个矿工,矿工也不需要建立矿池,因为矿池之间的通信会增加延时,而降低整体的挖矿效率。
DPoS在切换矿工时会容易产生分叉,而导致交易可能会被逆转,为了降低矿工切换时的分叉,下一个矿工会在出块前进行14次确认(约30s),当2/3的矿工确认了后才进行出块,这样可以保证在没有人工干预的情况下不会出现交易逆转。
DCore设计上一个关键的特性是在服务器之上构建起的核心覆盖网络。这个网络是有区块链网络中的志愿者节点通过P2P链接起来的。这个网络在RFC5128基础上实现的。
通过代理会话的初始化、直接和间接链接、中继等方式可以对该网络进行访问。
由于网络中IPV4网段不足,所以节点都是通过动态IP个动态DNS接入网络。被访问节点需要能够与发起者建立直接的链接。其他的服务(如:IRC),建议自托管静态地址、反向DNS记录、动态DNS或NAT中打开的目的地端口。
DCore作为一个内容分发平台,其内部集成了IPFS作为其内容存储工具。这也是DCore的最大的亮点。基于IPFS的CDN网络,DCore可是实现内容的上载、存储和下载等功能。该网络由DCore中的Seeder节点组成,Seeder节点通过存储证明来进行挖矿,DCore会对网络中的Seeder进行评级,内容生成者用用户可以优先选择高评级的Seeder进行内容上载和下载。
DCore网络中具体Seeder节点和存储引擎交互的关系如下图所示:
上图所示,DCore使用seed_plug插件和Package模块来管理这些内容引擎。DCore定义了一个传输引擎抽象类 TransferEngineInterface
, 包括以下接口:如下所示:
/**
* Base class for transfer engines
*/
class TransferEngineInterface {
public:
virtual std::shared_ptr create_download_task(PackageInfo& package) = 0;
virtual std::shared_ptr create_start_seeding_task(PackageInfo& package) = 0;
virtual std::shared_ptr create_stop_seeding_task(PackageInfo& package) = 0;
};
该类包含3个接口 create_download_task
, create_start_seeding_task
, create_stop_seeding_task
3个接口,通过这3个接口实现内容的传输任务。通过该接口可以适配不同的分布式文件存储系统,并与DCore打通,目前DCore支持了Local、IPFS、Torrent3种类型的存储传输引擎。
详细的流程主要分为下面5个阶段:
miner_plug
,history_plug
,seeding_plug
,messaging_plug
,transaction_history_plug
5个插件。// ./programs/decentd/main.cpp main 方法中:
auto miner_plug = node->register_plugin();
auto history_plug = node->register_plugin();
auto seeding_plug = node->register_plugin();
auto messaging_plug = node->register_plugin();
auto transaction_history_plug = node->register_plugin();
这里的seeding_plug就是与各种内容存储引擎交互的模块,节点通过启动参数配置选择自己是否要以Seeder的方式加入网络。
application.initialize_plugins
方法会对所有注册进主进程的插件进行初始化。Seeder的启动参数是通过结构体seeding_plugin_startup_options
进行管理,如下所示:struct seeding_plugin_startup_options
{
// Seeder的账户ID
account_id_type seeder;
// EL Gamal内容私钥
DInteger content_private_key;
// seeder节点私钥
private_key seeder_private_key;
// 提供存储的空间,单位: MB
uint64_t free_space;
// 每MB存储价格
std::string seeding_price;
// Seeder资产类型,比如DCT
std::string seeding_symbol;
// 内容存储路径
fc::path packages_path;
// 可选的代码:ISO 3166-1 alpha-2 two-letter
std::string region_code;
};
启动seeding_plug
seeding_plug的启动分成两个步骤,plugin_pre_startup
和plugin_startup
。
plugin_pre_startup
主要是内容存储数据库的建立。
plugin_startup
启动restore_state
函数和service_thread.schedule
功能。restore_state
是在重启的时候恢复所有的下载和播种,service_thread.schedule
是启动一个线程,会将定时(8小时)地将 ipfs产生的内容索引地push到链上。
seeding_plug 事件处理
DCore 中实际进行内容处理的类是seeding_plugin_impl
,该类是seeding_plug
的具体实现。该类主要有以下几个方法。
// 生成包的proof of retrievability证明,会通过tx的方式记录到DCore主链上
void generate_pors();
// 删除与包相关的数据和存储对象
void release_package(const my_seeding_object &mso, decent::package::package_handle_t package_handle);
// 只有在应用了最高块以后才会被调用,依据操作是购买或提交内容,则将其传递给相应的处理程序。
void handle_commited_operation(const operation_history_object &op_obj, bool sync_mode);
// 提交内容
void handle_content_submit(const content_submit_operation &op);
// 购买操作:会通过tx的方式记录到DCore主链上
void handle_request_to_buy(const request_to_buy_operation &op);
seeding_plugin_impl
通过PackageManager来绑定到不同的内容存储引擎进行内容的相关操作。PackageManager会依据存储引擎的协议类型返回不同的PackageInfo实例package_handler。PackageInfo主要包括下面这些方法:// 创建包
void create(bool block = false);
// 解包到指定文件夹
void unpack(const boost::filesystem::path& dir_path, const fc::sha256& key, bool block = false);
// 根据包内容url下载包
void download(bool block = false);
// 开始播种包
void start_seeding(std::string proto = "", bool block = false);
// 结束播种
void stop_seeding(std::string proto = "", bool block = false);
// 验证数据完整性
void check(bool block = false);
// 删除包和数据
void remove(bool block = false);
// 创建数据存储证明
void create_proof_of_custody(const decent::encrypt::CustodyData& cd, decent::encrypt::CustodyProof& proof)const;
void wait_for_current_task();
void cancel_current_task(bool block = false);
其中download
,start_seeding
,stop_seeding
会调用具体的内容存储引擎以与具体的分布式文件系统通讯。
目前DCore提供两个SDK,dcorejs-lib和dcorejs,dcorejs-lib可以用js构建、签名、广播交易,还可以轻松地访问区块链中的数据。dcorejs 较之dcorejs-lib会更加简单。