買以太坊 買以太坊
Ctrl+D 買以太坊
ads
首頁 > Polygon > Info

LOC:王嘉平:源碼解析區塊鏈的工作原理_LocoMeta

Author:

Time:1900/1/1 0:00:00

從零開始搭建一個類似以太坊數字貨幣的最小化區塊鏈系統。

原文標題:《源代碼:一個最小化的區塊鏈系統》撰文:王嘉平,中科院計算所博士,曾帶領團隊在NSDI2019發表高性能并行分片區塊鏈系統的論文

近期有個國內著名技術協會的約稿,正好向技術圈分享一下我對區塊鏈系統的拙見。我發現一件有趣的事情,即使是有計算機背景,懂編程的同學,都也不怎么清楚區塊鏈到底是怎么回事。今天這里,我打算用計算機語言和大家溝通,爭取可以至少讓計算機背景的同學,徹底弄明白區塊鏈是咋回事,是怎么工作的。

不過在開始之前,需要明確的一件事情是,同之前的計算機技術不同,區塊鏈技術核心關乎的是一個計算系統的自動化監管和治理,而不是為了讓計算更高效或更大規模地發生。需要明確這個期望,才方便我們去理解,為什么區塊鏈是這樣設計的,這樣工作的。

我們將以最簡化的加密數字貨幣為例介紹區塊鏈的精確工作原理,為了便于理解將省略手續費,大部分優化,互操作性等層面的東西。這里會用到強類型的偽代碼,來精確定義其數據結構和執行邏輯。這里我們將從零開始實現一個類似以太坊數字貨幣那樣的區塊鏈系統,為了便于理解,我們將采用以太坊所采用的賬戶-狀態模型來表示賬簿,而不是比特幣的那種UTXO。

我們先從一系列基礎實體和原語的定義開始:

基礎數據類型

classString;//基礎字符串數據結構classBlob;//基礎二進制數據,用來表示對象序列化之后的線性二進制數據classCriticalSection;//臨界區,多線程互斥對象classBigInt;//區塊鏈中很多地方的數值采用大整數來表示,例如余額,挖礦難度等。//例如用一個32字節的無符號大整數,表示0到2^256-1的整數。

數字簽名原語

標準的非對稱加密系統里面的函數,公私鑰對可以在不聯網的情況下,任意生成,并且全球唯一。通常為32到64字節的無結構二進制數據。其中公鑰會公開,在區塊鏈系統中用來表明特定身份,供他人驗證其對特定賬戶的控制權。而私鑰則用來通過數字簽名來證明其對賬戶的控制。

波場TRON聯合BitTorrent與THUBA DAO達成合作伙伴關系:據最新消息,波場TRON聯合BitTorrent與THUBA DAO達成合作伙伴關系。此番波場TRON與THUBA DAO的合作將有力推動區塊鏈的“產學融合”,加速行業的普及與發展,并為行業注入更多創新活力。

THUBA DAO是由清華大學區塊鏈協會(THUBA)成員所發起的去中心化組織。THUBA DAO致力于將Web3世界帶給每一個學生,成為連接海內外區塊鏈社區的橋梁,并培養最優秀的下一代Web青年與先鋒者。

波場TRON致力于打造下一代全球互聯網及金融基礎設施,目前,波場公鏈用戶總數超過1.56億,交易筆數超54億,總鎖倉量(TVL)超123億美元。 波場網絡于2021年12月實現完全去中心化,現為由社區治理的去中心化自治組織(DAO)。[2023/4/28 14:33:19]

VerifySignature原語,用來對于給定數據和簽名,驗證是不是對應的簽名者簽署的。

typedefBYTEPublicKey;//公鑰數據typedefBYTEPrivateKey;//私鑰數據typedefBYTESignature;//數字簽名數據voidSign(Blobdata,PrivateKeysk,Signaturesigdata);//數字簽名boolVerifySignature(Blobdata,PublicKeypk,Signaturesigdata);//檢查數字簽名是否正確

賬戶地址

在我們這里的例子中,所有哈希函數都采用SHA256,其將產生一個32字節的哈希值。地址是賬戶的標識符,是一個32字節的無結構二進制數據,由公鑰的哈希值SHA256(PublicKey)得到。那么也就是說每個公鑰,對應一個唯一的地址,對應一個唯一的賬戶。

typedefBYTEHashValue;//SHA256的哈希值typedefHashValueAddress;//賬戶地址HashValueSHA256(Blobdata);//SHA256哈希函數

