用1/10的成本为节点运营者启用零认证下载

在Sui网络上运行的验证节点和完整节点需要具有最高水平的可靠性和运行时间,以便提供高吞吐量及区块链的可扩展性。可靠地运行有状态应用的关键部分,确保可以相对轻松地进行硬件故障转移。如果磁盘故障或其他类型的故障影响到运行验证节点的机器,应该有一种简单的方法来迁移验证节点,而无需重新处理所有链历史。

确保无缝故障转移的地方就是快照。Sui网络中的状态快照有两种形式,分别是FormalDatabaseFormal快照包含了在epoch结束时构成验证节点共识信息的最小状态。Database快照实际上是节点数据库的完全副本。

快照如果不存储在可以轻松和可靠地访问的地方,就不会有太多效用。在Sui网络创世开始上传快照时,亚马逊网络服务(AWS)的S3是可靠的后端存储的理想选择,可以与Sui网络上的早期节点运营者共享。Mysten Labs开始在S3上托管公共快照,任何节点运营者都可以使用这些快照快速同步完整节点或验证节点,并将其引入网络。

然而,托管允许公共下载状态快照的S3存储桶的简单行为实际上比我们预期的更加痛苦。状态快照的格式要求您使用AWS命令行界面(CLI)来下载单个快照中包含的许多文件。如果在调用AWS CLI时没有预先存在的AWS凭据可供插入,您需要使用AWS CLI的轻微文档化的指令:aws s3 cp — no-sign-request。

除了用户问题之外,Sui的快照正在呈指数增长。作为一个超高吞吐量的区块链,Sui生成的数据量几乎是空前的。每次下载状态快照时,都需要从S3拉取800多GB的数据到节点运营者的主机上,这需要几个小时的时间。

对于熟悉AWS S3定价背后数学的任何读者来说,公共资源s3://mysten-mainnet-snapshots的成本很快就会变得昂贵。S3会按每传输出S3的数据每GB收费。由于大多数运营商在AWS之外运行节点,因此这适用于Mysten Lab的快照存储桶。我们很快就会产生每月五位数的费用来托管这一公共资源。

为验证节点和完整节点提供状态快照导致每天从AWS S3出口的数据量接近40TB。

Cloudflare最近宣布了R2,这是S3的竞争对手,其定价模型非常独特:零出口费用。这非常适合托管定期获取的数据集,并且在S3上具有巨大的优势特点。

与其进行完全迁移不同,我们选择将R2作为S3的替代来源,并将S3迁移到请求者付费模型。S3具有出色的性能和全球传输加速等功能,我们不想放弃这些功能。这次迁移的主要部分不是调整我们的工具来写入R2(R2与S3 API兼容),而是修改Sui应用程序以轻松从R2读取。

支持R2上的无权限下载

要求用户使用AWS CLI对R2进行操作并不是一个可以接受的体验;相反,我们希望用户能够将我们的工具指向db-snapshot.mainnet.sui.io,并在那里无需任何认证即可读取托管的文件(对我们来说,具有零认证选项很重要,因为我们希望尽可能让任何人都能运行Sui完整节点)。

AWS S3请求签名是与Amazon S3资源安全交互的关键方面。当对S3存储桶进行请求时,无论是上传对象、下载文件、列出对象还是其他任何操作,都需要对请求进行签名,以确保其真实性和完整性。该过程通常涉及使用用户的访问密钥(访问密钥ID、秘密访问密钥)对请求进行签名,从而创建经过身份验证的HTTP请求。

对于公开访问的文件或对象,技术上可以绕过对大多数云提供商的请求签名以进行读取(但不能进行列出)资源的操作,但这在我们使用的Rust对象存储库中不受支持。因此,我们决定在我们的代码库中添加此支持。我们希望添加零认证支持,但让用户可以选择在启用请求者付费模式的情况下通过签名请求从S3还原快照,或者从R2进行无签名读取。为了干净地完成这个过程,我们首先在我们的代码库中声明了常见对象存储操作的抽象化。

