Swarm原理和部署

Swarm是什么

Swarm 是一个全球p2p网络(分布式存储网络),其任务是存储和分发世界上所有的数据,是对以太坊基于区块链的智能合约的补充,并在Dapp构建难题中提供大容量存储。 对解决以太坊数据存储在公链上导致以太坊运转慢,网络阻塞有很大帮助,通俗来讲Swarm分布式存储是为了给以太坊的应用提供数据存储、带宽等资源支持。

怎么访问Swarm

Swarm官方提供了访问Swarm网络的客户端程序:Bee,通过客户端程序我们就可以连接到Swarm网络
Bee客户端下载地址

访问Swarm注意事项

  1. 如果你想体验去中心化的网络但不想通过给Swarm网络提供存储或转发数据来赚取gBZZ,只需要直接运行Bee客户端,就可以直接访问Swarm的web或其他运用
  2. 如果你想通过运行自己的客户端,并且给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

  1. 配置你的节点以全节点模式启动,Bee客户端默认是以轻节点模式启动,修改配置文件full-node:true,才能完全参与Swarm
  2. 配置交换端点(合约钱包地址),为了访问区块链,节点必须连接到Goerli网络上的以太坊区块链节点,节点需要和你的合约进行交互
  3. Swarm需要你的设备存储传输给你的数据,不同的硬件对数据的写入读取性能表示不一样,需要配置Bee对写入读取的限制。
  4. 为了能让其他人连接到你的节点,需要广播你的公网IP和p2p端口确保你的Bee能够接受来自其他对等的连接

Bee配置信息解析

在命令行输入bee printconfig命令打印默认的配置信息,配置信息如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
api-addr: :1633
block-time: "15"
bootnode:
- /dnsaddr/bootnode.ethswarm.org
bootnode-mode: false
cache-capacity: "1000000"
clef-signer-enable: false
clef-signer-endpoint: ""
clef-signer-ethereum-address: ""
config: C:\Users\chia\.bee.yaml
cors-allowed-origins: []
data-dir: C:\Users\chia\.bee
db-block-cache-capacity: "33554432"
db-disable-seeks-compaction: false
db-open-files-limit: "200"
db-write-buffer-size: "33554432"
debug-api-addr: :1635
debug-api-enable: false
full-node: false
gateway-mode: false
global-pinning-enable: false
help: false
nat-addr: ""
network-id: "1"
p2p-addr: :1634
p2p-quic-enable: false
p2p-ws-enable: false
password: ""
password-file: ""
payment-early: "1000000000000"
payment-threshold: "10000000000000"
payment-tolerance: "10000000000000"
postage-stamp-address: ""
resolver-options: []
standalone: false
swap-deployment-gas-price: ""
swap-enable: true
swap-endpoint: ws://localhost:8546
swap-factory-address: ""
swap-initial-deposit: "10000000000000000"
swap-legacy-factory-addresses: []
tracing-enable: false
tracing-endpoint: 127.0.0.1:6831
tracing-service-name: bee
transaction: ""
verbosity: info
welcome-message: ""

