宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > MEXC > 正文

源代码 : 一个最小化的区块链系统

作者:

时间:1900/1/1 0:00:00

近期有个国内著名技术协会的约稿,正好向技术圈分享一下我对区块链系统的拙见。我发现一件有趣的事情,即使是有计算机背景,懂编程的同学,都也不怎么清楚区块链到底是怎么回事。今天这里,我打算用计算机语言和大家沟通,争取可以至少让计算机背景的同学,彻底弄明白区块链是咋回事,是怎么工作的。

不过在开始之前,需要明确的一件事情是,同之前的计算机技术不同,区块链技术核心关乎的是一个计算系统的自动化监管和治理,而不是为了让计算更高效或更大规模地发生。需要明确这个期望,才方便我们去理解,为什么区块链是这样设计的,这样工作的。

伪代码杂糅了C和Javascript的语法,一点乱,欢迎大家来改进(逃...

=================预警分割线==============好吧,这里开始,前方高能。

我们将以最简化的加密数字货币为例介绍区块链的精确工作原理,为了便于理解将省略手续费,大部分优化,互操作性等层面的东西。这里会用到强类型的伪代码,来精确定义其数据结构和执行逻辑。这里我们将从零开始实现一个类似以太坊数字货币那样的区块链系统,为了便于理解,我们将采用以太坊所采用的账户-状态模型来表示账簿,而不是比特币的那种UTXO。

我们先从一系列基础实体和原语的定义开始:基础数据类型

classString;//基础字符串数据结构classBlob;//基础二进制数据,用来表示对象序列化之后的线性二进制数据classCriticalSection;//临界区,多线程互斥对象classBigInt;//区块链中很多地方的数值采用大整数来表示,例如余额,挖矿难度等。//例如用一个32字节的无符号大整数,表示0到2^256-1的整数。

数字签名原语标准的非对称加密系统里面的函数,公私钥对可以在不联网的情况下,任意生成,并且全球唯一。通常为32到64字节的无结构二进制数据。其中公钥会公开,在区块链系统中用来表明特定身份,供他人验证其对特定账户的控制权。而私钥则用来通过数字签名来证明其对账户的控制。VerifySignature原语,用来对于给定数据和签名,验证是不是对应的签名者签署的。

typedefBYTEPublicKey;//公钥数据typedefBYTEPrivateKey;//私钥数据typedefBYTESignature;//数字签名数据voidSign(Blobdata,PrivateKeysk,Signaturesigdata);//数字签名boolVerifySignature(Blobdata,PublicKeypk,Signaturesigdata);//检查数字签名是否正确

在线游戏Neopets遭攻击,游戏网站源代码和数据库正以4枚比特币的价格出售:金色财经消息,近期推出NFT的在线游戏Neopets遭到黑客攻击。此次攻击可能影响了多达6900万个账户,目前一个名为TarTarX的黑客正以4枚比特币的价格出售Neopets

//转账函数voidTransfer(Addresssigner,Addressfrom,Addressto,BigIntamount){if(signer!=from)return;if(amount>0&&_GetBalance(from)>=amount){_Ledger-=amount;amount=_GetBalance(to);_Ledger=amount;}}//挖矿奖励函数voidCoinBase(intheight,Addressminer){BigIntreward=5000000000;//这里简化为,每次奖励50个币if(reward>0){reward=_GetBalance(miner);_Ledger=reward;}}};

万维网的数字签名源代码文档将作为NFT在苏富比拍卖行拍卖:英国计算机科学家、万维网发明者Sir Timothy John Berners-Lee将30年前编写的数字签名源代码文档将作为NFT在苏富比拍卖行拍卖。这些文档包含约9555行代码,这些代码实现了Tim爵士发明的三种语言和协议,即HTML(超文本标记语言)、HTTP(超文本传输协议)和uri(统一资源标识符),这三种语言和协议至今仍是万维网的基础。苏富比拍卖行将于6月23日举行为期一周的拍卖会,起拍价为1000美元(708英镑)。除了有机会深入研究网络早期架构的基本框架外,中标者还将收到一份代码的可视化动画,一封Tim爵士写的关于其创建的信,以及一张完整代码的数字海报。拍卖所得款项将捐给这位计算机科学家和他的妻子所支持的项目。(LBC)[2021/6/15 23:38:55]

交易(Transaction)一个交易表示对特定相关账户一次状态修改请求。交易中不携带任何逻辑代码,仅仅是指定这个交易将调用智能合约里面的哪个公开函数及其调用参数。当然在我们这个极度简化的系统中,只有一种交易,即前面的转账(Transfer)。交易的发起方必须为扣款方(from),并且整个交易携带对交易内容的数字签名,以确信该交易由扣款方发起。基于我们这里的例子,一个交易至少含有以下结构:

structTransaction{StringInvokeFunctionName;//在我们这里始终为"Transfer"BlobInvokeArguments;//序列化之后的调用参数PublicKeySigner;//发起者的公钥,注意这里不是地址SignatureSignData;//由发起者的私钥对交易的签名};

区块(Block)一个区块表示区块链接力执行中的一步,里面主要包含这一步中确认的一批交易,以及共识机制验证数据和块头元数据。一个最简化的定义可以是这样:

structBlock{intTimestamp;//出块时间HashValuePrevBlock;//上一个块的哈希值AddressMiner;//矿工地址intTxnCount;//这个块中包含的交易个数TransactionTxns;//完整的交易列表BigIntPowTarget;//工作量证明的目标(共识验证数据)intPowNonce;//工作量证明的Nonce值(共识验证数据。;

动态 | 加密货币支持者讨论中本聪是否曾向其他人发送了BTC源代码私人版本:据news

;

其中Collect原语用于挖矿时合成新的区块,从mempool中挑出一系列交易来填充Txns数组,最多挑TxnMaxCount个,并返回实际填充的个数。

区块归档数据库原语

区块链系统中的区块以及交易,在被确认之后,将从内存中移除,并写入归档数据库中。这个部分很容易用一个Key-valuestorage系统来实现,当然用SQL数据可也是可以的,就是效率低一些。

interfaceArchiveDatabase{voidArchive(Transactiontxns);voidArchive(Blockblk);voidHas(Transactiontxn);voidHas(Blockblk);}

有了这些定义之后,我们可以给出一个不考虑分叉情况下最简单的基于工作量证明的区块链系统的伪代码:

staticconstintTARGET_ADJUST_INTERVAL=256;//每隔256个块调整一次算力难度staticconstintBLOCK_CREATION_INTERVAL=600*1000;//每十分钟出一个块staticconstintTRANSCATION_PERBLOCK_MAX=1024;//每块最多包含1024个交易BroadcastNetwork*g_pNet=BroadcastNetwork::Create(...);Mempool*g_pMempool=Mempool::Create(...);ArchiveDatabase*g_pArchiDB=ArchiveDatabase::Create(...);MyCoing_MyLedger;//账簿//当前区块链的头Blockg_BlockHead=Block::GenesisBlock(6);//初始化为创始区块HashValueg_BlockHeadHash=SHA256(g_BlockHead);intg_BlockNextHeight=1;CriticalSectiong_BlockHeadCS;//下一个块的共识相关信息(工作量证明)PowTargetg_NextPowTarget=Block::InitialPowTarget();//初始挖矿难度intg_LastTargetAdjustedTime;//收到来自网络广播的交易g_pNet->OnRecvTransaction=(Transactiontxn){if(g_pMempool->Has(txn)||g_pArchiDB->Has(txn))return;//忽略已经存在的交易if(!VerifySignature(txn

;//收到来自网络广播的区块g_pNet->OnRecvBlock=(Blockblk){if(blk

//至此这个区块被确认g_pNet->Broadcast(txn);//确认之后,尽快接力这个区块的广播g_MyLedger

g_LastTargetAdjustedTime=blk

//更新区块链头在最新的这个块g_BlockHeadHash=h;g_BlockHead=blk;g_BlockNextHeight;}g_BlockHeadCS

;

比特币白金开发团队即将开源代码:12月4日6时左右,比特币白金团队在推特上公布,已完成98%的协议搭建,正在进行测试,通过后将在24小时内公布代码文件。[2017/12/4]

这里涉及到一个上面没有定义的算法,PowTargetAdjustment是用来根据近期出块速度来调整出块算力难度要求,从而使得出块的平均间隔的期望可以大体稳定在一个预先设定的值(BLOCK_CREATION_INTERVAL)。这是一个和工作量证明共识算法有关的算法,并不是所有区块链系统都有。这个算法的一个最简化定义如下:

算力难度调整

BigIntPowTargetAdjustment(BigIntcur_target,intnth_block_interval){returncur_target*nth_block_interval/(BLOCK_CREATION_INTERVAL*TARGET_ADJUST_INTERVAL);}

到这里一个不出块的区块链节点,即全节点就可以工作了。全节点是区块链网络中的大多数节点,是区块链底层P2P网络得以稳定鲁棒运行的保障,同时也实现了区块数据和交易数据的高度冗余的全网存储。虽然不出块,全节点不同于互联网架构的客户端。一个全节点不需要信赖其他节点,更不存在一个服务器。全节点能够独立自主地验证区块链完整的历史演进过程,进而重构其上的状态(例如一个账户的余额),而不是去向一个需要信赖的服务器查询。

当然,区块链网络计算接力过程是由出块节点完成了,也就是所谓的矿工节点。这些少数节点,和大量的全节点混在一起,大部分节点收到最新的区块是来自于其他全节点的接力广播,而不是直接来自于一个出块节点。当然,作为接受方,也无从判断发送方是中继的全节点,还是刚刚出块的矿工节点。这也有效地保护了真正出块节点的安全性,避免暴露矿工节点的物理IP地址。

一个出块节点,首先是一个全节点,除了上面定义的这些行为之外,还需要一个额外的过程,运行在一个或者多个线程上。我们定义最简化的出块过程如下:

voidMining(){while(g_KeepMining){//构造新的块,这个部分需要和区块链头更新代码互斥g_BlockHeadCS.Lock();{intnext_height=g_BlockNextHeight;Blocknew_block;new_block.Timestamp=os::GetCurrentTime();new_block.PrevBlock=g_BlockHeadHash;//指向最新的块new_block.Miner=g_MyAddress;new_block.TxnCount=g_pMempool->Collect(new_block.Txns);new_block.PowTarget=g_NextPowTarget;new_block.PowNonce=os::Random<Int64>();//随机初始值}g_BlockHeadCS.Unlock();//开始挖矿while(next_height==g_BlockNextHeight){if(((BigInt64&)SHA256(new_block))<new_block.PowTarget){//挖矿成功g_pNet->Broadcast(new_block);//立即广播出去g_pNet->OnRecvBlock(new_block);//更新本节点的区块链头break;//开始去挖下一个块}new_block.PowNonce;//尝试下一个Nonce}//大多数情况下,其他节点出了新的块,并更新了区块高度//则挖矿被打断,去挖更新之后的下一个块}}

发布于2020-01-07

免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。

本文来源于非小号媒体平台:

王嘉平

现已在非小号资讯平台发布10篇作品,

非小号开放平台欢迎币圈作者入驻

入驻指南:

/apply_guide/

本文网址:

/news/9558557.html

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

币安为何推出第三条链?这对BNB意味着什么?

标签:BLOLOCLOCKBLOCKBlockchain Store TokenLocoMeta最新版blockchain钱包block币今日行情

MEXC热门资讯
邹传伟:以稳定币与 CBDC 为例探讨区块链对支付系统影响

区块链技术的性能和安全性尚不足以支撑大规模的零售型CBDC应用,批发型CBDC则可用于跨境支付领域.

1900/1/1 0:00:00
《领主冲突》12.21正式上线链游玩家|丰富英雄、多元收集

导语:《领主冲突》是一款全新奇幻SLG策略手游!丰富的英雄收集,多元化养成玩法,打造你独一无二的专属队伍.

1900/1/1 0:00:00
AAX系统更新维护通知 - 12月21日

AAX将于UTC2020年12月21日00:30开始进行系统定期维护,预计维护时间为1小时30分钟.

1900/1/1 0:00:00
币安投资的 MobileCoin 能避免 Libra 与 TON 的前车之鉴吗?

MobileCoin专注于开发、几乎不参与舆论的团队和项目低调的作风使其没有成为风口浪尖上的众矢之的。 撰文:小毛哥MAO 我也曾喊过「区块链革命」,但无数人类血泪史告诉我们:无论是赚钱还是改变世界,光有理想和热情是不够的.

1900/1/1 0:00:00
冒志鸿:破除垄断,区块链让互联网回归「去中心化」真实世界

如今的链圈币圈,言必称「去中心化」,甚至把它作为判断区块链技术项目的唯一标准。其实,「去中心化」绝非金科玉律,它与「中心化」反而是孪生相对的关系.

1900/1/1 0:00:00
万字说透跨链:DApp 赋能、信任来源、治理机制与现实挑战

本文和《关注应用治理,这是DApp的阿喀琉斯之踵》是姊妹篇,都讨论Polkadot/Cosmos带来的去中心化应用治理变革,及其意义。《关注》的作者是李画,本文是我自己执笔.

1900/1/1 0:00:00