/* 作 者: itdef 欢迎转帖 请保持文本完整并注明出处 技术博客 http://www.cnblogs.com/itdef/ 技术交流群 群号码:432336863欢迎c c++ windows驱动爱好者 服务器程序员沟通交流部分老代码存放地点http://www.oschina.net/code/list_by_user?id=614253 */ 书接上文 我们先来看区块的结构 class Block { public: string sPrevHash; //记录上个块的哈希值 Bl…
/* 作 者: itdef 欢迎转帖 请保持文本完整并注明出处 技术博客 http://www.cnblogs.com/itdef/ 技术交流群 群号码:432336863欢迎c c++ windows驱动爱好者 服务器程序员沟通交流部分老代码存放地点http://www.oschina.net/code/list_by_user?id=614253 */ 今天,我将开启一个使用c++模拟区块链的系列,记录自己学习区块链与实践的心得体会. 文章将参考<一步步教小白使用C++构建区块链>(c++…
/* 作 者: itdef 欢迎转帖 请保持文本完整并注明出处 技术博客 http://www.cnblogs.com/itdef/ 技术交流群 群号码:432336863欢迎c c++ windows驱动爱好者 服务器程序员沟通交流部分老代码存放地点http://www.oschina.net/code/list_by_user?id=614253 */ 本章节相比前两节课程,增加了交易等处理,而在工作量证明,挖矿,创建区块,以及区块链的操作也细致了不少. 工程的具体建立可以参考前两章节内容,…
本文主要在之前的区块链原形上添加了工作量证明,并且为后继的交易功能做好准备. 上一个章节我们已经创建了区块链的基本原形,但是区块的哈希计算和加入太过于简单,如果按照这种速度添加区块那么区块链估计一个小时就爆满了. 真实的比特币中是全网一个小时产生6个区块,我们的示例中也需要调整区块哈希计算的难度. 工作量证明 人为的提升哈希计算的阀值,加大哈希计算难度与工作量,这样的工作机制才能保证整个区块链数据的安全性和一致性. 工作量证明 区块链的一个关键点就是,一个人必须经过一系列困难的工作,才能将数据放…
有了区块和区块链的基本结构,有了工作量证明,我们已经可以开始挖矿了.剩下就是最核心的功能-交易,但是在开始实现交易这一重大功能之前,我们还要预先做一些铺垫,比如数据的序列化和启动命令解析. 根据<用 Go 构建一个区块链>的目录, 本章节的区块数据的序列化存储会使用一款KV数据库.其中比特币中是使用的是谷歌出品.c++编写的 LevelDB数据库,go语言示例中使用的是BoltDB. 我本来考虑使用redis和json来进行我们的数据序列化存储.使用boost库的program_options…
交易(transaction)是比特币的核心所在,而区块链的唯一目的,也正是为了能够安全可靠地存储交易.在区块链中,交易一旦被创建,就没有任何人能够再去修改或是删除它.在今天的文章中,我们会实现交易的通用机制. 如果以前开发过 web 应用,在支付的实现环节,你可能会在数据库中创建这样两张表: accounts transactions account(账户)会存储用户信息,里面包括了个人信息和余额.transaction(交易)会存储资金转移信息,也就是资金从一个账户转移到另一个账户这样的内容…
Merkle 树 完整的比特币数据库(也就是区块链)需要超过 140 Gb 的磁盘空间.因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本.随着越来越多的人使用比特币,这条规则变得越来越难以遵守:因为不太可能每个人都去运行一个全节点.并且,由于节点是网络中的完全参与者,它们负有相关责任:节点必须验证交易和区块.另外,要想与其他节点交互和下载新块,也有一定的网络流量需求. 在中本聪的 比特币原始论文 中,对这个问题也有一个解决方案:简易支付…
账号创建完成之后,账号余额是0,但是部署合约是需要消耗GAS的,因此需要获取一定的以太币才能够继续本次实现.在测试网中获取以太币可以通过挖矿的方式,在开发菜单中可以选择打开挖矿模式,但是这需要将Syn Mode模式修改为Full,这意味着需要将测试网的全部区块数据同步下来才可以进行挖矿,这些数据非常大且同步缓慢,因此建议采用第2种方案:到以太坊基金会申请以太币,读者可以自行搜索“获取测试网以太坊币”,会有相关的网址获取以太币,一般需要输入读者自己的测试环境以太坊账号. (1)本节使用的代码案例需…
本节仅以一个简单的智能合约示例,介绍智能合约的基本组成元素,本合约定义一个uint类型的变量,以及对应这个变量的读写函数. 01 pragma solidity >=0.4.0 <0.6.0; 02 03 contract SimpleStorage { //使用关键字contract定义合约结构体 04 uint storedData; //定义一个变量 05 06 function set(uint x) public { //定义关于该变量的设置函数 07 storedData = x;…
笔者一直强调,一定要利用区块链的特点来解决行业存在的问题,并且该问题最好用区块链解决或者说只能用区块链解决.彩票行业就是个例子. 在讲解代码之前,首先讲解一下业务设计,如图6.15所示. 图6.15 区块链彩票业务流程 限于篇幅和业务复杂度,该系统并没有按照现有的福彩逻辑来设计,而是本着讲明白实现原理的目的,简化了系统的设计,读者可以根据自己的需求来设计符合自己需求的系统.首先在传统的福彩流程中,用户会花费人民币购买彩票,然后福彩系统将相关的投注信息传送到福彩中心.当投注日期截止后,通过机器摇号…