加密貨幣交易所 加密貨幣交易所
Ctrl+D 加密貨幣交易所
ads
首頁 > FTT > Info

filecoin探索之路:復制證明(一)_COM:mathwallet

Author:

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

一、復制證明簡介

引用官方的解釋就是:“InordertoregisterasectorwiththeFilecoinnetwork,thesectorhastobesealed.Sealingisacomputation-heavyprocessthatproducesauniquerepresentationofthedataintheformofaproof,calledProof-of-ReplicationorPoRep.”簡單來說,復制證明就是在對扇區進行封裝的過程中生成的扇區唯一標識。

復制證明要用到三種特殊參數:數據本身、執行密封的礦工參與者、特定礦工密封特定數據的時間。一旦其中的一個參數發生變化,那么得到的復制證明結果將會完全不同。換句話說,如果同一個礦工稍后試圖密封相同的數據,那么這將導致不同的PoRep證明。

復制證明是一個很大的計算過程,接下來我將會分為兩部分:P1、P2,從代碼的形式給讀者介紹復制證明的工作原理。

二、P1代碼解析

在本次文章,我將主要介紹32GB封裝的P1的過程。在此階段,會發生PoRep的SDR編碼和復制。

因為是第一次,我這里提一句,扇區的不同狀態會觸發miner不同的執行方法,1.16版本可以看externstorage-sealingfsm.go文件約460行代碼內容,代碼中記錄了miner不同的狀態以及觸發方法。這里我只放P1狀態的代碼。

????????...

????????...

????????case?Packing:

????????????????return?m.handlePacking,?processed,?nil

????????case?GetTicket:

????????????????return?m.handleGetTicket,?processed,?nil

????????case?PreCommit1:

????????????????return?m.handlePreCommit1,?processed,?nil

????????case?PreCommit2:

????????????????return?m.handlePreCommit2,?processed,?nil

????????...

????????...

可以看到,PreCommit1調用的是handlePreCommit1方法,從下邊可以看出,利用SealPreCommit1方法得到P1結果。