#[async_trait]
pub trait ObjectStoreGetExt: std::fmt::Display + Send + Sync + 'static {
/// Return the bytes at given path in object store
async fn get_bytes(&self, src: &Path) -> Result<Bytes>;
}
#[async_trait]
pub trait ObjectStoreListExt: Send + Sync + 'static {
/// List the objects at the given path in object store
async fn list_objects(
&self,
src: Option<&Path>,
) -> object_store::Result<BoxStream<'_, object_store::Result<ObjectMeta>>>;
}
#[async_trait]
pub trait ObjectStorePutExt: Send + Sync + 'static {
/// Write the bytes at the given location in object store
async fn put_bytes(&self, src: &Path, bytes: Bytes) -> Result<()>;
}
#[async_trait]
pub trait ObjectStoreDeleteExt: Send + Sync + 'static {
/// Delete the object at the given location in object store
async fn delete_object(&self, src: &Path) -> Result<()>;
}

为了在签名和无签名实现之间进行清晰切换,我们的使用函数也需要做一些修改:

/// Read object at the given path from input store using either signed or
/// unsigned store implementation
pub async fn get<S: ObjectStoreGetExt>(store: &S, src: &Path) -> Result<Bytes>;
/// Returns true if object exists at the given path
pub async fn exists<S: ObjectStoreGetExt>(store: &S, src: &Path) -> bool;
/// Write object at the given path. There is no unsigned put implmenetation
/// because writing an object requires permissioned user signing requests
pub async fn put<S: ObjectStorePutExt>(store: &S, src: &Path, bytes: Bytes) -> Result<()>;

然后,我们实现了上述特征的签名实现(通过回退到我们已经使用的对象存储库)和无签名实现(利用各个云提供商的REST API):

/// Implementation for making signed requests using object store lib
#[async_trait]
impl ObjectStoreGetExt for Arc<DynObjectStore> {
async fn get_bytes(&self, src: &Path) -> Result<Bytes> {
self.get(src)
.await?
.bytes()
.await
.map_err(|e| anyhow!("Failed to get file: {} with error: {}", src, e.to_string()))
}
}
/// Implementation for making unsigned requests to [Amazon
/// S3](https://aws.amazon.com/s3/).
#[derive(Debug)]
pub struct AmazonS3 {
/// Http client wrapper which makes unsigned requests for S3 resources
client: Arc<S3Client>,
}
#[async_trait]
impl ObjectStoreGetExt for AmazonS3 {
async fn get_bytes(&self, location: &Path) -> Result<Bytes> {
let result = self.client.get(location).await?;
let bytes = result.bytes().await?;
Ok(bytes)
}
}
/// Implementation for making unsigned requests to [Google Cloud
/// Storage](https://cloud.google.com/storage/).
#[derive(Debug)]
pub struct GoogleCloudStorage {
/// Http client wrapper which makes unsigned requests for gcs resources
client: Arc<GoogleCloudStorageClient>,
}
#[async_trait]
impl ObjectStoreGetExt for GoogleCloudStorage {
async fn get_bytes(&self, location: &Path) -> Result<Bytes> {
let result = self.client.get(location).await?;
let bytes = result.bytes().await?;
Ok(bytes)
}
}
pub struct ObjectStoreConfig {
/// Which object store to use i.e. S3, GCS, etc
#[serde(skip_serializing_if = "Option::is_none")]
#[arg(value_enum)]
pub object_store: Option<ObjectStoreType>,
/// Name of the bucket to use for the object store. Must also set
/// ` - object-store` to a cloud object storage to have any effect.
#[serde(skip_serializing_if = "Option::is_none")]
#[arg(long)]
pub bucket: Option<String>,
#[serde(default)]
#[arg(long, default_value_t = false)]
pub no_sign_request: bool,
…
}
impl ObjectStoreConfig {
pub fn make_signed(&self) -> Result<Arc<DynObjectStore>, anyhow::Error> {
match &self.object_store {
Some(ObjectStoreType::File) => self.new_local_fs(),
Some(ObjectStoreType::S3) => self.new_s3(),
Some(ObjectStoreType::GCS) => self.new_gcs(),
_ => Err(anyhow!("At least one backed is needed")),
}
}
}
pub trait ObjectStoreConfigExt {
fn make_unsigned(&self) -> Result<Arc<dyn ObjectStoreGetExt>>;
}
impl ObjectStoreConfigExt for ObjectStoreConfig {
fn make_unsigned(&self) -> Result<Arc<dyn ObjectStoreGetExt>> {
match self.object_store {
Some(ObjectStoreType::S3) => {
let bucket_endpoint = { };
Ok(AmazonS3::new(&bucket_endpoint).map(Arc::new)?)
}
Some(ObjectStoreType::GCS) => {
let bucket_endpoint = { };
Ok(GoogleCloudStorage::new(&bucket_endpoint)).map(Arc::new)?)
}
_ => Err(anyhow!("At least one backend is needed")),
}
}
}

