摘要:我們將在下一章源碼倉庫全解析第四章下存儲需求方的配置操作中重點介紹存儲需求方用戶的配置操作,并反過來驗證第三章中存儲礦工后續(xù)挖取新塊的過程,幫助大家融會貫通,并在工程上驗證整個挖礦行為的生命周期。目前已成為華中區(qū)最大最具影響力的垂直媒體。
不好意思,這篇加了點八卦:
本來是不太想說這事的,從18年看到現(xiàn)在,不少見圈里的朋友和友商互相吐槽乃至攻擊...最近還鬧得比較大。這里說兩句:區(qū)塊鏈存儲在中國是一個剛誕生的新興領(lǐng)域,探索階段有錯誤是常態(tài),至少大家都愿意把臉放下地在盤活這個行業(yè)。
今天小編看到一句很深刻的話:強者互持,弱者互撕,希望大家能意識到:因為同行者,你的存在和你所做的事情才有意義...
歡迎大家來到第三章的下篇,經(jīng)過前章 【Filecoin源碼倉庫全解析】第三章(上):存儲提供方(礦工)的配置操作的內(nèi)容閱讀后,我們應(yīng)該能會對Filecoin存儲市場機制和市場中的各角色職能有了更深刻的認知,并且可以配置自身節(jié)點角色,成為存儲提供方(礦工),參與挖礦了。
上一篇,我們講解了如何在工程上申請存儲礦工角色,本篇,我們將深度剖析存儲礦工對象的源碼結(jié)構(gòu),方便大家從根本上理解礦工的事務(wù),并對一次挖礦的生命周期做一個總結(jié)。
3.6 存儲礦工對象剖析首先,我們來深度剖析一個存儲礦工對象的源碼結(jié)構(gòu),這樣便于大家從根本上理解礦工的事務(wù)。
3.6.1 StorageMinerActor我們在鏈上成功注冊一個新的礦工身份后,F(xiàn)ilecoin存儲市場Actor(上帝)將調(diào)用CreateMiner()方法為我們生成一個新的存儲礦工實例對象(StorageMinerActor),并返回其地址,這個新的實例對象結(jié)構(gòu)如下:
type StorageMinerActor interface { //礦工向存儲市場發(fā)送訂單的方法。 AddAsk(price TokenAmount, expiry uint64) AskID //提交扇區(qū)的方法。 CommitSector(commD, commR, commRStar []byte, proof SealProof) SectorID //用于向鏈上提交時空證明的方法,證明礦工已實際存儲了其聲稱的文件。 SubmitPoSt(p PoSt, faults []FailureSet, recovered SectorSet, doneSet SectorSet) // 允許礦工為網(wǎng)絡(luò)提供更多存儲空間的方法 IncreasePledge(addspace Integer) // 若缺乏復(fù)制證明證據(jù),將用此方法懲罰礦工 SlashStorageFault()3.6.2 StorageMinerState
存儲礦工會有自己的鏈上狀態(tài),僅在創(chuàng)建新區(qū)塊時更新,并全網(wǎng)同步可追溯,可以理解為這是Filecoin網(wǎng)絡(luò)為礦工們所維護的一組狀態(tài)賬本:
type StorageMinerState struct { //Owner 是擁有此礦工節(jié)點的賬戶地址 Owner Address //Worker 是此礦工節(jié)點的工作賬號地址 Worker Address //PeerID 是應(yīng)該用于連接這個礦工節(jié)點的libp2p對等身份 PeerID peer.ID //PublicKey是礦工用于對區(qū)塊進行簽名的密鑰的公共部分 PublicKey PublicKey //PledgeBytes是此礦工提供給網(wǎng)絡(luò)的空間量 PledgeBytes BytesAmount //被鎖定的抵押金額 Collateral TokenAmount //當(dāng)前抵押金額 ActiveCollateral TokenAmount //未提取的抵押金額 DePledgedCollateral TokenAmount //提取抵押幣的時間 DePledgeTime BlockHeight //Sectors 扇區(qū)集合 Sectors SectorSet //提交PoSt證明的扇區(qū) ProvingSet SectorSet //在上一次PoSt提交期間狀態(tài)變更為“完成”的一組扇區(qū)。 NextDoneSet SectorSet //礦工所擁有的算力算量 Power BytesAmount }3.6.3 Owner與Worker
存儲礦工角色有兩個不同的地址:
一個是Worker:負責(zé)完成所有事務(wù)活動,參與Ask訂單、提交證明,提交新扇區(qū)等。
另一個是Owner:地址是創(chuàng)建礦工的地址,支付抵押品,并獲得出塊獎勵。
小編認為需要這樣區(qū)別和設(shè)計的原因歸結(jié)為八個字:各司其職,安全第一。
例如:Owner適合冷存密鑰,安全級別更高,Worker常遷移和變更,安全級別更低。
如下圖所示,我們可以在~./filecoin/config.json下分別獲取到worker和Owner的地址數(shù)據(jù):
Worker => minerAddress
Owner => defaultAddress
注意:查詢Ask訂單,選擇交易時一定注意用worker地址來檢索
3.7 存儲礦工的生命周期畫了一個腦海中的草圖,方便大家理解和記憶:
如圖所示,存儲礦工的生命線主要有四條:
存儲交易
創(chuàng)建區(qū)塊
停止挖礦
失責(zé)懲罰(WIP)
下面依次來介紹其生命周期中的這幾個過程:
3.7.1 存儲交易Step1:操作節(jié)點參與鏈上身份注冊,提交抵押與存儲容量,成為一個存儲礦工
Step2:創(chuàng)建Ask訂單,與用戶節(jié)點交易。
Step3:密封數(shù)據(jù)并提交復(fù)制證明(PoRep)于鏈上,更新訂單狀態(tài),完成交易,并開啟PoSt證明周期(證明期是礦工必須向網(wǎng)絡(luò)提交空間時間證明的固定時間。)
備注:這塊內(nèi)容可以繼續(xù)深挖,后面有時間考慮單開一章節(jié):與FilecoinProof相關(guān)
Step4:存儲礦工收集證明集合,創(chuàng)建PoSt,計算ProveStorage和StoragePower(算力)。
備注:在證明期內(nèi),證明集會始終保持一致。在此期間系統(tǒng)增加的任何扇區(qū)都將順延至下一個證明期內(nèi)。
Step5:當(dāng)?shù)V工完成他們的PoSt時,調(diào)用SubmitPoSt將其提交給網(wǎng)絡(luò),并伴隨區(qū)塊更新同步狀態(tài)。
3.7.2 創(chuàng)建區(qū)塊當(dāng)經(jīng)歷完存儲交易的過程后,存儲礦工已經(jīng)具備了參與創(chuàng)建區(qū)塊節(jié)點的競選了,選票的生成邏輯如下所示:
//這塊函數(shù)體內(nèi)部邏輯官方提示將改動,就不一一解析了 func IsTicketAWinner(t Ticket, minersPower, totalPower Integer) bool { return ToFloat(sha256.Sum(ticket)) * totalPower < minersPower } pTipSet := getHeaviestTipSet() smallestTicket := selectSmallestTicket(pTipSet) var tickets []Signature baseTicket := smallestTicket for { challenge := sha256.Sum(baseTicket.Bytes()) postCount := estimator.GetPostCount(chain, pTipSet) proof := post.Prove(storage, challenge, postCount) ticket := minerPrivKey.Sign(sha256.Sum(proof.Bytes())) tickets = append(tickets, ticket) totalPower := getTotalPower(pTipSet) ourPower := getMinerPower(pTipSet, minerID) if IsTicketAWinner(ticket, ourPower, totalPower) { return tickets } else { baseTicket = ticket } }
同時,為了防止女巫攻擊,選票需要被其他節(jié)點驗證,同時,自身也將驗證其他節(jié)點的選票:
//這塊函數(shù)體內(nèi)部邏輯官方提示將改動,就不一一解析了 func VerifyTicket(b Block) error { curTicket := selectSmallestTicket(b.Parents) for _, ticket := range b.Tickets { challenge := sha256.Sum(curTicket) if !VerifyProof(b.Proof, b.Miner, challenge) { return "Proof failed to validate" } pubk := getPublicKeyForMiner(b.Miner) if !pubk.VerifySignature(ticket, sha256.Sum(b.Proof.Bytes())) { return "Ticket was not a valid signature over the proof" } curTicket = ticket } state := getStateTree(b.Parents) minersPower := state.getPowerForMiner(b.Miner) totalPower := state.getTotalPower() if !IsTicketAWinner(curTicket, minersPower, totalPower) { return "Ticket was not a winning ticket" } return nil }
創(chuàng)建區(qū)塊之前,首先要贏得選票,令所有對等節(jié)點之間達成一致。這里涉及到預(yù)期(Expected Consensus)共識,簡而言之:
是Filecoin基于拜占庭容錯基礎(chǔ)上的改進版,策略是每一輪里選舉出來一名或者多名存儲礦工來創(chuàng)建新的區(qū)塊,贏選票的可能性和礦工已分配的存儲(即與上文中ProveStorage、StoragePower強相關(guān)) 成比例。
備注:這塊內(nèi)容也可以繼續(xù)深挖,后面有時間考慮單開一章節(jié):與Expected Consensus相關(guān)
當(dāng)你僥幸獲得一張優(yōu)勝選票時,將創(chuàng)建新塊,結(jié)構(gòu)體如下所示:
//這塊函數(shù)體內(nèi)部邏輯官方提示TODO,應(yīng)該后期改動會比較大 type Block struct { Parents []*cid.Cid Tickets []Signature Proof post.Proof Ticket Signature MsgRoot *cid.Cid ReceiptsRoot *cid.Cid StateRoot *cid.Cid BlockSig Signature }
當(dāng)完成區(qū)塊創(chuàng)建之后,隨之而來的是豐厚的上帝獎勵(FIL分發(fā)),具體的分發(fā)策略也處于WIP狀態(tài),目前測試網(wǎng)階段是1000FIL/Block。
3.7.3 停止挖礦如果需要停止采礦,礦工必須履行完所有存儲訂單(即:名下所有Ask訂單狀態(tài)為Poster),并在PoSt提交期間將其從證明集中刪除。
之后,可通過客戶端指令調(diào)用DePledge()來取回他們的抵押品,并停止挖礦進程。
備注:此過程也會參與鏈上操作。
3.7.4 失責(zé)懲罰(WIP)如果礦工因未能按時提交PoSt而被slashed,他們將失去所有抵押品。
備注:官方仍在Work in Process之中,需要更多社區(qū)的建議和討論,目前設(shè)置了多種保險和重新驗證機制,可見Filecoin也非常重視礦工的利益。
參考文獻:https://github.com/filecoin-p...
https://github.com/filecoin-p...
本章是一個基礎(chǔ)鋪墊,深挖了底層的原理,這是為了讓我們對Filecoin系統(tǒng)的理解,不光只停留在工程指令集的操作上面。
我們將在下一章《【Filecoin源碼倉庫全解析】第四章(下):存儲需求方的配置操作》中重點介紹存儲需求方(用戶)的配置操作,并反過來驗證第三章中存儲礦工后續(xù)挖取新塊的過程,幫助大家融會貫通,并在工程上驗證整個挖礦行為的生命周期。
本章贊助品牌:搜搜IPFS:是專注于IPFS生態(tài)的垂直媒體。內(nèi)容涵蓋IPFS的行業(yè)資訊、新聞動態(tài)、項目評測、人物專訪等。我們努力為IPFS用戶們創(chuàng)造更豐富,更有趣,更靠譜的媒體服務(wù),致力于成為IPFS愛好者服務(wù)的媒體。目前已成為華中區(qū)最大、最具影響力的IPFS垂直媒體。
感謝 搜IPFS 對嘉樂SOHO的原創(chuàng)內(nèi)容提供支持。
聯(lián)系作者:本人從業(yè)經(jīng)驗有限,不免有不足之處,歡迎指正和更多討論,可私信微信公眾號:jialesoho,或者加我微信:daijiale6239,如果覺得對您有幫助,可以幫點擊好看推廣和打賞支持噢,感激不盡!
(識別圖中二維碼,關(guān)注嘉樂SOHO微信公眾號)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/24588.html
摘要:我們會在后面的源碼倉庫全解析第三章下存儲提供方礦工的配置操作章節(jié)重點介紹這個過程。參考文獻本章贊助品牌深圳牛鏈科技有限公司,是一家專注存儲類礦機研發(fā)生產(chǎn)銷售托管為一體的高科技企業(yè)。感謝深圳牛鏈科技有限公司對嘉樂的原創(chuàng)內(nèi)容提供支持。 歡迎大家來到第三章,經(jīng)過 前章《【Filecoin源碼倉庫全解析】第二章:如何創(chuàng)建賬戶錢包并獲取FIL Mock代幣的內(nèi)容閱讀后,我們應(yīng)該能順利在Filec...
摘要:之后,存儲端礦工節(jié)點會在一定時間間隔可配置,默認為秒自動啟動密封過程,即獲取之前微支付通道中暫存區(qū)域的所有數(shù)據(jù),并將其密封到礦工的承諾存儲區(qū)域中。 歡迎大家來到第四章,經(jīng)過前章 【Filecoin源碼倉庫全解析】第三章(下):存儲提供方(礦工)的配置操作的內(nèi)容閱讀后,我們應(yīng)該會對Filecoin市場機制中的礦工對象有了更詳細的認知,對礦工事務(wù)的生命周期有了具象化地理解。 本章,我們將重...
摘要:我們將在本章介紹如何在一臺機器上構(gòu)建多節(jié)點的方案和未來礦池產(chǎn)品設(shè)計的一些思路。本文將介紹一種直接在單機上部署和管理多節(jié)點的方案。最初起源于比特幣。 歡迎大家來到第六章,經(jīng)過前章《【Filecoin源碼倉庫全解析】第五章:檢索市場及檢索礦工》的介紹,無論從定位職能,還是從設(shè)計原理,還是從工程操作角度,我們應(yīng)該對目前的Filecoin檢索市場有了更加深入的了解。 我們將在本章介紹如何在一臺...
摘要:如上圖,驗證過程可以表述為驗證者會按照一定的規(guī)則向礦工提起挑戰(zhàn),挑戰(zhàn)是隨機生成的,礦工不能提前獲知。三時空證明如圖所示,可以理解為礦工一定時間內(nèi)持續(xù)地生成復(fù)制證明和接受挑戰(zhàn)和驗證的過程,并通過這個過程,更新全網(wǎng)存儲算力。 歡迎大家來到第七章,經(jīng)過前章《【Filecoin源碼倉庫全解析】第六章:如何單機部署多節(jié)點集群及礦池設(shè)計思路》的介紹,我們分享了如何在單機部署多節(jié)點集群的知識以及礦池...
摘要:情人節(jié),項目開放了核心源碼倉庫,并更新了下的諸多核心成果,這意味著,已然度過了最困難的難點攻關(guān)期,進入到了全民公測階段。年月日,開源了核心源碼庫,開啟全民公測階段。 2019.2.14 情人節(jié),F(xiàn)ilecoin項目開放了核心源碼倉庫go-filecoin,并更新了 filecoin-project organization下的諸多核心成果,這意味著,F(xiàn)ilecoin已然度過了最困難的難...
閱讀 3063·2021-10-12 10:20
閱讀 2808·2021-09-27 13:56
閱讀 789·2021-09-27 13:36
閱讀 1423·2021-09-26 09:46
閱讀 2416·2019-08-30 14:02
閱讀 2684·2019-08-28 18:14
閱讀 1257·2019-08-26 10:32
閱讀 1699·2019-08-23 18:25