func?(m?*Sealing)?handlePreCommit1(ctx?statemachine.Context,?sector?SectorInfo)?error?{

????????...

????????...

????????pc1o,?err?:=?m.sealer.SealPreCommit1(sector.sealingCtx(ctx.Context()),?m.minerSector(sector.SectorType,?sector.SectorNumber),?sector.TicketValue,?sector.pieceInfos())

????????if?err?!=?nil?{

????????????????return?ctx.Send(SectorSealPreCommit1Failed{xerrors.Errorf("seal?pre?commit(1)?failed:?%w",?err。)

????????}

????????return?ctx.Send(SectorPreCommit1{

????????????????PreCommit1Out:?pc1o,

????????})

}

讓我們深入看一下SealPreCommit1方法,這里我們最終調用的是:func(sb*Sealer)SealPreCommit1(...)方法。方法中有我們常常遇到的方法:AcquireSector(...)、Unpadded()。

AcquireSector方法是根據傳入的類型與sectorID一起,組合成對應的path。

Uppadded方法是返回一個Piece的未填充大小,以字節為單位,計算公式是:s-(s/128)。有未填充大小,自然就有填充大小,填充大小的計算方法為Padded(),計算公式是:s+(s/127)

func?(sb?*Sealer)?SealPreCommit1(ctx?context.Context,?sector?storage.SectorRef,?ticket?abi.SealRandomness,?pieces?abi.PieceInfo)?(out?storage.PreCommit1Out,?err?error)?{

????????paths,?done,?err?:=?sb.sectors.AcquireSector(ctx,?sector,?storiface.FTUnsealed,?storiface.FTSealed|storiface.FTCache,?storiface.PathSealing)

????????if?err?!=?nil?{

????????????????return?nil,?xerrors.Errorf("acquiring?sector?paths:?%w",?err)

????????}

????????...

????????...

????????...

????????var?sum?abi.UnpaddedPieceSize

????????for?_,?piece?:=?range?pieces?{

????????????????sum?+=?piece.Size.Unpadded()

????????}

????????//?根據扇區證明類型獲取扇區大小

????????ssize,?err?:=?sector.ProofType.SectorSize()

Memeland:“復制”功能并非Bug;Traitables協議和TraitStore即將推出:7月2日消息,Memeland發推稱,今日已經舉行Townhall會議“The Captainz開圖& AMA”,主要內容如下:

1. 正在打造下一代“智能PFP”;

2. 今天推出“Starter Model(新手模式)”。

3. Traitables Protocol和TraitStore即將推出。

4. 品牌、創作者和其他NFT系列的可交換和可交易特征即將推出。

5.“復制(Duplicate)”是特意提供的發布策略和功能,而不是一個Bug。

6. Captainz = 特許權所有者。

據今日報道,Blur數據顯示,Memeland船長系列The Captainz NFT已于昨日開圖,地板價現為4.85 ETH,24小時降幅為23.62%,或因開圖后未達到用戶預期。

此前根據官方介紹,The Captainz持有者可以選擇性別、膚色類型、特征,報告特征錯誤并獲得賞金,創造并銷售特征作為官方特征的一部分,以所有者的身份幫助擴展Memeland生態系統。[2023/7/2 22:13:33]

????????if?err?!=?nil?{

????????????????return?nil,?err

????????}

????????//?這里比較一次總piece大小和要求的扇區大小是否一致

????????ussize?:=?abi.PaddedPieceSize(ssize).Unpadded()

????????if?sum?!=?ussize?{

????????????????return?nil,?xerrors.Errorf("aggregated?piece?sizes?don't?match?sector?size:?%d?!=?%d?(%d)",?sum,?ussize,?int64(ussize-sum))

????????}

????????//?TODO:?context?cancellation?respect

????????p1o,?err?:=?ffi.SealPreCommitPhase1(

????????????????sector.ProofType,

????????????????paths.Cache,

????????????????paths.Unsealed,

????????????????paths.Sealed,

????????????????sector.ID.Number,

????????????????sector.ID.Miner,

????????????????ticket,

????????????????pieces,

????????)

????????...

????????...

}

接下來,一切準備就緒,我們將要開始我們的P1遠游了,因為接下來的代碼都不屬于lotus,上面方法中我們可以看到ffi.SealPreCommitPhase1,ffi其實使用的是https://github.com/filecoin-project/filecoin-ffi庫,我們通過這個庫的如下方法,轉入rust語言去實現P1。

func?SealPreCommitPhase1(registeredProof?RegisteredSealProof,?cacheDirPath?SliceRefUint8,?stagedSectorPath?SliceRefUint8,?sealedSectorPath?SliceRefUint8,?sectorId?uint64,?proverId?*ByteArray32,?ticket?*ByteArray32,?pieces?SliceRefPublicPieceInfo)?(byte,?error)?{

????????resp?:=?C.seal_pre_commit_phase1(registeredProof,?cacheDirPath,?stagedSectorPath,?sealedSectorPath,?C.uint64_t(sectorId),?proverId,?ticket,?pieces)

????????defer?resp.destroy()

????????if?err?:=?CheckErr(resp);?err?!=?nil?{

????????????????return?nil,?err

????????}

????????return?resp.value.copy(),?nil

}

C庫其實就是ffi庫自身的rust庫,調用的方法如下所示:

fn?seal_pre_commit_phase1(

????registered_proof:?RegisteredSealProof,

????cache_dir_path:?c_slice::Ref<u8>,

????staged_sector_path:?c_slice::Ref<u8>,

????sealed_sector_path:?c_slice::Ref<u8>,

????sector_id:?u64,

????prover_id:?&,

????ticket:?&,

????pieces:?c_slice::Ref<PublicPieceInfo>,

)?->?repr_c::Box<SealPreCommitPhase1Response>?{

????catch_panic_response("seal_pre_commit_phase1",?||?{

????????let?public_pieces:?Vec<PieceInfo>?=?pieces.iter().map(Into::into).collect();

Helium新幣IOT過去24小時最大漲幅超370%:金色財經報道,去中心化無線通信網絡 Helium 遷移至 Solana 網絡后發行的新 Token IOT 過去 24 小時內最大漲幅超 370%。據悉,當前的原生 Token HNT 將不再由 LoRaWAN 熱點開采,取而代之的是開采 IOT,IOT 作為 Helium IoT 網絡的激勵和治理 Token 將始終由 Helium Network 的 HNT Token 支持,并且始終可以轉換為 HNT,贖回率由其國庫互換合約通過算法設置。據 Solana 區塊瀏覽器顯示,IOT 的最大供應量為 2000 億,流通中的 Token 數量約為 60 億。

據 CoinGecko 數據顯示,IOT 目前的交易價格為 0.00248 美元,完全稀釋后的市值為 4.95 億美元。根據其流通供應量,目前的市值約為 1500 萬美元。[2023/4/27 14:29:12]

????????let?result?=?seal::seal_pre_commit_phase1(

????????????registered_proof.into(),

????????????as_path_buf(&cache_dir_path)?,

????????????as_path_buf(&staged_sector_path)?,

????????????as_path_buf(&sealed_sector_path)?,

????????????*prover_id,

????????????SectorId::from(sector_id),

????????????*ticket,

????????????&public_pieces,

????????)?;

????????let?result?=?serde_json::to_vec(&result)?;

????????Ok(result.into_boxed_slice().into())

????})

}

上面的seal庫是:https://github.com/filecoin-project/rust-filecoin-proofs-api。在這個方法對應的文件中,我們可以看到很多方法都對應了一個*__inner方法。實際上seal_pre_commit_phase1只是做了個中轉。我們可以直接看seal_pre_commit_phase1_inner方法

pub?fn?seal_pre_commit_phase1<R,?S,?T>(

????registered_proof:?RegisteredSealProof,

????cache_path:?R,

????in_path:?S,

????out_path:?T,

????prover_id:?ProverId,

????sector_id:?SectorId,

????ticket:?Ticket,

????piece_infos:?&,

)?->?Result<SealPreCommitPhase1Output>

where

????R:?AsRef<Path>,

????S:?AsRef<Path>,

????T:?AsRef<Path>,

{

????ensure!(

????????registered_proof.major_version()?==?1,

????????"unusupported?version"

????);

????with_shape!(

????????u64::from(registered_proof.sector_size()),

????????seal_pre_commit_phase1_inner,

????????registered_proof,

????????cache_path.as_ref(),

????????in_path.as_ref(),

????????out_path.as_ref(),

????????prover_id,

????????sector_id,

????????ticket,

????????piece_infos

????)

}

在inner方法中,filecoin_proofs_v1::seal_pre_commit_phase1,會調用證明子系統的實現部分。filecoin_proofs_v1使用的庫是:https://github.com/filecoin-project/rust-fil-proofs。

fn?seal_pre_commit_phase1_inner<Tree:?'static?+?MerkleTreeTrait>(

????registered_proof:?RegisteredSealProof,

????cache_path:?&Path,

????in_path:?&Path,

????out_path:?&Path,

????prover_id:?ProverId,

????sector_id:?SectorId,

????ticket:?Ticket,

????piece_infos:?&,

)?->?Result<SealPreCommitPhase1Output>?{

????let?config?=?registered_proof.as_v1_config();

????let?output?=?filecoin_proofs_v1::seal_pre_commit_phase1::<_,?_,?_,?Tree>(

Gyroscope Protocol項目Discord服務器已被入侵:金色財經報道,據CertiK監測,Gyroscope Protocol項目Discord服務器已被入侵,黑客發布了虛假鑄幣鏈接。在團隊確認他們已經恢復服務器的控制權之前,請勿點擊任何鏈接。[2023/4/4 13:43:47]

????????config,

????????cache_path,

????????in_path,

????????out_path,

????????prover_id,

????????sector_id,

????????ticket,

????????piece_infos,

????)?;

????let?filecoin_proofs_v1::types::SealPreCommitPhase1Output::<Tree>?{

????????labels,

????????config,

????????comm_d,

????}?=?output;

????Ok(SealPreCommitPhase1Output?{

????????registered_proof,

????????labels:?Labels::from_raw::<Tree>(registered_proof,?&labels)?,

????????config,

????????comm_d,

????})

}

filecoin_proofs_v1::seal_pre_commit_phase1方法就是真正實現P1的地方,我將會在這里詳細講解P1,使P1將在這里一一浮出水面。

pub?fn?seal_pre_commit_phase1<R,?S,?T,?Tree:?'static?+?MerkleTreeTrait>(

????porep_config:?PoRepConfig,

????cache_path:?R,

????in_path:?S,

????out_path:?T,

????prover_id:?ProverId,

????sector_id:?SectorId,

????ticket:?Ticket,

????piece_infos:?&,

)?->?Result<SealPreCommitPhase1Output<Tree>>

