区块见闻 区块见闻
Ctrl+D收藏区块见闻

EFI:王嘉平:源码解析区块链的工作原理_DEFLCT

作者:

时间:

从零开始搭建一个类似以太坊数字货币的最小化区块链系统。

原文标题:《源代码:一个最小化的区块链系统》撰文:王嘉平,中科院计算所博士,曾带领团队在NSDI2019发表高性能并行分片区块链系统的论文

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

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

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

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

基础数据类型

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

数字签名原语

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

DeFi初创公司MoHash筹集600万美元的种子资金:金色财经报道,MoHash宣布已筹集到600万美元的种子资金。本轮融资由红杉印度和东南亚以及Quona Capital领投。Ledger Prime、Jump Crypto、hash Ventures、Coinbase Ventures和CoinSwitch以及Balaji Srinivasan和Polygon创始人Sandeep Nailwal和Jaynti Kanani参与本轮融资。

这家初创公司正在建立一种去中心化的金融协议,将利用全球资本和流动性,在快速增长的经济体中寻找替代资产。(techcrunch)[2022/6/30 1:42:18]

VerifySignature原语,用来对于给定数据和签名,验证是不是对应的签名者签署的。

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

账户地址

在我们这里的例子中,所有哈希函数都采用SHA256,其将产生一个32字节的哈希值。地址是账户的标识符,是一个32字节的无结构二进制数据,由公钥的哈希值SHA256(PublicKey)得到。那么也就是说每个公钥,对应一个唯一的地址,对应一个唯一的账户。

typedefBYTEHashValue;//SHA256的哈希值typedefHashValueAddress;//账户地址HashValueSHA256(Blobdata);//SHA256哈希函数

智能合约(SmartContract)

这个有点像一个C的类,定义了一些状态,以及修改这些状态的函数。一个区块链系统中,可以有多个智能合约同时存在,但是每个仅会有一个实例。这里我们就数字货币给出一个极度简化的智能合约的例子:

Ruby.Exchange 完成 280 万美元融资 NGC、HashKey 等参投:10月28日消息,SKALE 上基于 NFT 的 AMM 交易所 Ruby.Exchange 完成 280 万美元融资,NGC、Flow Ventures、Wintermute、SKALE 生态基金、Morningstar Ventures、Yield Ventures、HashKey、CitizenX、ZBS Capital 和一些天使投资人参投,所筹资金将用于使 Ruby 能够开发、营销、维护并最终实现完全去中心化的第一个基于 NFT 的 AMM 交易所。同时未来几周的发布会上它也将发布更多有关 Ruby.Exchange、其代币经济学、公开销售、使用 SKALE 的优势以及流动性提供商奖励等详细信息。[2021/10/28 21:04:49]

