木千
这个作者很懒,什么都没留下…
展开
-
C++从零开始区块链:main函数的一种实现
前面已经把各种业务逻辑都写好了,main函数怎么调用就随便了,这里只是其中一种实现方法int main(int argc, char **argv){ if (argc < 2) { std::cout << "argc error!" << std::endl; return 0; } st...原创 2018-09-07 10:37:08 · 12195 阅读 · 8 评论 -
C++从零开始区块链:P2P模块之节点广播
之前忘了说了,现在补上 主要有以下几个方案udp协议广播该方案的优点是协议自身支持,实现简单,高效。但其缺点也是致命的,就是只能在同一局域网内才能进行广播,限制太大。udp协议组播和广播的方案差不多,虽然udp协议支持在外网上的组播,但很依赖于网络设备是否支持。很遗憾,现实中绝大部分的网络设备是不支持的,同样只能在同一局域网内有效。节点轮询该方案的优点是不受网...原创 2018-09-07 10:33:22 · 13245 阅读 · 0 评论 -
C++从零开始区块链:区块链业务模块之主链同步
同样是采用一个简单,但效率低下的方案,遍历自己的链和其他节点的链,谁的长谁的就是主链。 然后将自己的链和主链进行比较,将自己的链上的区块挂在主链上,挂的同时验证一下自己的区块是否已经存在于主链上,如果存在就跳过。void BlockChain::MergeBlockChain(const std::string &json){ std::list<Block>...原创 2018-09-06 11:27:49 · 11581 阅读 · 0 评论 -
C++从零开始区块链:区块链业务模块之重复交易检测
想象这样一个场景: 节点a广播了一条消息,节点b和节点c都收到并记录在自己的交易列表中了。 然后节点b和节点c挖矿。 当节点b挖矿成功,将a的交易打包到区块中,并在网络上广播。 这时节点c接收到节点b的挖矿成功的广播,区块验证通过后挂到自己的区块上,然后继续挖矿。 当节点c也挖矿成功后,将自己的交易列表打包程区块在节点上广播。 而节点d是个小透明,先接收到b的区块,后接收到c的区块,然...原创 2018-09-06 11:22:54 · 11827 阅读 · 0 评论 -
C++从零开始区块链:区块链业务模块之余额检查
比特币中的余额检查实现起来好麻烦,严格来说比特币中并没有所谓的余额,具体请读者自行百度比特币相关的资料。 在本例中,我们采用一个效率低下,但很简单的方法:遍历整个区块链的所有交易,查找要查询的地址参与的所有交易,如果目标地址是支出方,就减少,是收入方就增加,便利后的结果就余额int BlockChain::CheckBalances(const std::string &addr...原创 2018-09-06 11:11:11 · 11669 阅读 · 0 评论 -
C++从零开始区块链:区块链业务模块之创建交易和区块
创建交易简单,直接给结构体赋值就行 Transactions BlockChain::CreateTransactions(const std::string &sender, const std::string &recipient, float amount){ Transactions ts; ts.sender = sender; t...原创 2018-09-06 11:07:10 · 11668 阅读 · 0 评论 -
C++从零开始区块链:区块链业务模块之挖矿
挖矿就是找到一个满足工作量验证条件的工作量证明,当一个节点找到了一个工作量证明之后,首先以给自己添加一个挖矿交易的形式进行金额奖励,即添加一个付款地址为0,收款地址为自己的交易到自己的交易记录。然后录他会将自己记录的所有交易信息打包程一个区块,并向其他节点进行广播。其他节点接收到以后会对工作量证明进行验证,验证通过后就会将该区块挂到自己的区块链上,等下次与主链同步的时候同步到主链上。 为了简化验...原创 2018-09-06 11:00:24 · 12042 阅读 · 0 评论 -
C++从零开始区块链:区块链业务模块之工作量证明与验证
原则上说,工作量证明算法应该是计算困难,验证容易,但我们这里只为学习,一切从简,使用一个简单的工作量证明算法:先取一个字符串,如“Hello Shacoin!”,然后取一个自然整数,再将该整数转成字符串,衔接到前面的字符串后面,形成一个新的字符串。然后将这个新字符串取哈希,判断哈希的最后一位是不是为0,如果是,则工作量证明通过,不是再将整数加一,继续重复上面的步骤,直到满足验证条件为止。为了简化对...原创 2018-09-06 10:50:03 · 11599 阅读 · 0 评论 -
C++从零开始区块链:区块链业务模块之交易地址生成
在比特币中,为了避免地址重复、安全性等各种问题,比特币的地址的生成过程是很繁琐的。我们这里由于只是学习其原理,一些实际中可能会遇到的问题就不予考虑了,将地址生成的过程最大程度的简化。 简化后的流程是:首先生成一对秘钥,然后对公钥取哈希,再将哈希转成BASE64,最后生成的一组BASE64编码的字符串就是最终看到的地址了,代码很简单,就两行std::string BlockChain::...原创 2018-09-06 10:47:01 · 11840 阅读 · 0 评论 -
C++从零开始区块链:区块链业务模块之基于boost的json读写
#include <boost/property_tree/ptree.hpp>#include <boost/property_tree/json_parser.hpp>std::string BlockChain::GetJsonFromBlock(Block &block){ boost::property_tree::ptree item;...原创 2018-09-06 10:43:03 · 11342 阅读 · 0 评论 -
C++从零开始区块链:区块链业务模块之区块结构定义
区块链的对外展示主要是以json的形式,我们先来定义一下json,主要是说明格式,数据什么的我瞎写的。实际应用中应该加入一个随机值用作校验,这里就不加了block = {'index': 1, //索引'timestamp': 15060571...原创 2018-09-06 10:38:51 · 11570 阅读 · 0 评论 -
C++从零开始区块链:P2P模块之UDP数据包分组排序
udp的特点是不可靠,不连接,数据发过去就完事,至于对方收没收到就不管了。 在使用udp进行通信的时候,要在应用层做分组、排序、组包、校验等工作。 发送方现将要发送的数据切片,所有的切片组成一组,标上组号,每个切片根据原始数据的顺序有个组内编号。 发送的时候,每次发送一个切片,并等待接收数据接收方反馈收到数据的信息,如果没有接收到数据接收方的反馈信息就继续发送,接收到数据接收方发送的反...原创 2018-09-06 10:21:46 · 12248 阅读 · 0 评论 -
C++从零开始区块链:P2P模块之节点注册和监听
ThreadPool是一个线程池,具体实现就不贴了,随便找个线程池实现就行,也可以戳这里查看程序完整代码。P2PNode::P2PNode(const char *if_name){ m_sock = socket(AF_INET, SOCK_DGRAM, 0);//IPV4 SOCK_DGRAM 数据报套接字(UDP协议) if (m_sock < 0) ...原创 2018-09-05 15:29:46 · 11800 阅读 · 0 评论 -
C++从零开始区块链:P2P模块之打洞服务器
原则上说,打洞服务器应该是可以返回多个节点的,这里为了简化,只返回一个节点。#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>...原创 2018-09-05 15:23:40 · 12549 阅读 · 3 评论 -
C++从零开始区块链:P2P模块之公共头文件定义
搞了台阿里云做内网打洞测试,宏开关ALITEST用来内外网测试转换 #define SERVERIP “xx.xx.xx.xx” 是外网测试机的外网IP#include <cstdio>#include <cstdlib>#include <cstring>#include <sys/ioctl.h>#include <...原创 2018-09-05 15:20:02 · 11536 阅读 · 0 评论 -
C++从零开始区块链:P2P模块之简单介绍一下原理
想彻底说明P2P的原理太麻烦了,而且这种东西网上一搜就是一大堆(虽然好多链接其实都是同一篇文章),这里就不赘述了,只简单说一下本例所用到的一些东西。 如果所有节点都在公网上,p2p通信就非常容易,找台搭桥服务器,每个节点启动的时候都向搭桥服务器注册自己,并获取其他节点信息,然后就可以节点间互相通信了。 但在实际的网络环境中,很多节点处于内网中,外面的节点很难直接访问到处于内网中的节点,也就...原创 2018-09-05 15:15:09 · 12226 阅读 · 0 评论 -
C++从零开始区块链:密码处理模块之基于openssl的数字签名
关于数字签名的原理请自行百度,我们这里使用椭圆曲线加密算法来进行签名,下面上代码void Cryptography::Createkey(KeyPair &keyPair){ unsigned char *p = NULL; keyPair.priKey.len = -1; keyPair.pubKey.len = -1; EC_GROUP *g...原创 2018-09-05 15:12:50 · 11874 阅读 · 0 评论 -
C++从零开始区块链:密码处理模块之基于openssl的BASE64编码与解码
#include <openssl/rsa.h>#include <openssl/x509.h>#include <openssl/bn.h>#include <openssl/evp.h>#include <openssl/bio.h>#include <openssl/buffer.h>std::strin...原创 2018-09-05 15:10:00 · 11694 阅读 · 0 评论 -
C++从零开始区块链:密码处理模块之基于boost的哈希值计算
这个没啥可说的,直接上代码#include <boost/uuid/sha1.hpp>std::string Cryptography::GetHash(void const* buffer, std::size_t len){ std::stringstream ss; boost::uuids::detail::sha1 sha; sha.pro...原创 2018-09-05 14:51:50 · 11737 阅读 · 0 评论 -
C++从零开始区块链:一个简单的总体介绍
本系列博文对理论性的东西叙述的不多,主要是以代码为主,本例是模仿比特币实现的一个电子货币记账系统。 虽然不打算介绍理论性的东西,但交易流程还是要说一下的,毕竟所有的代码都是为这个交易流程服务的。交易流程程序设计CryptographyP2PNodeBlockChain完整代码交易流程当发起一个交易的时候,交易发起方先准备一条“地址a要向地址b转账n个币”的消...原创 2018-09-05 14:39:01 · 13715 阅读 · 0 评论