where

????R:?AsRef<Path>,

????S:?AsRef<Path>,

????T:?AsRef<Path>,

{

????info!("seal_pre_commit_phase1:start:?{:?}",?sector_id);

????//?Sanity?check?all?input?path?types.

????ensure!(

????????metadata(in_path.as_ref())?.is_file(),

????????"in_path?must?be?a?file"

????);

????ensure!(

????????metadata(out_path.as_ref())?.is_file(),

????????"out_path?must?be?a?file"

????);

????ensure!(

????????metadata(cache_path.as_ref())?.is_dir(),

????????"cache_path?must?be?a?directory"

????);

????let?sector_bytes?=?usize::from(PaddedBytesAmount::from(porep_config));

????fs::metadata(&in_path)

????????.with_context(||?format!("could?not?read?in_path={:?})",?in_path.as_ref().display()))?;

????fs::metadata(&out_path)

????????.with_context(||?format!("could?not?read?out_path={:?}",?out_path.as_ref().display()))?;

????//?Copy?unsealed?data?to?output?location,?where?it?will?be?sealed?in?place.

????fs::copy(&in_path,?&out_path).with_context(||?{

????????format!(

????????????"could?not?copy?in_path={:?}?to?out_path={:?}",

????????????in_path.as_ref().display(),

????????????out_path.as_ref().display()

????????)

????})?;

????let?f_data?=?OpenOptions::new()

????????.read(true)

????????.write(true)

????????.open(&out_path)

分析師下調Argo Blockchain目標價和收入預期:8月26日消息,金融服務公司HC Wainwright和Jefferies分析師在Argo Blockchain公布業績后,下調對其價格預期。HC Wainwright的Kevin Dede繼續將Argo評為買入,但將目標價從14美元下調至8美元;Jefferies的Jonathan Peterson和Amanda Santillo將目標價從20美元下調至13美元,同時維持買入評級。HC Wainwright將Argo的收入預期從1.355億美元下調了近50%至8430萬美元;Jefferies的Peterson/Santillo將收入預期從1.456億美元下調了近50%至7680萬美元。(CoinDesk)[2022/8/27 12:51:35]

????????.with_context(||?format!("could?not?open?out_path={:?}",?out_path.as_ref().display()))?;

????//?Zero-pad?the?data?to?the?requested?size?by?extending?the?underlying?file?if?needed.

????f_data.set_len(sector_bytes?as?u64)?;

????let?data?=?unsafe?{

????????//?創建由文件支持的可寫內存映射

????????MmapOptions::new()

????????????.map_mut(&f_data)

????????????.with_context(||?format!("could?not?mmap?out_path={:?}",?out_path.as_ref().display()))?

????};

????let?compound_setup_params?=?compound_proof::SetupParams?{

????????vanilla_params:?setup_params(

????????????PaddedBytesAmount::from(porep_config),

????????????usize::from(PoRepProofPartitions::from(porep_config)),

????????????porep_config.porep_id,

????????????porep_config.api_version,

????????)?,

????????partitions:?Some(usize::from(PoRepProofPartitions::from(porep_config))),

????????priority:?false,

????};

????//?利用param得到public_params,其vanilla_params.graph字段,就是構建出來的圖的數據結構。

????let?compound_public_params?=?<StackedCompound<Tree,?DefaultPieceHasher>?as?CompoundProof<

????????StackedDrg<'_,?Tree,?DefaultPieceHasher>,

????????_,

????>>::setup(&compound_setup_params)?;

????trace!("building?merkle?tree?for?the?original?data");

????let?(config,?comm_d)?=?measure_op(Operation::CommD,?||?->?Result<_>?{

????????let?base_tree_size?=?get_base_tree_size::<DefaultBinaryTree>(porep_config.sector_size)?;

????????let?base_tree_leafs?=?get_base_tree_leafs::<DefaultBinaryTree>(base_tree_size)?;

????????ensure!(

????????????compound_public_params.vanilla_params.graph.size()?==?base_tree_leafs,

????????????"graph?size?and?leaf?size?don't?match"

????????);

????????trace!(

????????????"seal?phase?1:?sector_size?{},?base?tree?size?{},?base?tree?leafs?{}",

????????????u64::from(porep_config.sector_size),

????????????base_tree_size,

????????????base_tree_leafs,

????????);

????????let?mut?config?=?StoreConfig::new(

????????????cache_path.as_ref(),

????????????CacheKey::CommDTree.to_string(),

????????????default_rows_to_discard(base_tree_leafs,?BINARY_ARITY),

????????);

????????let?data_tree?=?create_base_merkle_tree::<BinaryMerkleTree<DefaultPieceHasher>>(

????????????Some(config.clone()),

V神為以太坊合并辯護:PoS機制資產不是證券:7月13日消息,以太坊聯合創始人Vitalik Buterin周二在推特上為以太坊網絡向PoS過渡進行了辯護,回應有關使用此類共識機制的資產是一種證券的論點。

Swan Bitcoin執行主編Nick Payton周二表示,“你可以投票改變其屬性,這證明了它是一種證券。”他最后表示“Love, Bitcoin”,作為對PoW共識機制的認可。

Vitalik Buterin駁斥了這一說法,稱其為“徹頭徹尾、赤裸裸的謊言”,并補充說PoS不包括對協議參數的投票,PoW也不包括。(Forkast)[2022/7/13 2:09:46]

????????????base_tree_leafs,

????????????&data,

????????)?;

????????drop(data);

????????config.size?=?Some(data_tree.len());

????????let?comm_d_root:?Fr?=?data_tree.root().into();

????????let?comm_d?=?commitment_from_fr(comm_d_root);

????????drop(data_tree);

????????Ok((config,?comm_d))

????})?;

????trace!("verifying?pieces");

????ensure!(

????????verify_pieces(&comm_d,?piece_infos,?porep_config.into())?,

????????"pieces?and?comm_d?do?not?match"

????);

????let?replica_id?=?generate_replica_id::<Tree::Hasher,?_>(

????????&prover_id,

????????sector_id.into(),

????????&ticket,

????????comm_d,

????????&porep_config.porep_id,

????);

????let?labels?=?StackedDrg::<Tree,?DefaultPieceHasher>::replicate_phase1(

????????&compound_public_params.vanilla_params,

????????&replica_id,

????????config.clone(),

????)?;

????let?out?=?SealPreCommitPhase1Output?{

????????labels,

????????config,

????????comm_d,

????};

????info!("seal_pre_commit_phase1:finish:?{:?}",?sector_id);

????Ok(out)

}

