C++实现比特币系统的源码
这是我最近写的一个近乎于完整的模拟比特币的代码,实际上还不够完整,不过已经能实现打包交易进入区块,然后挖矿了。这个程序是只有一个节点在挖矿,所以暂时也不涉及分布式系统的东西,还算比较简单容易理解。这个程序就是整个网络中一个节点的视角。分享出来希望对大家有所帮助。
部署过程就是把代码统统贴过去,要注意的就是代码中有两个文件的路径,要手动改一下,代码中有两个文件的路径,要手动改一下,代码中有两个文件的路径,要手动改一下,重要的事情说三遍,然后就可以运行,观察比特币挖矿过程啦!有问题欢迎提问。
Blockchain.h这个没什么说的,创建一个区块链类
#pragmaonce #include"Block.h" #include//向量库 classBlockchain { public: Blockchain();//默认构造函数 voidAddBlock(BlockbNew);//增加区块函数 uint32_t_nDifficulty;//难度值 vector _vChain;//保存区块的变量 Block_GetLastBlock()const;//获取最新的区块,由const关键字,表示输出的内容不可更改 };
Blockchain.cpp修改难度值在这里修改Blockchain的构造函数中的nDifficulty就可以了。
#include"Blockchain.h" Blockchain::Blockchain() { _vChain.emplace_back(Block(0,"GenesisBlock")); _nDifficulty=4;//难度值设置3基本上秒出结果,4可以看出差距,5大约要等2分钟左右。 } voidBlockchain::AddBlock(BlockbNew) { bNew.sPrevHash=_GetLastBlock().GetHash(); bNew.MineBlock(_nDifficulty); _vChain.push_back(bNew); bNew.WriteBlcokToTXT();//调用区块类中的写文件方法 } BlockBlockchain::_GetLastBlock()const { return_vChain.back(); }
Block.h这里是声明区块类
#pragmaonce #include//包含了uint32_t等无符号整型 #include //标准输入输出库 #include usingnamespacestd; statictime_tfirst_time=0;//这个地方是为了记录每个区块产生距离第一个区块的时间而设置的全局变量 //创建区块类 classBlock { public: stringsPrevHash;//前一个区块的哈希值 Block(uint32_tnIndexIn,conststring&sDataIn);//构造函数 stringGetHash();//返回哈希值 voidMineBlock(uint32_tnDifficulty);//挖矿,其参数nDifficulty表示指定的难度值 voidNoMineBlock();//不挖矿直接添加区块 uint32_t_nIndex;//区块索引值,第几个区块,从0开始计算 int64_t_nNonce;//区块随机数 string_sData;//区块描述字符 string_sHash;//区块Hash值 time_t_tTime;//区块生成时间 string_CalculateHash()const;//计算Hash值,const保证输出的函数值不能被改变。 voidWriteBlcokToTXT();//将区块数据写入到TXT文件中 };
Block.cpp
#include"Block.h" #include"sha256.h" #include"time.h" #includeBlock::Block(uint32_tnIndexIn,conststring&sDataIn):_nIndex(nIndexIn),_sData(sDataIn) //构造函数Block的两个参数为nIndexIn和sDataIn,分别赋值到Block中的_nIndex和_sData(构造函数初始化用法) { _nNonce=-1;//Nounce设置为-1 _tTime=time(nullptr);//设置时间 if(nIndexIn==0)//此处整个时间记录下来是为了记录当前区块生成所需要的时间,而不是当前时间 first_time=_tTime; } stringBlock::GetHash()//返回哈希值函数的实现 { return_sHash; } voidBlock::MineBlock(uint32_tnDifficulty)//挖矿函数,参数为难度值。 { //charcstr[nDifficulty+1]; charcstr[10+1];//这个数组实际上设置多大都可以,但是要大于nDifficulty的值 for(uint32_ti=0;i nDifficulty的内容 //要寻找一个Nounce使得总体哈希值的前n位的0(即0的个数)和难度值的个数相同,则挖矿成功。 cout<<"Blockmined:"<<_sHash< sha256.h这是一个哈希算法,没什么说的,网上抄的,这个东西我到现在也没看懂,太深奥了。但是只要知道功能就行了。
#pragmaonce #ifndefSHA256_H #defineSHA256_H #includeclassSHA256 { protected: typedefunsignedcharuint8; typedefunsignedintuint32; typedefunsignedlonglonguint64; conststaticuint32sha256_k[]; staticconstunsignedintSHA224_256_BLOCK_SIZE=(512/8); public: voidinit(); voidupdate(constunsignedchar*message,unsignedintlen); voidfinal(unsignedchar*digest); staticconstunsignedintDIGEST_SIZE=(256/8); protected: voidtransform(constunsignedchar*message,unsignedintblock_nb); unsignedintm_tot_len; unsignedintm_len; unsignedcharm_block[2*SHA224_256_BLOCK_SIZE]; uint32m_h[8]; }; std::stringsha256(std::stringinput); #defineSHA2_SHFR(x,n)(x>>n) #defineSHA2_ROTR(x,n)((x>>n)|(x<<((sizeof(x)<<3)-n))) #defineSHA2_ROTL(x,n)((x< >((sizeof(x)<<3)-n))) #defineSHA2_CH(x,y,z)((x&y)^(~x&z)) #defineSHA2_MAJ(x,y,z)((x&y)^(x&z)^(y&z)) #defineSHA256_F1(x)(SHA2_ROTR(x,2)^SHA2_ROTR(x,13)^SHA2_ROTR(x,22)) #defineSHA256_F2(x)(SHA2_ROTR(x,6)^SHA2_ROTR(x,11)^SHA2_ROTR(x,25)) #defineSHA256_F3(x)(SHA2_ROTR(x,7)^SHA2_ROTR(x,18)^SHA2_SHFR(x,3)) #defineSHA256_F4(x)(SHA2_ROTR(x,17)^SHA2_ROTR(x,19)^SHA2_SHFR(x,10)) #defineSHA2_UNPACK32(x,str)\ {\ *((str)+3)=(uint8)((x));\ *((str)+2)=(uint8)((x)>>8);\ *((str)+1)=(uint8)((x)>>16);\ *((str)+0)=(uint8)((x)>>24);\ } #defineSHA2_PACK32(str,x)\ {\ *(x)=((uint32)*((str)+3))\ |((uint32)*((str)+2)<<8)\ |((uint32)*((str)+1)<<16)\ |((uint32)*((str)+0)<<24);\ } #endif sha256.cpp
#define_CRT_SECURE_NO_WARNINGS #include#include #include"sha256.h" constunsignedintSHA256::sha256_k[64]=//UL=uint32 {0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5, 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5, 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3, 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174, 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc, 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da, 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7, 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967, 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13, 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85, 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3, 0xd192e819,0xd6990624,0xf40e3585,0x106aa070, 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5, 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3, 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208, 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2}; voidSHA256::transform(constunsignedchar*message,unsignedintblock_nb) { uint32w[64]; uint32wv[8]; uint32t1,t2; constunsignedchar*sub_block; inti; intj; for(i=0;i<(int)block_nb;i++){ sub_block=message+(i<<6); for(j=0;j<16;j++){ SHA2_PACK32(&sub_block[j<<2],&w[j]); } for(j=16;j<64;j++){ w[j]=SHA256_F4(w[j-2])+w[j-7]+SHA256_F3(w[j-15])+w[j-16]; } for(j=0;j<8;j++){ wv[j]=m_h[j]; } for(j=0;j<64;j++){ t1=wv[7]+SHA256_F2(wv[4])+SHA2_CH(wv[4],wv[5],wv[6]) +sha256_k[j]+w[j]; t2=SHA256_F1(wv[0])+SHA2_MAJ(wv[0],wv[1],wv[2]); wv[7]=wv[6]; wv[6]=wv[5]; wv[5]=wv[4]; wv[4]=wv[3]+t1; wv[3]=wv[2]; wv[2]=wv[1]; wv[1]=wv[0]; wv[0]=t1+t2; } for(j=0;j<8;j++){ m_h[j]+=wv[j]; } } } voidSHA256::init() { m_h[0]=0x6a09e667; m_h[1]=0xbb67ae85; m_h[2]=0x3c6ef372; m_h[3]=0xa54ff53a; m_h[4]=0x510e527f; m_h[5]=0x9b05688c; m_h[6]=0x1f83d9ab; m_h[7]=0x5be0cd19; m_len=0; m_tot_len=0; } voidSHA256::update(constunsignedchar*message,unsignedintlen) { unsignedintblock_nb; unsignedintnew_len,rem_len,tmp_len; constunsignedchar*shifted_message; tmp_len=SHA224_256_BLOCK_SIZE-m_len; rem_len=len user.h创建一个用户类
#pragmaonce #include//标准输入输出库 #include #include #include #include #include"BlockChain.h" #include"sha256.h" usingnamespacestd; classUser { public: BlockchainuBlockchain;//当前节点创建一个自己的区块链,因为每个用户都保存一条自己的区块链 stringbatchTX();//打包交易 }; user.cpp这里是实现用户的打包交易,通过默克尔树的方式将若干条交易打包。其中300TXdata.txt后面我会贴上,一定注意文件的路径问题,不然可能运行不了。(大神当我没说)。
#include"user.h" stringUser::batchTX() { ifstreammyfile("300TXdata.txt");//读取txt文档中的300条交易数据 stringtemp[300]; inti=0; if(!myfile.is_open()) { cout<<"未成功打开文件"<TestforBitcoin.cpp这就是测试程序了,我是假设100个用户中某个用户挖矿成功了,然后来挖矿。实际上不是这样的过程,而是先挖矿才知道是哪个用户挖矿成功,不过对于一个用户来说,都无所谓了,只是为了模拟的逼真一点,加了个随机数。
#include#include #include"Blockchain.h" #include"user.h" #include #include #include #include"time.h" #include"sha256.h" usingnamespacestd; intmain() { srand((int)time(0));//随机数种子 BlockchainbChain=Blockchain();//首先创建一个区块链 Useruser[100];//创建100个用户 intminer_id; for(inti=0;i<100000;i++)//十万次出块,记录出块速度 { miner_id=rand()%100; for(intj=0;j<100;j++) { user[j].uBlockchain=bChain;//把100个节点的区块链初始化。 } user[miner_id].uBlockchain=bChain;//对挖矿区块初始化 printf("Miningblock%d...\n",i); user[miner_id].uBlockchain.AddBlock(Block(i,user[miner_id].batchTX())); bChain=user[miner_id].uBlockchain; printf("MinerIDis%d...\n",miner_id); } system("pause"); return0; } 300dataTX.txt这里包含了300条交易,用户A->用户B的转账,以及金额,这个东西我是用一个程序模拟生成的,如果需要这个这个程序我之后再发出来。
01100SUSPE10111ZKHWI79 10010VQJGH00100UXYMT34 00011YMAWT10010XTPCF43 10101TZZMF01110SHOLR51 01011WVQDR11101VDFBV59 11001RRPTU01011QZWRG68 11100TFFJG10101TMVIS76 00010OBWAS00001OIMYE85 10000ROVQD11010RWCPI93 01111MKMHH01100LSBFT1 11011PGDXT01010OOSVF10 01001KUCNF10011JBRMR18 10110NQTEQ00101MXICU26 00000IDKUU10011HTZSG35 10100LZJKG01000KHYJS43 01110GVABS11100FDPZE52 11001JJQRD00010IQGPH60 00101EFPHH10000DMFGT68 10111GAGYT00111GIVWF77 00000BOFOE11011BWMNR85 11110EKWEQ01001ESLDU93 01110ZYNVU11110HNCTG2 01001CUMLG00000BBTKS10 10111XPDCR10100EXSAD19 00101ADUSD01111ZLJQH27 11001DZTIH11001CHIHT35 01110YVJZT01111XCZXF44 11100BJAPE00111AQQNQ20 00010WFZFQ10000VMOEU28 10111ZSQWU00110YAFUG37 00101UOHMF11110TWWLS45 11011WKGCR01001WRVBD54 01101RYXTD10111RFMRH62 10000UUWJH00101UBDIT70 00010PHNSS10000OXCYE79 10100SDEIE01110RLTOQ87 01011NZCYQ11100MGKFU95 11011QNTPU01010PUJVG4 11101LJKFF10111KQALR12 00010OEJVR00101NMYCD21 10000JSAMD11011IAPSH29 01100MORCG01100LWGIT37 11010HCQSS11000GRFZE46 01001JYHJE10010JFWPQ54 10111ETYZQ00100MBNGU62 00011HHXQT10011HPMWF71 10000CDNGF01011JLDMR79 01110FZMWR11101EGUDD88 11000ANDND00010HUTTH96 00101DIUDG10000CQJJS4 10111GWTTS00100FMAAE13 00001BSKKE11011AAZQQ21 11111EOBAQ01001DVQGU29 01110ZCAQT11111YJPXF38 01000CXRHF00011BFGNR46 10110WTIXR10000WBXED55 00101ZHGNC01110ZPWUG63 11001UDXEG11000UKNKS71 01111XROUS01101XYEBE80 11100SMNLE00111RUCRQ88 00010VIEBP10001UQTHT96 10110QWDRT00110PEKYF5 00100TSUIF11110SZJOR13 11011OGLYR01000NVAED22 01101RBKOC10110QJRVG30 11001MXBFG00101LFQLS38 00010PLRVS10001OTHCE47 10100KHQLD01111JOGKQ55 01000MDHCP11100MKXAT63 11011HQYST01010PYNRF72 11101KMXJF10110KUMHR80 00011FAOZQ00101MQDXC89 10011IWFPC11011HDUOG97 00100DSEGG01101KZTES5 11010GFVWS11001FNKUE14 01000JBUMD10010IJBLP22 10101EXKDP00100DFABT30 00011HLBTT10010GSRRF39 10001CHAJE01011BOIIR47 01111FVRAQ11101ECGYC56 11010ZQIQC00011ZYXPG64 01000CMHHG10010CUWFS72 10110XAYXR00100XHNVD49 00001AWPND11010ADEMP57 11101VKOEP01000UZDCT65 01111YFFUT11101XNUSF74 01000TBVKE00011SJLJQ82 10110WPUBQ10001VWKZC91 00110RLLRC01110QSBPG99 10000UHKHF11010TORGS7 01111PUBYR01000OCQWD16 11101SQSOD00110RYHNP24 00001NEREP10001UUGDT32 10110PAIVS00101PHXTE41 00100KWZLE11111SDOKQ49 11010NJYCQ01000NRNAC58 01111IFOSC10110PNEQG66 11101LBFIF00110KJVHR74 00011OPEZR10001NWUXD83 10101JLVHD01111ISKNP91 01000MYMXP11101LOBET99 11010HULOS01001GCAUE8 11100KQCEE10110JYRLQ16 00011FEBUQ00100ELIBC25 10011IASLB11010HHHRF33 00101CVJBF01111CDYIR41 11010FJHSR11101FRXYD50 01000AFYID10011ANOOP58 10100DTPYO00100CAFFS66 00010YPOPS10000XWDVE75 10001BKFFE01010ASULQ83 01111WYWVQ11100VGLCC92 11011ZUVMB00011YCKSF0 01000UIMCF10011TXBIR8 10110XEDSR00101WLSZD17 00000SZCJC11010RHRPP25 11001VNSZO01000UVIGS33 01111QJRQS11100XRZWE42 11001SFIGE00011SMYMQ50 10101NTZWP10001VAODB59 00110QOYNB00111QWNTF67 10000LCPDF11011SSEJR75 01110OYGTR01000NGVAD84 11111RUFKC00110QBUQO92 00001MIWAO10000LPLGS0 10111PDNQS00001OLCXE9 00101KZLHD11111JHBNQ17 11000NNCXP01001MVSEB26 01110IJTNB11111HQJUF34 11100LXSEF00110KEHKR42 00011FTJUQ10000FAYBC51 10111IOILC01110IWPJO59 01101DCZBO11111DKOZS67 11010GYQRS01001FFFQE76 01100BMPID10111ABEGP84 00000EIGYP00100DPVWB93 10010ZDWOB10000YLMNF1 00101CRVFE01110BZLDR77 11011XNMVQ11100WUCUC86 01011AJDLC10011ZQSKO94 10100VXCCO00111UERAS2 00010YSTSR10101XAIRD11 10000SGKJD01010AWZHP19 01101VCJZP11100VKYXB28 11011QYAPB01000YFPOF36 01001TMZGE10011TTGEQ44 10111WHPWQ00101VPFUC53 00010RDGMC11011QLWLO61 11000URFDO01011TZVBS69 01110PNWTR11100OULRD78 11001SBNJD00010RQCIP86 10001NWMAP10000MEBYB95 00111QSDQA00101PASPE3 10000LGUHE11011KOJFQ11 01110OCTXQ01001NJIVC20 11110IYKNC00110IFZMO28 00000LLAEN10010LTQCR36 10111GHZUR00000GPPSD45 00101JVQKD11110IDGJP53 11001ERPBP01001DYWZB62 01110HNGRA11001GUVPE70 11100CAXHE00111BIMGQ78 00010FWWYQ10000EELWC87 10110AKNGB01110ZACNO95 01101DGEWN11110CNTDR3 11011YCDNR01001FJSTD12 01101BPTDD10111AXJKP20 00100VLKUO00101DTAAA29 10010YHJKA10001YPZQE37 00100TVAAE01110BCPHQ45 11001WRRRQ11100WYGXC54 01011ZEQHB10010YUFNN62 10101UAHXN00111TIWER70 00011XWGOR10101WENUD79 10010SKXEC01011RRMLP87 01100VGOUO11101UNDBA96 01001QMXMO11010QCMLA4 11001TIODA01001TPDBE64 11110OEFTD10101OLUSP73 00000RREKP00011RZTIB81 10110MNVAB11000LVKYN90 01110PJMQM01110ORBPR98 11001KXLHQ11010JEAFC6 01111NTCXC10000MARVO15 10101IGANO00111HWIMA23 00000LCREZ10001KKHCD31 10110GYIUD01001FGXSP40 01100JMHKP11110ITWJB48 11011EIYBB00000DPNZN57 00111GDPRM10110GLEQQ65 10101BROHQ00111BZDGC73 00011ENFYC11001EVUWO82 11100ZBWOO01111YILNA58 01100CXVFZ11101BEKDD66 11010XSLVD00000WABTP75 10101AGCDP10110ZOSKB83 00011VCBUA01100CKQAN92 11011YQSKM11011XFHQQ0 01101TMRAQ01111ATYHC8 11010WHIRC00101VPXXO17 00000RVZHN10010YDONZ25 10100TRYXZ00100TZNED33 00011WNPOD11100WUEUP42 11001RBGEP01010RIVLB50 01111UWEVA10101TEUBM59 10010PKVLM00011OALRQ67 00000SGMBQ10011ROCIC75 10110NCLSB01100MJAYO84 01010QQCIN11010PXROZ92 11001LLTYZ01000KTIFD0 01111OHSPD10100NPHVP9 00001JVJFO00011IDYLA17 10000MRIVA11001LYPCM26 01110HFZMM01111GMOSQ34 11000JBPCQ11010JIFJC42 01111EWOTB10000EEEZN51 10111HKFJN00110HSVPZ59 00001CGWZZ10001BNLGD67 10111FUVQC01001EJKWP76 01100AQMGO11111HXBMA84 11000DLDWA00001CTSDM93 00110YZCNM10000FHRTQ1 10101BVTDP00110ACIJB9 00011WRKTB11000DYZAN18 11111ZFIKN01111YMYQZ26 01100CAZAZ11111BIPHD34 11010WOYQC00001WEGXO43 10100ZKPHO10110ZSEFA51 00100UGGXA01100UNVWM60 11011XUFOL11000WBUMQ68 01101SPWEP01110RXLCB76 11011VLNUB00101UTCTN85 00010QZMLN10011PHBJZ93 10100TVDBY00111SCSZC1 00010OJTRC11100NYJQO10 11000RESIO01010QMIGA18 01101MAJYA10100LIZWM27 11011POAOL00101OWPNP35 00001JKZFP10011JRODB43 10110MGQVB01101MNFUN52 01010HTPMN11011HBWKZ60 11000KPGCY01010KXVAC68 01111FDXSC10100ELMRO77 00001IZWJO00010HGLHA85 10001DVMZZ11001KCCXL94 00111GIDPL01101FQTOP2 11000BECGP11011IMSEB10 01010ESTWB10001DIIUN19 10110ZOKMM00110GVZLY95 00001CKJDY10010BRYBC3 10111FXATC01000EFPSO12 01101ZTRKO11111ZBGIA20 11000CPQAZ00001CXFYL29 01110XDHQL10001XKWPP37 10100AZFHP00110ZGNFB45 00010VMWXA11000UCMVN54 11111YINNM01010XQDMY62 01101TEMEY11110SMBCC70 11011WSDUC00001VZSSO79 10110ROUCN10111QVJJZ87 00100UJTTZ01101TRIZL96 10010PXKJL11000OFZQP4 01101STBZP01110RBQGB12 11101MHAQA00100MOPWM21 00011PDQGM10011PKGNY29 10101KZHXY00111KGXDC37 00010NMGNB11101NUWTO46 11010IIXDN01011PQMKZ54 01100LWWUZ10100KLDAL63 11011GSNKL00100NZCQP71 00001JOEAO10010IVTHA79 10101EBDRA01101LJSXM88 01010HXUHM11101GFJNY96 11000KTLXY01011JAAEC4 01110FHJOB10100EOZUN13 00010IDAEN00010HKQLZ21 10001CQRVZ11010CGHBL30 00111FMQLK01100FUFRP38 11001AIHBO11011AQWIA46 01000DWGSA10001CDNYM55 10110YSXIM00101XZMOY63 00000BNOYX10010AVDFB71 10110WBNPB01000VJUVN80 01111ZXEFN11110YFTLZ88 11001ULUVZ00011TAKCL97 01111XHTMK10001WOJSO5 10100SCKCO00111RKAJA13 00000VQBTA11001UYQZM22 11110PMAJM01000PUPPY30 01101SIRZX11110SPGGB38 11011NWIQB00000NDXWN47 10111QRHGN10111PZWEZ55 00101LFYWY00111SNNVK64 10010OBXNK11001NJELO72 01100JXNDO01111QEDBA80 11100MLETA00100LSUSM89 00011HGDKL10000OOLIX97 10101KUUAX00110JKJZB5 00111NQLQB11101MYAPN14 11010IMKHN01011HTZFZ22到此这篇关于C++实现比特币的文章就介绍到这了,更多相关C++实现比特币内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!