區塊鏈開源項目Asch源碼初探

來源:互聯網
上載者:User

Asch這個名字是 App Side Chain 的縮寫。 是一種基於區塊鏈跨鏈技術的應用開發平台,目前全部核心代碼已經在GitHub上開源。

區塊鏈是比特幣的底層技術,但是名氣低於比特幣,但是個人認為潛力遠遠大於比特幣。是最值得技術人員關注的技術之一。

我一般研究一門新技術,傾向於研究更新更早期的代碼。 因為非常成熟有名的代碼往往已經過度設計,對於閱讀代碼入門不一定是好的選擇。 而一些出於項目早期的代碼,而且更容易閱讀理解其核心原理。Asch目前來說是一個非常好的區塊鏈學習入門的開源項目。

『整體架構』

目前整個阿希鏈主要由以下源碼庫組成 asch阿希鏈的核心服務端源碼,主要由 Node.js 開發。 asch-frontend阿希鏈的網頁錢包源碼。 asch-js&asch-cli阿希鏈的用戶端實現。

目前源碼閱讀主要基於asch@1.3.0 version

『目錄結構』 proto/index.proto genesisBlock-mainnet.json config-mainnet.json public/ src/core src/base

『proto/index.proto』

Asch 的區塊核心資料結構通過protobuf和進行序列化和還原序列化。 所以proto/index.proto這個資料結構就是核心區塊的資料結構。 依我的理解,index.proto 這個名字應該叫 block.proto 更合適。

『目錄 public/』

網頁錢包的代碼根目錄,由asch-frontend打包產生的網頁錢包代碼。

『源碼目錄結構 src/』

src/init.js 負責初始化,用 async 來處理各種先後順利,避免回調地獄,剛開始看的時候會比較繞, 但是看懂了就很清晰了。 
在代碼中很多模組都有共同的模組變數,最典型的是var moduels, library, modules 對應的是 src/core/ 下面的模組。 library.base 對應的是 src/base/ 下面的模組。

『受託人的輪流鍛造(Forging)機制』

Asch 不像比特幣那種挖礦機制,而是受託人的輪流鍛造機制,主要有以下流程。 onBlockchainReady(core/delegates.js) 當區塊鏈資料庫載入完成,開始鍛造初始化。 loadMyDelegates: 從設定檔中擷取secret(依次讀取若干個),用 secret 產生金鑰組(公開金鑰和私密金鑰)。 accounts.getAccount: 用公開金鑰從區塊鏈資料庫中擷取帳號,並檢查該帳號是否是受託人,是受託人才繼續進行。 loop: 開始進入輪詢,每次輪詢間隔100ms 。 slots.getSlotNumber (utils/slots.js) 先擷取 epochTime ,epochTime 記錄從 2016-5-27T20:00:00 後到某一個特定時間經過了多少秒。然後 getSlotNumber = epochTime / interval, interval = 10 。也就是每過10s出現一個新的slot 。 blocks.getLastBlock: 顧名思義,擷取當前最新的區塊 getBlockSlotData->generateDelegateList (core/delegates.js) 先擷取當前受託人列表,按票數排序,擷取票數最高的 101 個受託人的公開金鑰。並且對這些受託人列表進行『隨機』排序。這裡的隨機應該是每個節點一樣的隨機,不是完全隨機。 getBlockSlotData: 擷取當前slot的檢查受託人列表,如果在配置中該受託人的金鑰組的,則進入到『區塊的產生流程』。

『區塊的產生流程』 loop(core/delegates.js): 對於註冊了受託人的節點,會有一個定時觸發器,調用 blocks.js 裡面的 generateBlock 。 generateBlock(core/blocks.js): 首先從 transactions 裡面擷取未確認的交易列表。 
generateBlock: 從未確認的交易列表中過濾出驗證通過的交易列表。 
base.block.create: 建立包含這些交易列表的新區塊,驗證區塊是否合法。 
hasEnoughVotes: 檢查該受託人是否有足夠的票數,如果票數不夠,則不可產生區塊。(這個步驟應該提前吧。) 
processBlock: 通過 block.id 查詢本機資料庫,如果已經還未存在,則繼續進行下面行為。 applyBlock: 生效剛才驗證通過的交易列表,就是對交易涉及的帳號進行一些轉賬等操作,這部分邏輯在 src/base/transaction.js apply 函數中實現。交易有多種類型,後面再詳述。 base.block.dbSave: 儲存 block base.transaction.dbSave: 儲存體交易列表 accounts.mergeAccountAndGet: 對新區塊的建立者進行資料更新,建立者其實就是這個註冊了受託人的節點。 setLastBlock: 將這個新的區塊設定成當前最新的區塊。 bus.message(‘newBlock’) 廣播這個新的區塊。

『ToDo』 Asch鏈的交易流程 Asch鏈的HTTP介面實現原理 DApp原理和開發流程 …

原文連結: http://yanyiwu.com/work/2017/07/29/read-asch-source-code.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.