P1實現解釋

上邊seal_pre_commit_phase1的代碼中,我們可以看到有三個path,這三個path分別對應:in_path->unsealedpath、out_path->sealedpath、cache_path->cachepath。代碼會先去檢查這三個path,他們兩個是文件,一個是文件夾。

檢查完path后我們可以看到fs::copy方法,它將unsealed文件拷貝到了sealed文件中,完成封裝。

Copy完成后拿出sealed文件的數據,并利用.set_len()方法填充數據(或刪減),使sealed數據達到證明類型配置規定的扇區大小。

setup_params()

setup_params()方法利用證明類型配置構建啟動參數。這里傳入的參數為:扇區大小、分區數、證明類型id、證明類型版本。分區數可看https://github.com/filecoin-project/rust-filecoin-proofs-api/blob/23ae2893741829bddc29d7211e06c914bab5423c/src/registry.rs中的partitions()方法,在對應https://github.com/filecoin-project/rust-fil-proofs/blob/ec2ef88a17ffed991b64dc8d96b30c36b275eca0/filecoin-proofs/src/constants.rs得到具體值。我分析以32GB扇區為主,因此分區數為10。另外三個就不講了,跟分區數一樣,都是從這兩個文件得到的。

pub?fn?setup_params(

????sector_bytes:?PaddedBytesAmount,

????partitions:?usize,

????porep_id:?,

????api_version:?ApiVersion,

)?->?Result<stacked::SetupParams>?{

????//?得到挑戰層數和最大挑戰次數

????let?layer_challenges?=?select_challenges(

????????partitions,

????????*POREP_MINIMUM_CHALLENGES

????????????.read()

????????????.expect("POREP_MINIMUM_CHALLENGES?poisoned")

????????????.get(&u64::from(sector_bytes))

????????????.expect("unknown?sector?size")?as?usize,

????????*LAYERS

????????????.read()

????????????.expect("LAYERS?poisoned")

????????????.get(&u64::from(sector_bytes))

????????????.expect("unknown?sector?size"),

????);

????let?sector_bytes?=?u64::from(sector_bytes);

????ensure!(

????????sector_bytes?%?32?==?0,

????????"sector_bytes?({})?must?be?a?multiple?of?32",

????????sector_bytes,

????);

????let?nodes?=?(sector_bytes?/?32)?as?usize;????//?節點數,SDR共有11層,每一層的節點數量相當于1GiB的字節數量。

????let?degree?=?DRG_DEGREE;????//?用于所有?DRG?圖的基礎度數,?DRG_DEGREE=6。

????let?expansion_degree?=?EXP_DEGREE;?//大小是8,上一層中抽取的節點數量,用來計算當前層的節點數據

????Ok(stacked::SetupParams?{

????????nodes,

????????degree,

????????expansion_degree,

????????porep_id,

????????layer_challenges,

????????api_version,

????})

}