classMyCoin{//internalstatehash_map<Address,BigInt>_Ledger;//internalfunctionBigInt_GetBalance(Addressaddr){if(_Ledger

//转账函数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;}}};

交易(Transaction)

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

MixTrust(MXT)获得Hash Capital 战略投资并达成合作:据官方消息,投资机构Hash Capital 和MixTrust(MXT)项目已达成战略合作,并出资1000万美金投资MixTrust团队开发的流动性挖矿产品MixCake。

Hash Capital 是一家专注于区块链行业投资和数字资产管理的专业投资机构。投资赛道包含智能合约、证券交易结算、身份证明、分布式记账、数据 API 以及区块链基础设施等领域。

MixTrust是基于以太坊的去中心化合成资产发行协议,为合成资产提供了去中心化的跨链交易平台:支持无缝资产合成,去中心化的跨链交易和跨链抵押贷款,对标SNX和REN。[2021/3/6 18:21:16]

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

区块(Block)

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

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

这里我们给出了最简化的工作量证明(Proof-of-Work)的验证数据结构,如果采用其他共识算法,这个部分会有变化。从这个结构可以看出,区块链之所以称为链,就是因为区块结构中包含一个指向上一个区块的「指针」,PrevBlock。任何一个被确认的区块,同时也意味着承认其全部的前驱区块,以及这些区块所携带的全部交易。一个区块被确认有三个条件:

动态 | LongHash:加密项目失败的最常见原因是投资者停止交易:LongHash发布了题为“什么杀死了加密项目\"的文章。根据Coinospy的数据,加密项目失败的最常见原因是遭遗弃,这意味着投资者停止交易代币,使其交易量降至零(或接近零),被遗弃导致项目失败的占比达63.1%;致使加密项目失败的第二大原因是涉嫌,这类加密项目数量占比达29.9%;其他导致加密项目失败的原因包括ICO失败(3.6%)和明显的“玩笑”项目(3.2%),比如“AnalCoin”等。[2019/10/13]

这个区块的共识验证要满足其特定共识算法的要求。在工作量证明算法中,PowTarget必须小于当前挖矿难度的要求,同时((BigInt&)SHA256(Block))<Block::PowTarget。这个块所包含的交易必须没有被之前的区块包含过,并且每个交易必须能够保证其数字签名能够被其Signer的公钥正确验证。至于交易所执行的逻辑是否正确,是否出错则无关紧要。在所有分叉块中,即具有相同PrevBlock的块,只有优先的块会被确认。这一点不同的共识算法有不同的情况。P2P通讯原语

区块链的网络层仅用到了P2P网络技术中简单的部分,用基于TCP长连接的Gossip协议实现一个数据块的全网广播(Flooding)。我们这里将其抽象下面的通讯原语:

interfaceBroadcastNetwork{template<typenameT>voidBroadcast(constT&object);//将对象序列化并广播出去functionOnRecvBlock;//接收到一个区块的回调函数functionOnRecvTransaction;//接收到一个交易的回调函数};

内存池(Mempool)原语

内存池在区块链系统中用来记录尚未被确认的交易,很容易用比如哈希表来实现。

interfaceMempool{boolHas(Transactiontxn);voidInsert(Transactionnew_txn);voidRemove(Transactiontxns);intCollect(Transactiontxns);};

声音 | 神鱼:NiceHash几天前出租了大量的ETC算力:今日,神鱼发微博表示,NiceHash前几天有大量租算力挖ETC的,然后就被51%了。NiceHash是一个斯洛文尼亚加密货币云采矿市场。[2019/1/8]

其中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

;

这里涉及到一个上面没有定义的算法,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}//大多数情况下,其他节点出了新的块,并更新了区块高度//则挖矿被打断,去挖更新之后的下一个块}}

来源链接:zhuanlan.zhihu.com

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

以太坊

以太坊

开放的分布式区块链应用平台,通过其专属加密货币Ether以太币提供去中心化的虚拟机,处理点对点合约。允许任何人建立和使用通过区块链技术运行的去中心化应用,没有任何欺诈、审查、第三方监管。以太坊的概念首次在2013至2014年由维塔利克·布特林VitalikButerin受比特币启发后提出,旨在共同构建一个更全球化、更自由、更可靠的互联网。以太坊EthereumETH以太坊区块链以太坊发展企业以太坊联盟以太坊入门新手ERC20ERC-20ERC20ERC721ERC-721以太坊2.0以太坊2.0以太坊社区基金查看更多

标签:DEFDEFIEFI区块链DEFLCT去中心化金融defi是干什么的Endless Battlefield区块链工程专业学什么女生

币赢交易所热门资讯
以太坊:巴德言币:ETH拉伸之后,上看700?_以太坊交易所app官网下

各位老铁大家好,我是你们的朋友巴德。跟着我的客户都是做了很久的,不是我带他们收获了多少,而是我用心在指导,毫无保留的教技术,经常熬夜盯盘,深夜告知客户出场或进单;我的长远目标是有收获的时候大家都.

HTT:肖磊:“战狼”比“狐狸”磊落,西方对中国的了解不比对火星多_AAVE

八作者:肖磊看市 公众号:kanshi1314最近,在科技领域有几件事值得关注,一个是中国的嫦娥五号探测器成功降落在月球,并顺利完成月球表面的自动采样,同时上升器带着月球土壤顺利从月球表面升空.

以太坊:HashKey:简析 DeFi 对比特币与以太坊等公链影响_ChargeDeFi Charge

从供给和需求的角度来看,DeFi项目会促使ETH价格上涨。原文标题:《DeFi对主流公链项目的影响》撰文:郝凯,就职于HashKeyCapitalResearch审核:邹传伟,万向区块链与Pla.

比特币:谷燕西:数字资产交易所获得牌照只是第一步_STO

撰文:谷燕西,美国力研咨询公司创始人、区块链和加密数字资产行业的研究和从业者最近,在新加坡和香港都有机构率先获得所在地颁发的数字资产交易牌照.

TOKEN:五分钟简评热门项目 Curve:稳定币交易池版 Uniswap_稳定币

Curve试图利用稳定币的特性实现比Uniswap更好的费率和交易体验,然而其在优化费率的同时,引入了新的流动性风险.

区块链:观点:PoW 与 PoS 本质的区别在于参与共识是否依赖历史_区块链最新应用

这两天在橙皮书的微信群里面产生了PoW和PoS的大讨论,甚是精彩,从讨论中我看到了许多有价值的观点.