Swarm是什么
Swarm 是一个全球p2p网络(分布式存储网络),其任务是存储和分发世界上所有的数据,是对以太坊基于区块链的智能合约的补充,并在Dapp构建难题中提供大容量存储。 对解决以太坊数据存储在公链上导致以太坊运转慢,网络阻塞有很大帮助,通俗来讲Swarm分布式存储是为了给以太坊的应用提供数据存储、带宽等资源支持。
怎么访问Swarm
Swarm官方提供了访问Swarm网络的客户端程序:Bee,通过客户端程序我们就可以连接到Swarm网络
Bee客户端下载地址
访问Swarm注意事项
- 如果你想体验去中心化的网络但不想通过给Swarm网络提供存储或转发数据来赚取gBZZ,只需要直接运行Bee客户端,就可以直接访问Swarm的web或其他运用
- 如果你想通过运行自己的客户端,并且给Swarm网络提供相应的存储来赚取gBZZ你需要在运行你的Bee客户端时做相应的配置修改
获取gBZZ原理
BZZ是Swarm发行的功能性代币,是使用Swarm去中心化存储、带宽的gas及网络上的支付凭证。Swarm对资源服务提供者给予的回报奖励激励就是BZZ币,也就是我们在Swarm挖矿挖的就是BZZ币。
Swarm挖矿分为两个阶段
第一阶段:测试网阶段,是获得100万奖励币的过程,不是真正的挖矿
第二阶段:主网上线之后
测试阶段:
在测试网,因为没有用户,官方会随机指定35个用户作为蜂后节点陪大家一起进行测试,我们需要做的就是尽量多和这35个蜂后节点进行交互数据,获得他的凭证,将来进行兑换
主网上线:
用户把文件上传到Swarm网络,文件会被分解成4k的数据包,然后推送给所有节点储存,为存储块数据提供服务的节点,从那些需要储存和检索数据服务的节点得到gBZZ作为补偿。
Swarm是没有自己的区块链,它只是以太坊区块链上的一个智能合约,也就是说它没有自己的链条不像Filecoin他有自己的区块链
Swarm分为两个部分,一部分是链上部分,一个部分是链下部分。
链上部分因为没有自己的区块链,所以用以太坊的区块链来代替;链下部分其实就是他网络存储节点交互等一系列交互。也就是说链上以太坊部分他存的主要是和它的BZZ相关的内容,那链下就是节点之间互相交互数据存储的内容
链下的工作原理
举个例子:我是链下的节点,你也是链下节点,我现在需要存储数据,我会把一个数据发给你,然后你会把数据接收过来,接受完整之后你就会返回一个消息,说我已经存储好了。我就会根据你返回的这个消息判断你这个网络带宽怎么样,你的存储能力怎么样,你的性能怎么样,我会给你一个凭证,这个凭证将来可以兑换BZZ使用。
你可能会问:为啥不直接给BZZ?因为直接给BZZ太麻烦了,网络的BZZ都是在链上锁定的,给一次BZZ就需要调用一次智能合约,花费一定的Gas费,所以我给你凭证,过段时间再存一次我再给你一个凭证,你把凭证累加到一定的数量,你想兑换的话,你再过来申请兑换提交申请,然后我再调用链上的智能合约,把这个BZZ付给你,这可以有效的可以降低链的压力,这就是一个正常的Swarm挖矿流程。
- 注:你的bee客户端成功运行之后需要往你的以太地址转入1个gBZZ才能和网络正确交互,如果需要测试币的话可以去官方的Discord下面的#faucet频道,输入
/faucet sprinkle 你的以太坊地址
领取
如何配置Bee客户端赚取gBZZ
- 配置你的节点以全节点模式启动,Bee客户端默认是以轻节点模式启动,修改配置文件full-node:true,才能完全参与Swarm
- 配置交换端点(合约钱包地址),为了访问区块链,节点必须连接到Goerli网络上的以太坊区块链节点,节点需要和你的合约进行交互
- Swarm需要你的设备存储传输给你的数据,不同的硬件对数据的写入读取性能表示不一样,需要配置Bee对写入读取的限制。
- 为了能让其他人连接到你的节点,需要广播你的公网IP和p2p端口确保你的Bee能够接受来自其他对等的连接
Bee配置信息解析
在命令行输入bee printconfig命令打印默认的配置信息,配置信息如下所示
1 | api-addr: :1633 |
参数详解
api-addr: API进行http请求的IP和端口,默认端口1633,参数格式:”IP:Port”,例如:”132.132.132.132:1633”。省略ip地址部分让服务器监听所有接口
block-time: 与连接的合约钱包地址的预期阻塞时间
bootnode:引导节点,网络中的任何Bee节点都可以作为引导节点。默认情况下,一个节点会连接到Swarm主网。当使用私人或测试网络时,必须设置网络特定的引导节点。可以是多地址
bootnode-mode:是否是引导节点模式
cache-capacity:用于转发和上传块的磁盘空间的数量,以块为单位。
clef-signer-enable:是否使用Ethereum的外部签名器Clef进行签名,由于Bee必须自动和快速地签署大量的交易,所以打包了一个Bee专用的Clef版本,即Bee-clef,它包括所有相关的配置,并实现了使Clef与Bee一起工作所需的特定配置。
clef-signer-endpoint:系统clef的默认路径
clef-signer-ethereum-address:默认选择索引为0的CLEF地址,如果你在Bee Clef中导入了多个键,使用这个命令可以指定使用哪个Bee Clef地址。
config: 配置文件的路径
cors-allowed-origins:API响应的域名或通配符,例如:cors-allowed-origins=”https://website.ethswarm.org“ 或 cors-allowed-origins=”*”
data-dir: Bee在你的磁盘上存储数据的位置,这个目录中的数据将被要求用来恢复使用相同密钥的节点状态。这个目录包括:块数据(Chunk Data),状态数据(State Data),密钥库数据(Keystore Data)
- 块数据:这包括你在本地存储的块和文件,你请求的缓存块或你负责为对等方提供服务的责任范围内的块
- 状态数据:这是关于你的Bee节点的本地状态的信息,应该被备份起来。
- 密钥库数据:这些文件包含了你的私钥的加密版本,应该被备份并保持隐私。
db-block-cache-capacity: DB块缓存容量
db-disable-seeks-compaction: 是否启用数据压缩
db-open-files-limit: 文件读写频率限制(为了适应不那么强大的硬件和操作系统,open-files-limit被故意设置得很低,值越大,Bee读取和写入数据库的速度越快,它在转发和提供块的效率就越高,能获得gBZZ的概率就越大)
db-write-buffer-size: DB写缓冲区大小
debug-api-addr: Debug API提供http请求的IP和端口。省略地址中的IP部分将导致服务器监听所有请求。
debug-api-enable: 是否启用debug api模式
full-node: 是否是全节点模式,通过将其设置为”true”来启用,以完全参与服务和转发分块到网络。
gateway-mode: 网关模式,将此设置为 “true”,以禁用API中的一些敏感功能,确保将你的api-addr暴露在公共互联网上是安全的。
global-pinning-enable: 是否开启本地固定。本地固定可确保你自己的节点不会删除上传的文件,但是其他存储您数据的节点(因为它们属于其职责范围内)可能已删除了最近尚未访问的内容,以便腾出空间
help: 是否启用帮助
nat-addr: 设置公共IP,通常这是自动生成的,但在某些情况下,可能需要手动设置。
network-id:接受新连接的网络ID。设置为1代表主网,2代表测试网。
p2p-addr:监听p2p协议信息的ip和端口。
p2p-quic-enable:是否启用p2p协议的QUIC协议
p2p-ws-enable:是否启用web-sockets传输,用于p2p通信
password: 用于解密Swarm身份密钥的密码
password-file: 解密身份密钥的密码文件的路径。假设没有文件则为空字符串。
payment-early: 当BZZ的金额小于设定的支付金额,Bee启动结算
payment-threshold: 你期望从你的同伴那里得到的报酬金额
payment-tolerance: 当超过设定的支付门槛的多余债务,断开与其他节点的连接。
postage-stamp-address: 默认自动配置,以太坊区块链上邮票合约的地址,用于购买成批的邮票。
resolver-options: ENS API端点包括合同地址,支持多个值。例如:eth:0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e@localhost:8545
standalone: 如果想让节点不尝试连接到网络,就设置这个标志为true
swap-deployment-gas-price: 合约交易服务费
swap-enable: 是否启用交易
swap-endpoint:以太坊区块链端点必须配置成websockets协议
swap-factory-address:当前区块链ID的默认合约地址
swap-initial-deposit: 交易初始存款
tracing-enable: 发送追踪信息到追踪服务
tracing-endpoint: 追踪服务监听Thrift协议UDP消息的URL
tracing-service-name: 追踪服务中的服务标识符
transaction: 交易哈希,从Bee节点的以太坊地址发送到Goerli网络上的任何以太坊交易的交易哈希
verbosity: 节点输出信息 包括:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=trace
welcome-message: 自定义欢迎信息,在成功连接时显示给对方的信息
如何搭建挖矿Bee节点
以下以windows平台为例。Linux平台可参考官方文档安装Bee
- 下载最新版本的bee-windows-amd64.exe程序包
- 进入bee程序包所在目录,运行命令行输入:
bee.exe printconfig
查看默认配置,把命令行输出的配置信息复制出来保存为bee.yaml文件 - 根据自己的需求修改默认配置相关参数,参数说明见上文:Bee配置信息解析
常见需要修改配置
1 | clef-signer-enable: false |
注册swap-endpoint地址:https://infura.io,注册教程:https://www.bilibili.com/video/BV1EV411Y7yM (从第七分钟看),拿到Goerli的的swap-endpoint地址替换配置文件里的swap-endpoint地址
保存修改后的配置文件,在命令行中输入:
bee-windows-amd64.exe start --config bee.yaml
,此时是第一次运行bee需要输入密码和确认密码之后会看到一个让你转入代币的钱包地址复制这个钱包地址,去官方的水龙头给这个地址注入代币
6.1. 水龙头:加入官方discord:https://discord.gg/ykCupZMuww 在#faucet频道发送:/faucet sprinkle 你的地址6.2. https://faucet.ethswarm.org/ 官方水龙头测试币(不太稳定)
在区块链浏览就可以看到领到的gBzz:https://goerli.etherscan.io/address/你的钱包地址
重新运行bee,看到以下状态证明运行成功
检查bee节点状态
浏览器输入:http://localhost:1633/ 出现以下字样代表bee连接成功
输入http://localhost:1635/peers 查看你连接的节点数
输入http://localhost:1635/addresses 查看你的账本合约地址
输入http://localhost:1635/chequebook/cheque 查询支票,lastreceived:null 表示还没收到支票
如何搭建蜂巢
要想赚取更多的BZZ就需要和你的Bee节点和qBee节点尽量多的数据交换,由于目前不知道哪些节点是qBee节点,那么如何做到尽可能多的和qBee节点数据交换呢?官方文档里推荐启用多个节点来增加和qBee节点数据交换的机会,比如使用Hive或者docker来集群化管理节点,也可以采用创建多个配置文件的方式来启用多个节点,考虑到不管是用Hive还是docker都会对系统资源有所消耗,所以推荐采用多配置的方式来构建Bee集群。
如何采用多配置的方式构建Bee集群
上面我们讲了如何启动一个用于赚取BZZ的节点,我们只要以同样的方式创建多个配置文件,在配置文件里需要注意修改 api-addr,p2p-addr,debug-api-addr这三个参数的值使Bee节点监听在不同的端口,同时也要确保你所修改的端口能正常访问(防火墙需要添加入站规则)。然后启动节点的命令bee-windows-amd64.exe start --config 不同的配置文件名
例如:
bee-windows-amd64.exe start –config bee.yaml 以名为bee的配置文件启动bee节点
bee-windows-amd64.exe start –config bee2.yaml 以名为bee2的配置文件启动bee节点
SWARM矿机
由于官方没有给出具体的硬件配置信息,但是通过Bee节点挖矿原理可以知道,Bee节点主要是接收并存储推送过来的数据,所以对硬盘的性能和网络带宽依赖性比较大。Swamr中每个片段大小为4KB,数据存储于磁盘上,因此数据的访问能力受限于磁盘IO,可以根据磁盘的IOPS(每秒读写IO次数)性能计算出每一种磁盘的SWARM读写性能:
HDD硬盘:HDD硬盘的IOPS最高约为在76(7200转)到166(15000转)之间,因此读写性能在 (76~166)x4KB=300KB-664KB每秒!! 如果折算成带宽,就是一个3-6Mbps,也就是说,如果使用一个机械硬盘,即使在一台机器上运行了再多的节点,使用了再多的带宽,也只有最高3-6Mbps带宽的收益上限
SSD:SSD的IOPS最高大约在4万,因此读写性能的极限在40000x4KB = 160000KB = 160MB。折算成带宽,大约在1.6Gbps。 同样一台机器上运行再多的节点,使用再多的带宽,收益的上限是1.6Gbps
因此我们得出结论:可以在一台物理节点上尽可能地跑多个节点,从而获得更多的收益,不推荐使用HDD,当使用SSD,网络带宽足够的情况下,运行更多的节点将会带来更多的收益
系统另外的瓶颈:CPU和内存。 当节点跑得起多,CPU和内存的需求就越高,不同的CPU的性能不同,不同大小容量的内存性能不同,无法给出定量的数据。
推荐矿机配置:硬盘首选SSD,100M企业宽带,CPU和内存可根据具体的套餐进行配置
提现
当你的节点累积了足够多的支票时,可以使用Bee提供的API将其兑现,这个过程将BZZ从你服务的节点的支票簿中转移到你自己的支票簿中,然后你可以将其提现到你的钱包中。
在浏览器中输入:http://localhost:1635/chequebook/balance 查询节点的当前余额
也可以查寻你的对等余额,代币只有在一个节点结算支票时才会实际到手。可以是手动触发也可以是在与一个节点达到一定的阈值时触发的。在这种情况下,会发生结算
在浏览器中输入:http://localhost:1635/chequebook/balances
发送请求 http://localhost:1635/chequebook/cashout/你的钱包地址 完成提现
在浏览器中输入 http://localhost:1635/chequebook/cashout 查看取现状态,也可以通过以太网浏览器查看
发送请求(POST) http://localhost:1635/chequebook/withdraw\?amount\=1000 把我们的gBZZ从chequebook合约中提现到我们节点自己的钱包
发送请求(POST) http://localhost:1635/chequebook/deposit\?amount\=1000 如果我们使用的服务超过了我们所提供的服务,我们可以通过向存款端点发送POST请求,将额外的gBZZ存入支票簿合约
也可以使用官网提供的提现脚本(https://gist.githubusercontent.com/ralph-pichler/3b5ccd7a5c5cd0500e6428752b37e975/raw/cashout.sh)
使用方法见官网说明:https://docs.ethswarm.org/docs/working-with-bee/cashing-out
相关API
- http://localhost:1633/ 检测Bee节点是否启动成功
- http://localhost:1635/peers 查看连接的节点数
- http://localhost:1635/addresses 查看你的账本合约地址
- http://localhost:1635/chequebook/cheque 查询支票,lastreceived:null 表示还没收到支票
- http://localhost:1635/chequebook/balance 查询节点的当前余额
- http://localhost:1635/chequebook/balances 查寻对等余额
- http://localhost:1635/chequebook/cashout/你的钱包地址 发起提现(POST)
- http://localhost:1635/chequebook/cashout 查询提现状体
- http://localhost:1635/chequebook/withdraw\?amount\=1000 从chequebook合约提现到节点自己的钱包
- http://localhost:1635/chequebook/deposit\?amount\=1000 向支票簿合约转账
参考文献
Swarm Bee官方文档
SWARM(BZZ)到底挖了个啥
Swarm的挖矿是怎么运行的
LevelDB库简介
科普:QUIC协议原理分析
拓展知识
1 | 1. p2p网络即对等网络,是一种网络的参与者共享他们所拥有的一部分硬件资源,这些共享资源通过网络提供服务和内容,能被其它对等节点(Peer)直接访问而无需经过中间实体,此网络中的参与者既是资源、服务和内容的提供者,又是资源、服务和内容的获取者 |
HTTPS及QUIC建连过程如图所示
1 | 相比现在广泛应用的 http2+tcp+tls 协议有如下优势: |
QUIC协议的优势
1 | QUIC的缺点 |