Merkletree和對應comm_d的生成

看完setup_params方法,讓我們繼續看seal_pre_commit_phase1中的compound_public_params參數,這里實際上set_up的時候,將compound_setup_params參數的值賦予進去,并增加了一個至關重要的vanilla_params.graph字段,就是構造出來的圖的數據結構

??接下來我們可以看到seal_pre_commit_phase1方法的70行,在這一段代碼用于生成markletree和comm_d

????let?(config,?comm_d)?=?measure_op(Operation::CommD,?||?->?Result<_>?{

????????let?base_tree_size?=?get_base_tree_size::<DefaultBinaryTree>(porep_config.sector_size)?;

????????let?base_tree_leafs?=?get_base_tree_leafs::<DefaultBinaryTree>(base_tree_size)?;

????????ensure!(

????????????compound_public_params.vanilla_params.graph.size()?==?base_tree_leafs,

????????????"graph?size?and?leaf?size?don't?match"

????????);

????????trace!(

????????????"seal?phase?1:?sector_size?{},?base?tree?size?{},?base?tree?leafs?{}",

????????????u64::from(porep_config.sector_size),

????????????base_tree_size,

????????????base_tree_leafs,

????????);

????????let?mut?config?=?StoreConfig::new(

????????????cache_path.as_ref(),

????????????CacheKey::CommDTree.to_string(),

????????????default_rows_to_discard(base_tree_leafs,?BINARY_ARITY),

????????);

????????//?創建默克爾樹,根據其樹根得到comm_d

????????let?data_tree?=?create_base_merkle_tree::<BinaryMerkleTree<DefaultPieceHasher>>(

????????????Some(config.clone()),

????????????base_tree_leafs,

????????????&data,

????????)?;

????????drop(data);

????????config.size?=?Some(data_tree.len());

????????let?comm_d_root:?Fr?=?data_tree.root().into();

????????let?comm_d?=?commitment_from_fr(comm_d_root);

????????drop(data_tree);

????????Ok((config,?comm_d))

????})?;

