您正在查看: Surou 发布的文章
soonlabs/igloo 代码分析
github: https://github.com/soonlabs/igloo.git
igloo\example\src\main.rs
async fn main() -> Result<()> {
env_logger::init();
let (instant_sender, instant_receiver) = channel(1024);
let instanct_driver = InstantDeriveImpl::new(instant_receiver);
let (da_sender, da_receiver) = channel(1);
let da_driver = DaDeriveImpl::default();
let (attribute_sender, attribute_receiver) = channel(1024);
let mut runner = SimpleRunner::new(Path::new("/tmp/igloo-example"), attribute_sender)?; // blockstore和accountsdb 存储路径
runner.register_instant(instanct_driver); // 从instant_sender获取非安全区块数据
runner.register_da(da_driver.clone()); // 从DA获取安全区块数据
MockLayer1::new(1000, instant_sender).run(); // 从起始高度 1000,每隔12s 产生一个mock区块,喂到 instant_sender
TxServer::new(runner.get_engine().stream().clone()).run();// 每秒随机0-4个L2交易,喂到stream
Batcher::new(da_sender).run(attribute_receiver); // 将da_sender接收到的交易通过receive_tx_loop放到cache,每隔20s将catche中的交易通过da_sender发送给da_receiver
da_driver.run(da_receiver); // 将da_receiver接收到的数据,写入到cached,模拟DA
loop {
if let Err(e) = runner.advance().await {
// We should match the error type and panic accordingly in production code
error!("Error: {}", e);
}
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
}
}
igloo\example\src\runner.rs
impl SimpleRunner {
pub fn new(
base_path: &Path,
attribute_sender: Sender<PayloadAttributeImpl>,
) -> anyhow::Result<Self> {
Ok(Self {
engine: SvmEngine::new(base_path, attribute_sender)?,
instant_derive: None,
da_derive: None,
current_head: None,
sequence_number: 0,
})
}
async fn advance_unsafe(&mut self) -> Result<()> {
let info = self.instant_derive()?.get_new_block().await?; // 从L1获取L2提交的交易
async fn advance_safe(&mut self) -> Result<()> { // 从DA中检查并获取未执行的区块数据,DA中的数据认为是已经经过检查,所以作为安全数据
trace!("begin of da derive");
while let Some(attribute) = self.da_derive()?.next().await {
if self.has_executed(&attribute) { // 检查是否已经执行过
debug!(
"skip executed attribute at L1 height {} sequence number {}",
attribute.epoch.block_height(),
attribute.sequence_number
);
continue;
}
let block = self.engine.produce_block(attribute).await?;
self.new_block(block).await?;
}
trace!("end of da derive");
Ok(())
}
igloo\example\src\l2\engine.rs
pub async fn produce_block(
&mut self,
attribute: PayloadAttributeImpl,
) -> anyhow::Result<BlockPayloadImpl> {
let mut transactions = (*attribute.transactions).clone();
let extra_txs = {
self.stream
.write()
.await
.next_batch(Default::default())
.await
};
trace!(
"produce block with {} deposit txs, {} normal txs",
transactions.len(),
extra_txs.len()
);
transactions.extend(extra_txs);
let new_attribute = PayloadAttributeImpl { // 组装区块所需数据
transactions: Arc::new(transactions),
epoch: attribute.epoch,
sequence_number: attribute.sequence_number,
};
let block = self.producer.produce(new_attribute.clone()).await?;
if let Err(e) = self.attribute_sender.send(new_attribute).await {
error!("Failed to send attribute: {}", e);
}
Ok(block)
}
}
总结
该Demo只演示了基础的模拟区块组装,数据与DA层Mock流转,核心层代码逻辑并未开源,关注后期更新
LiteSVM- 精简SVM
litesvm是一个用于测试 Solana 程序的快速轻量级库。它的工作原理是创建一个针对程序开发人员优化的进程内 Solana VM。这使得它的运行和编译速度比solana-program-test和等替代方案快得多solana-test-validator。它进一步打破了传统,拥有符合人体工程学的 API,具有合理的默认值和广泛的可配置性,供需要的人使用。
最新回复
fzd: 请问这个解决了吗
StarkWare explained: layer 2 solution provider of dYdX and iMMUTABLE R11; BitKeep News: [...]Layer 2: https://...
一文读懂 StarkWare:dYdX 和 Immutable 背后的 L2 方案 R11; BitKeep 博客: [...]Layer 2:Comparing Laye...
http://andere.strikingly.com/: Regards, Great stuff!
surou: 需要先执行提案合约申请,等待出块节点地址同意后,才会进...
heco: WARN [11-19|11:26:09.459] N...
P: 你好,我在heco链上遇到了“tx fee excee...
Peng: 楼主安装成功了吗?我正在同步区块链,一天了,差不多才同...
joyhu: 你好,请问下安装好之后如何获取到bee.yaml配置文...
kaka: 支票最终怎么提币呢?
归档
January 2026December 2025November 2025October 2025September 2025August 2025July 2025June 2025May 2025April 2025March 2025February 2025January 2025December 2024November 2024October 2024September 2024August 2024July 2024June 2024May 2024April 2024March 2024January 2024December 2023November 2023October 2023September 2023August 2023July 2023June 2023April 2023March 2023February 2023January 2023December 2022November 2022October 2022August 2022July 2022June 2022May 2022March 2022February 2022January 2022December 2021November 2021October 2021September 2021August 2021July 2021June 2021May 2021April 2021March 2021February 2021January 2021December 2020November 2020October 2020September 2020July 2020June 2020May 2020April 2020March 2020February 2020January 2020December 2019November 2019October 2019September 2019August 2019July 2019June 2019May 2019April 2019March 2019February 2019January 2019December 2018November 2018October 2018September 2018August 2018July 2018June 2018