参数详解

  1. api-addr: API进行http请求的IP和端口,默认端口1633,参数格式:”IP:Port”,例如:”132.132.132.132:1633”。省略ip地址部分让服务器监听所有接口

  2. block-time: 与连接的合约钱包地址的预期阻塞时间

  3. bootnode:引导节点,网络中的任何Bee节点都可以作为引导节点。默认情况下,一个节点会连接到Swarm主网。当使用私人或测试网络时,必须设置网络特定的引导节点。可以是多地址

  4. bootnode-mode:是否是引导节点模式

  5. cache-capacity:用于转发和上传块的磁盘空间的数量,以块为单位。

  6. clef-signer-enable:是否使用Ethereum的外部签名器Clef进行签名,由于Bee必须自动和快速地签署大量的交易,所以打包了一个Bee专用的Clef版本,即Bee-clef,它包括所有相关的配置,并实现了使Clef与Bee一起工作所需的特定配置。

  7. clef-signer-endpoint:系统clef的默认路径

  8. clef-signer-ethereum-address:默认选择索引为0的CLEF地址,如果你在Bee Clef中导入了多个键,使用这个命令可以指定使用哪个Bee Clef地址。

  9. config: 配置文件的路径

  10. cors-allowed-origins:API响应的域名或通配符,例如:cors-allowed-origins=”https://website.ethswarm.org“ 或 cors-allowed-origins=”*”

  11. data-dir: Bee在你的磁盘上存储数据的位置,这个目录中的数据将被要求用来恢复使用相同密钥的节点状态。这个目录包括:块数据(Chunk Data),状态数据(State Data),密钥库数据(Keystore Data)

    • 块数据:这包括你在本地存储的块和文件,你请求的缓存块或你负责为对等方提供服务的责任范围内的块
    • 状态数据:这是关于你的Bee节点的本地状态的信息,应该被备份起来。
    • 密钥库数据:这些文件包含了你的私钥的加密版本,应该被备份并保持隐私。
  12. db-block-cache-capacity: DB块缓存容量

  13. db-disable-seeks-compaction: 是否启用数据压缩

  14. db-open-files-limit: 文件读写频率限制(为了适应不那么强大的硬件和操作系统,open-files-limit被故意设置得很低,值越大,Bee读取和写入数据库的速度越快,它在转发和提供块的效率就越高,能获得gBZZ的概率就越大)

  15. db-write-buffer-size: DB写缓冲区大小

  16. debug-api-addr: Debug API提供http请求的IP和端口。省略地址中的IP部分将导致服务器监听所有请求。

  17. debug-api-enable: 是否启用debug api模式

  18. full-node: 是否是全节点模式,通过将其设置为”true”来启用,以完全参与服务和转发分块到网络。

  19. gateway-mode: 网关模式,将此设置为 “true”,以禁用API中的一些敏感功能,确保将你的api-addr暴露在公共互联网上是安全的。

  20. global-pinning-enable: 是否开启本地固定。本地固定可确保你自己的节点不会删除上传的文件,但是其他存储您数据的节点(因为它们属于其职责范围内)可能已删除了最近尚未访问的内容,以便腾出空间

  21. help: 是否启用帮助

  22. nat-addr: 设置公共IP,通常这是自动生成的,但在某些情况下,可能需要手动设置。

  23. network-id:接受新连接的网络ID。设置为1代表主网,2代表测试网。

  24. p2p-addr:监听p2p协议信息的ip和端口。

  25. p2p-quic-enable:是否启用p2p协议的QUIC协议

  26. p2p-ws-enable:是否启用web-sockets传输,用于p2p通信

  27. password: 用于解密Swarm身份密钥的密码

  28. password-file: 解密身份密钥的密码文件的路径。假设没有文件则为空字符串。

  29. payment-early: 当BZZ的金额小于设定的支付金额,Bee启动结算

  30. payment-threshold: 你期望从你的同伴那里得到的报酬金额

  31. payment-tolerance: 当超过设定的支付门槛的多余债务,断开与其他节点的连接。

  32. postage-stamp-address: 默认自动配置,以太坊区块链上邮票合约的地址,用于购买成批的邮票。

  33. resolver-options: ENS API端点包括合同地址,支持多个值。例如:eth:0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e@localhost:8545

  34. standalone: 如果想让节点不尝试连接到网络,就设置这个标志为true

  35. swap-deployment-gas-price: 合约交易服务费

  36. swap-enable: 是否启用交易

  37. swap-endpoint:以太坊区块链端点必须配置成websockets协议

  38. swap-factory-address:当前区块链ID的默认合约地址

  39. swap-initial-deposit: 交易初始存款

  40. tracing-enable: 发送追踪信息到追踪服务

  41. tracing-endpoint: 追踪服务监听Thrift协议UDP消息的URL

  42. tracing-service-name: 追踪服务中的服务标识符

  43. transaction: 交易哈希,从Bee节点的以太坊地址发送到Goerli网络上的任何以太坊交易的交易哈希

  44. verbosity: 节点输出信息 包括:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=trace

  45. welcome-message: 自定义欢迎信息,在成功连接时显示给对方的信息

如何搭建挖矿Bee节点

以下以windows平台为例。Linux平台可参考官方文档安装Bee

  1. 下载最新版本的bee-windows-amd64.exe程序包
  2. 进入bee程序包所在目录,运行命令行输入:bee.exe printconfig查看默认配置,把命令行输出的配置信息复制出来保存为bee.yaml文件
  3. 根据自己的需求修改默认配置相关参数,参数说明见上文:Bee配置信息解析