這里我們會生成treestoreconfig,然后利用config、base_tree_leafs、sealed填充數據,生成一個merkletree。得到了merkletree后就可以得到merkletree的根。再利用merkletree的根,通過commitment_from_fr算出comm_d。

生成副本id(replica_id)

當我們拿到了comm_d后,會利用verify_pieces方法驗證一下comm_d,這個就不講了,感興趣的可以自己去看代碼。

讓我們看一下副本id是如何生成的

????let?replica_id?=?generate_replica_id::<Tree::Hasher,?_>(

????????&prover_id,

????????sector_id.into(),

????????&ticket,

????????comm_d,

????????&porep_config.porep_id,

????);

利用數據本身生成得到了comm_d,這里再加上礦工id、扇區id、ticket,證明類型id。就能得到replicaid值。

///?Generate?the?replica?id?as?expected?for?Stacked?DRG.

pub?fn?generate_replica_id<H:?Hasher,?T:?AsRef<>>(

????prover_id:?&,

????sector_id:?u64,

????ticket:?&,

????comm_d:?T,

????porep_seed:?&,

)?->?H::Domain?{

????//?以鏈式方式處理輸入數據。

????let?hash?=?Sha256::new()

????????.chain_update(prover_id)

????????.chain_update(&sector_id.to_be_bytes())

????????.chain_update(ticket)

????????.chain_update(&comm_d)

????????.chain_update(porep_seed)

????????.finalize();

????bytes_into_fr_repr_safe(hash.as_ref()).into()????//通過將?le_bytes?的最重要的兩位歸零,將?32?字節的切片轉換為?Fr::Repr。

}