有了以上所有内容,我们可以根据用户提供的配置清晰地在签名和无签名实现之间切换:

let store: Arc<dyn ObjectStoreGetExt> = if store_config.no_sign_request {
store_config.make_unsigned()?
} else {
store_config.make_signed().map(Arc::new)?
};

我们接近实现零认证快照下载的目标,但还没有到达。最后一个挑战涉及无法在R2存储桶中列出文件而无需签名请求(在S3上可以允许公开的、无签名的列出访问)。在下载RocksDB快照目录之前,我们需要列出其中的文件。我们通过在快照创建过程中添加一个包含所有文件路径的MANIFEST文件来解决了这个问题。现在,这个MANIFEST文件是快照目录中所有文件及其相对路径的真实来源。

最终结果

最终,通过将R2作为默认的快照下载选项,我们能够将提供这些快照的成本降低约70至80%,同时降低了Sui网络中节点的启动和故障转移的障碍。

注意:本内容仅供一般教育和信息目的使用,不应被解释或依赖作为购买、出售或持有任何资产、投资或金融产品的认可或推荐,并且不构成财务、法律或税务建议。


关于 Sui Network

Sui是基于第一原理重新设计和构建而成的L1公有链,旨在为创作者和开发者提供能够承载Web3中下一个十亿用户的开发平台。Sui上的应用基于Move智能合约语言,并具有水平可扩展性,让开发者能够快速且低成本支持广泛的应用开发。获取更多信息:https://linktr.ee/sui_apac

官网|英文Twitter|中文Twitter|Discord|英文电报群|中文电报群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504926.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最新2024年增强现实(AR)营销指南(完整版)

AR营销是新的最好的东西&#xff0c;就像元宇宙和VR营销一样。利用AR技术开展营销活动可以带来广泛的利润优势。更不用说&#xff0c;客户也喜欢AR营销&#xff01; 如果企业使用AR&#xff0c;71%的买家会更多地购物。40%的购物者准备在他们可以在AR定制的产品上花更多的钱。…

记录实现水平垂直居中的5种方法

记录块级元素实现水平垂直居中的方法&#xff0c;效果如图。 <div class"parent"><div class"child">居中元素</div> </div><style> .parent {position: relative;width: 600px;height: 300px;background-color: #679389; …

每日一练 找无重复字符的最长子串

我们来看下这个题目&#xff0c;我们要统计的是不重复的子串&#xff0c;我们可以使用“滑动窗口法”&#xff0c;其实我们很容易就能想到思路。 我们的左窗代表我们目前遍历的开始&#xff0c;即我们遍历的子串的开头&#xff0c;右窗从左窗开始进行遍历&#xff0c;每次遍历…

【Redis持久化】RDB、ROB介绍和使用

RDB、ROB介绍和使用 引言ROB介绍配置指令介绍使用指令&#xff1a;dump文件修复指令快照禁用 AOF工作流程&#xff1a;文件重写&#xff1a;三种写回策略&#xff1a; 混合使用 引言 持久化的目的&#xff0c;其实就是在Redis重启或者中途崩溃的时候能够依靠自身恢复数据&…

Electron 读取本地配置 增加缩放功能(ctrl+scroll)

最近&#xff0c;一个之前做的electron桌面应用&#xff0c;需要增加两个功能&#xff1b;第一是读取本地的配置文件&#xff0c;然后记载配置文件中的ip地址&#xff1b;第二就是增加缩放功能&#xff1b; 第一&#xff0c;配置本地文件 首先需要在vue工程根目录中&#xff0…

蓝桥杯 本质上升序列

题目描述: 小蓝特别喜欢单调递增的事物。 在一个字符串中&#xff0c;如果取出若干个字符&#xff0c;将这些字符按照在字符串中的顺序排列后是单调递增的&#xff0c;则成为这个字符串中的一个单调递增子序列。 例如&#xff0c;在字符串 lanqiao 中&#xff0c;如果取出字符…

