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