生成labels

接下來就是P1最后的操作:生成labels。將public_params、復制id和treestoreconfig作為參數傳入。

????pub?fn?replicate_phase1(

????????pp:?&'a?PublicParams<Tree>,

????????replica_id:?&<Tree::Hasher?as?Hasher>::Domain,

????????config:?StoreConfig,

????)?->?Result<Labels<Tree>>?{

????????info!("replicate_phase1");

????????let?labels?=?measure_op(Operation::EncodeWindowTimeAll,?||?{

????????????Self::generate_labels_for_encoding(&pp.graph,?&pp.layer_challenges,?replica_id,?config)

????????})?

????????.0;

????????Ok(labels)

????}

這里可以看到,代碼提取出了public_params的.graph字段,就是構造出來的圖的數據結構,和public_params中包含挑戰層數和最大挑戰次數的layer_challenges。

接下來看generate_labels_for_encoding。這里可以分為多核與單核進行SDR編碼,創建labels。

????pub?fn?generate_labels_for_encoding(

????????graph:?&StackedBucketGraph<Tree::Hasher>,

????????layer_challenges:?&LayerChallenges,

????????replica_id:?&<Tree::Hasher?as?Hasher>::Domain,

????????config:?StoreConfig,

????)?->?Result<(Labels<Tree>,?Vec<LayerState>)>?{

????????let?mut?parent_cache?=?graph.parent_cache()?;

????????#

????????{

????????????if?SETTINGS.use_multicore_sdr?{

????????????????info!("multi?core?replication");

????????????????create_label::multi::create_labels_for_encoding(

????????????????????graph,

????????????????????&parent_cache,

????????????????????layer_challenges.layers(),

????????????????????replica_id,

????????????????????config,

????????????????)

????????????}?else?{

????????????????info!("single?core?replication");

????????????????create_label::single::create_labels_for_encoding(

????????????????????graph,

????????????????????&mut?parent_cache,

????????????????????layer_challenges.layers(),

????????????????????replica_id,

????????????????????config,

????????????????)

????????????}

????????}

????????#

????????{

????????????info!("single?core?replication");

????????????create_label::single::create_labels_for_encoding(

????????????????graph,

????????????????&mut?parent_cache,

????????????????layer_challenges.layers(),

????????????????replica_id,

????????????????config,

????????????)

????????}

????}