二维码门楼牌管理应用平台建设:构建智慧社区新生态

文章目录 前言一、二维码门楼牌管理应用平台概述二、公益报名功能的实现方式三、二维码门楼牌管理应用平台在智慧社区建设中的作用四、结论与展望 前言 随着科技的快速发展&#xff0c;智慧城市建设已成为现代城市管理的重要方向。二维码门楼牌管理应用平台作为智慧社区建设的…

算法系列--动态规划--特殊的状态表示--分析重复子问题

&#x1f495;"轻舟已过万重山!"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–算法系列–动态规划–特殊的状态表示–分析重复子问题 大家好,今天为大家带来的是算法系列--动态规划--特殊的状态表示--分析重复子问题 一.组合总数IV 链接…

Mybatis的动态SQL~

MyBatis有一个强大特性就是它的动态SQL。在实际项目开发中&#xff0c;经常需要根据不同条件拼接SQL语句&#xff0c;拼接时还要确保不能忘了必要的空格&#xff0c;有时候还要注意省掉列名列表最后的逗号...等等。在使用JDBC 或其他类似持久层框架操作数据库时&#xff0c;处理…

探索----------------阿里云

目录 一、阿里云四大件 1、云服务器ECS 2、云数据库RDS 3、负载均衡SLB 4、对象存储OSS 5、其他的云计算产品 1&#xff09;内容分发网络CDN 2&#xff09;专有网络 VPC 二、linux发行版本 三、你平时对系统会怎么优化&#xff08;五大负载&#xff09; 1、cpu 使用率…

记一次对Codis的无知引起的逻辑变更

先提前说明&#xff0c;对Codis的无知是因为Codis不支持一些Redis的命令&#xff0c;而这次的逻辑变更&#xff0c;就是因为使用了PUBLISH&#xff0c;而Codis又不支持PUBLISH导致的。 1. 前言 前段时间的一次需求中&#xff0c;因为设计到多个服务的注册问题&#xff0c;在项…

算法整理:排序

快速排序 首先不妨以第一个数为基准数&#xff0c;在一轮遍历后&#xff0c;使基准数左边的数都小于基准数&#xff0c;基准数右边的数都大于基准数。 当然也可以取中间的数为基准数。 void quick_sort(int q[],int l,int r){if(l>r)return;int i l;int j r;int xq[(lr)/…

类的函数成员(二):析构函数

一.定义 析构函数(destructor) 与构造函数相反&#xff0c;当对象结束其生命周期&#xff0c;如对象所在的函数已调用完毕时&#xff0c;系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作。 例如&#xff0c;在建立对象时用new开辟了一片内存空间&#xff0c;dele…

【LeetCode】三月题解

文章目录 [2369. 检查数组是否存在有效划分](https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/)思路&#xff1a;代码&#xff1a; [1976. 到达目的地的方案数](https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/) 思路…

005 高并发内存池_CentralCache设计

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;高并发内存池 &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言本文重点一、构建CentralCache结构二、运用慢开始反馈调节算法三、完成向CentralCache中心缓存申请四…

【讲解下Gitea】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

2024.3.30学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p295-p314 super关键字 super代表父类的引用&#xff0c;用于访问父类的属性、方法、构造器 super细节和语法 访问父类的属性&#xff0c;但不能访问父类的private属性 super.属性名 访问父类的…

STM32学习笔记(10_2)- I2C通信协议MPU6050简介

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 本期开…

【Java八股学习】Redis持久化 思维导图

说明 文章内容通过学习小林Coding内的优质文章后整理而来&#xff0c;整理成思维导图的方式是为了帮助自己理解、记忆和复习。如若侵权请联系删除&#xff0c;再次对小林Coding内的优质文章表示感谢。参考文章如下&#xff1a; AOF 持久化是怎么实现的&#xff1f;RDB 快照是…

Leaflet使用多面(MultiPolygon)进行遥感影像掩膜报错解决之道

目录 前言 一、问题初诊断 1、山重水复 2、柳暗花明 3、庖丁解牛 4、问题定位 二、解决多面掩膜问题 1、尝试数据修复 2、实际修复 3、最终效果 三、总结 前言 之前一篇讲解遥感影像掩膜实现&#xff1a;基于SpringBoot和Leaflet的行政区划地图掩膜效果实战&#xff0…