Hunt Town聯創:幣安Bicasso產品竊取我們在BNB Chain黑客松上的創意:3月2日消息,針對幣安推出可將創意轉化為NFT的AI產品Bicasso,Web3構建者公會項目Hunt Town聯合創始人project7及其團隊成員ggoma發推文稱,我從來沒有想過幣安會復制我在BNB Chain黑客松上提供的服務。幣安竊取我們項目的故事,我們在曾在BNB Chain黑客松上獲得了第一名。

根據project7去年12月發布的推文,Hunt Town在2022年12月17日至19日舉行的BNB Chain Innovation Hackathon 中獲得了第一名。其還在同日的推文中表示,我在想一些新的東西可以與Dixel Club和Mint Club結合,但我認為將OpenAI應用到NFT工具中會非常有趣,所以我連夜制作的Chatcasso項目,只需輸入文字,AI就會生成一幅畫。這是一個可以繪制圖像、發布收藏甚至創建鑄幣界面的工具。此條推文附有其在該黑客松活動中的講解視頻。[2023/3/2 12:38:38]

智能合約(SmartContract)

這個有點像一個C的類,定義了一些狀態,以及修改這些狀態的函數。一個區塊鏈系統中,可以有多個智能合約同時存在,但是每個僅會有一個實例。這里我們就數字貨幣給出一個極度簡化的智能合約的例子:

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;}}};

趙長鵬:我們在印度看不到任何可行的業務:11月21日消息,Binance 創始人趙長鵬在周四的 Techcrunch Crypto 會議上表示,由于嚴格的稅收制度,印度目前不適合其加密貨幣交易平臺的商業環境,他解釋道:“Binance 進入了那些法規利于加密貨幣和商業的國家。”

趙長鵬援引印度激進的稅收環境表示:“如果對每筆交易都要征收 1% 的稅,就不會有那么多交易產生了。訂單簿類型的交易平臺不會有任何交易量。所以我們今天在印度看不到可行的業務。”

據悉,雖然對加密貨幣收入和交易征稅,但印度仍然沒有針對加密貨幣的監管框架。印度財政部長 Nirmala Sitharaman 此前表示,加密貨幣監管將是印度擔任 G20 主席國期間的重點議題之一,印度希望在與其他 G20 國家討論后建立一個由技術驅動的加密貨幣監管框架。[2022/11/21 7:52:53]

交易(Transaction)

一個交易表示對特定相關賬戶一次狀態修改請求。交易中不攜帶任何邏輯代碼,僅僅是指定這個交易將調用智能合約里面的哪個公開函數及其調用參數。當然在我們這個極度簡化的系統中,只有一種交易,即前面的轉賬(Transfer)。交易的發起方必須為扣款方(from),并且整個交易攜帶對交易內容的數字簽名,以確信該交易由扣款方發起。基于我們這里的例子,一個交易至少含有以下結構:

structTransaction{StringInvokeFunctionName;//在我們這里始終為「Transfer」BlobInvokeArguments;//序列化之后的調用參數PublicKeySigner;//發起者的公鑰,注意這里不是地址SignatureSignData;//由發起者的私鑰對交易的簽名};

區塊(Block)

一個區塊表示區塊鏈接力執行中的一步,里面主要包含這一步中確認的一批交易,以及共識機制驗證數據和塊頭元數據。一個最簡化的定義可以是這樣:

structBlock{intTimestamp;//出塊時間HashValuePrevBlock;//上一個塊的哈希值AddressMiner;//礦工地址intTxnCount;//這個塊中包含的交易個數TransactionTxns;//完整的交易列表BigIntPowTarget;//工作量證明的目標(共識驗證數據)intPowNonce;//工作量證明的Nonce值(共識驗證數據。;

美國玩具商Build-A-Bear與NFT平臺Sweet合作推出系列NFT:金色財經報道,毛絨玩具制造商Build-A-Bear已宣布進入web3,其推出了三個帶有匹配實體物品的數字收藏品項目。該系列包括一只鑲有施華洛世奇水晶的獨一無二的熊。公司與NFT平臺Sweet合作,將利用Polygon分三個階段推出。客戶將能夠用法定貨幣或加密貨幣支付。施華洛世奇熊將在10月4日至10月6日期間通過拍賣出售,起拍價為2,500美元。最終售價的10%將捐贈給其慈善機構Build-A-Bear基金會。(the block)[2022/9/28 5:59:03]

這里我們給出了最簡化的工作量證明(Proof-of-Work)的驗證數據結構,如果采用其他共識算法,這個部分會有變化。從這個結構可以看出,區塊鏈之所以稱為鏈,就是因為區塊結構中包含一個指向上一個區塊的「指針」,PrevBlock。任何一個被確認的區塊,同時也意味著承認其全部的前驅區塊,以及這些區塊所攜帶的全部交易。一個區塊被確認有三個條件:

這個區塊的共識驗證要滿足其特定共識算法的要求。在工作量證明算法中,PowTarget必須小于當前挖礦難度的要求,同時((BigInt&)SHA256(Block))<Block::PowTarget。這個塊所包含的交易必須沒有被之前的區塊包含過,并且每個交易必須能夠保證其數字簽名能夠被其Signer的公鑰正確驗證。至于交易所執行的邏輯是否正確,是否出錯則無關緊要。在所有分叉塊中,即具有相同PrevBlock的塊,只有優先的塊會被確認。這一點不同的共識算法有不同的情況。P2P通訊原語

區塊鏈的網絡層僅用到了P2P網絡技術中簡單的部分,用基于TCP長連接的Gossip協議實現一個數據塊的全網廣播(Flooding)。我們這里將其抽象下面的通訊原語:

interfaceBroadcastNetwork{template<typenameT>voidBroadcast(constT&object);//將對象序列化并廣播出去functionOnRecvBlock;//接收到一個區塊的回調函數functionOnRecvTransaction;//接收到一個交易的回調函數};

Compute North獲準運營其現金管理系統、支付保險義務并提交債權人名單:金色財經報道,美國德克薩斯州南區(休斯頓)破產法院法官 Marvin Isgur 簽署了另外三項命令,使Compute North能夠在第 11 章程序中繼續關鍵業務。在 Compute North 宣布破產后,周五舉行的聽證會推翻了某些首日動議,獲得了批準。

該公司獲得了維持其現有銀行賬戶和業務表格的批準,在 Compute North 和破產法院的指示下,銀行獲準兌現在公司進入破產之前開出的支票。

Isgur 還批準了一項修訂命令,指示 Compute North 提交其前 30 名債權人的名單。該公司還被批準編輯其員工、董事和承包商的地址信息。隨后的文件還將確定案件的關鍵日期,并讓公司開始考慮如何償還某些債務。 (the block)[2022/9/27 22:31:21]

內存池(Mempool)原語

內存池在區塊鏈系統中用來記錄尚未被確認的交易,很容易用比如哈希表來實現。

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

其中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以太坊社區基金查看更多

Tags:BLOLOCLOCKBLOCKblockchaintechnologyLocoMetawiseblockchainraiblocks

Polygon
POL:HashKey:詳解 Polkadot 技術、治理、應用與平行鏈進展_POLK

平行鏈的卡槽拍賣是Polkadot近期最值得期待的活動,但是平行鏈模式的可持續性還有待觀察。原文標題:《Polkadot最新進展:技術、治理與應用》撰文:崔晨,就職于HashKeyCapital.

1900/1/1 0:00:00
CUR:12 小時鎖倉 3.8 億美元?Pantera 合伙人解讀「社區版 Curve」Swerve_Curve

Curve因團隊持有70%投票權遭社區質疑,匿名開發者發起了Curve的分叉項目Swerve,100%由社區持有.

1900/1/1 0:00:00
SEC:冒志鴻:美國證券交易委員會最新指引是否為應用通證創新開啟綠燈?_BlockNoteX

美國證券交易委員會上周發布了《數字資產投資合同分析框架》以及針對一家商務旅行初創公司發行通證出具的首份無異議函。一言以蔽之,《框架》將判斷證券的「豪威測試」原則應用于數字資產進行定性分析.

1900/1/1 0:00:00
虎符將于12月21日18:00正式上線FXS(Frax Share)

尊敬的虎符用戶, 虎符將于2020年12月21日18:00(UTC8)重磅上線FXS/USDT和FXS/ETH交易對。充值已開啟,提現將于12月21日10:00(UTC8)開啟.

1900/1/1 0:00:00
COIN:比 Filecoin 更適合 DeFi ?簡述 Arweave 存儲原理與優勢_Quebecoin

Arweave永久存儲的特點更符合DeFi與NFT的需求。原文標題:《東評|一個可能更適合DeFi的存儲項目》撰文:北京之東最近FIiecoin要出來了,市場萬眾矚目,翹首以盼,同時在冷清的一角.

1900/1/1 0:00:00
SDT:亞投所:IACN投顧鏈發行方案_fasthorsevictory

投顧鏈IACN發行總量恒定為10億個,且保證永不增發。發行方案如下:1、市場眾籌母幣:1%,1000萬枚。2、生態挖礦:99%,99000萬枚。 母幣分配方案 1、眾籌:500萬枚.

1900/1/1 0:00:00
ads