我將生成label的地址放在這里,想看的可以去看一下,這里就不細講了。

多核:https://github.com/filecoin-project/rust-fil-proofs/blob/master/storage-proofs-porep/src/stacked/vanilla/create_label/multi.rs

單核:https://github.com/filecoin-project/rust-fil-proofs/blob/master/storage-proofs-porep/src/stacked/vanilla/create_label/single.rs

三、總結

其實rust語言我接觸不多,開始的時候看得有點頭痛,最后也是硬著頭皮啃下來的。

如有大佬認為文章有不對的地方,歡迎糾正。

來源:金色財經

Tags:COMTORECTATHPoorQUACK.comTORIWahed Projects Ltdmathwallet

FTT
開創性的區塊鏈操作系統項目——去中心化簿訂單交易所_區塊鏈:GART價格

今天向大家介紹來自Dakai的Peter、Laszlo和Mark。Web3開發人員通過他們的去中心化簿訂單交易所推進了區塊鏈技術的發展.

1900/1/1 0:00:00
DAO法律結構的探討:從美國CFTC對Ooki DAO的訴訟說起_DAO:ftc幣在哪個交易所交易

OokiDAO近日被訴訟,而在DAO里投過票的成員可能需要共同承擔責任。這一情況令人震驚,但它早就在眾多法律人士的預期當中.

1900/1/1 0:00:00
投資中的 Beta VS Alpha:在通脹大環境下產生加密回報_ETA:ALPH

來源:加密投資公司CoinArkCapital編譯:比推BitpushNews,MaryLiu在各大財經文章中,我們經常看到諸如“市場Beta”和“Alpha”之類的術語.

1900/1/1 0:00:00
重磅,俄打通加密跨境大變局_BTC:數字資產

剛剛俄羅斯AlexeiMoiseev表示將允許居民使用數字資產進行跨境支付,一旦草案通過,將深刻改變加密生態格局.

1900/1/1 0:00:00
元宇宙周刊丨沃爾瑪推出新AR試穿功能_NFT:NFTNetwork

概述 近期,沃爾瑪在其iOS應用程序中推出了一項名為BeYourOwnModel的新AR功能,客戶可以上傳自己的照片,以模擬不同的衣服穿在自己身上的效果.

1900/1/1 0:00:00
趨勢已來Douglas AMC是離岸密碼的未來_數字貨幣:sam幣騙局

加密貨幣和離岸的未來 回溯歷史,貨幣形態經歷了商品貨幣、金屬貨幣、紙幣到電子貨幣的演化,隨著區塊鏈、大數據、云計算和人工智能等數字技術的快速發展,數字貨幣逐漸走入人們的視野.

1900/1/1 0:00:00
ads