常见需要修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
clef-signer-enable: false  
data-dir: E:/.bee1635
swap-enable: true
swap-endpoint: https://goerli.infura.io/v3/c086e3b6e0d143f8bc206716b330678a
verbosity: trace
welcome-message: "BZZ BZZ BZZ"
debug-api-enable: true
swap-initial-deposit: "10000000000000000"
api-addr: :1650
p2p-addr: :1655
debug-api-addr: :1658
full-node: true
db-open-files-limit: "500"
nat-addr: "公网IP:1655"
  1. 注册swap-endpoint地址:https://infura.io,注册教程:https://www.bilibili.com/video/BV1EV411Y7yM (从第七分钟看),拿到Goerli的的swap-endpoint地址替换配置文件里的swap-endpoint地址

  2. 保存修改后的配置文件,在命令行中输入:bee-windows-amd64.exe start --config bee.yaml,此时是第一次运行bee需要输入密码和确认密码之后会看到一个让你转入代币的钱包地址

  3. 复制这个钱包地址,去官方的水龙头给这个地址注入代币
    6.1. 水龙头:加入官方discord:https://discord.gg/ykCupZMuww 在#faucet频道发送:/faucet sprinkle 你的地址

    6.2. https://faucet.ethswarm.org/ 官方水龙头测试币(不太稳定)

  4. 在区块链浏览就可以看到领到的gBzz:https://goerli.etherscan.io/address/你的钱包地址
    比特币浏览器

  5. 重新运行bee,看到以下状态证明运行成功
    运行状态

  6. 检查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

  1. http://localhost:1633/ 检测Bee节点是否启动成功
  2. http://localhost:1635/peers 查看连接的节点数
  3. http://localhost:1635/addresses 查看你的账本合约地址
  4. http://localhost:1635/chequebook/cheque 查询支票,lastreceived:null 表示还没收到支票
  5. http://localhost:1635/chequebook/balance 查询节点的当前余额
  6. http://localhost:1635/chequebook/balances 查寻对等余额
  7. http://localhost:1635/chequebook/cashout/你的钱包地址 发起提现(POST)
  8. http://localhost:1635/chequebook/cashout 查询提现状体
  9. http://localhost:1635/chequebook/withdraw\?amount\=1000 从chequebook合约提现到节点自己的钱包
  10. http://localhost:1635/chequebook/deposit\?amount\=1000 向支票簿合约转账

参考文献

Swarm Bee官方文档
SWARM(BZZ)到底挖了个啥
Swarm的挖矿是怎么运行的
LevelDB库简介
科普:QUIC协议原理分析

拓展知识

1
2
3
4
5
6
7
8
9
10
1. p2p网络即对等网络,是一种网络的参与者共享他们所拥有的一部分硬件资源,这些共享资源通过网络提供服务和内容,能被其它对等节点(Peer)直接访问而无需经过中间实体,此网络中的参与者既是资源、服务和内容的提供者,又是资源、服务和内容的获取者

2. Dapp:去中心化的应用程序,是在P2P网络上而非在一台独立的计算机中运行的应用程序。
传统的Web应用程序使用HTML,CSS和Javascript来呈现页面。它还需要利用API从数据库中获取相关信息。当你访问一个网页时,该页面通过调用相关API来获取你的个人数据并将其显示在页面上。传统网站:前端→API→数据库
DApps类似于传统的Web应用程序。前端使用完全相同的技术来渲染页面。一个关键的区别是,不是连接到数据库的API,而是通过智能合约连接到区块链。DApp的网站:前端→智能合约→区块链

3. LevelDB:Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写很多的场景。

4. QUIC:是Quick UDP Internet Connections的缩写,QUIC协议的主要目的,是为了整合TCP协议的可靠性和UDP协议的速度和效率。

HTTPS及QUIC建连过程如图所示
HTTPS及QUIC建连过程如图所示

1
2
3
4
5
6
相比现在广泛应用的 http2+tcp+tls 协议有如下优势:
1. 减少了 TCP 三次握手及 TLS 握手时间。
2. 改进的拥塞控制。
3. 避免队头阻塞的多路复用。
4. 连接迁移。
5. 前向冗余纠错。

QUIC协议的优势
QUIC协议的优势

1
2
3
4
QUIC的缺点
1. 小地方,路由封杀UDP 443端口( 这正是QUIC 部署的端口);
2. UDP包过多,由于QS限定,会被服务商误认为是攻击,UDP包被丢弃;
3. 无论是路由器还是防火墙目前对QUIC都还没有做好准备。