前言
Swarm是以太坊推出的官方存储和通信系统,旨在为DAPP代码、用户数据、区块链和状态数据以及不可追踪通信的底层结构提供去中心化和冗余的存储。内置的激励系统通过以太坊区块链上的智能合约实现。
Swarm是一个分布式存储平台和内容分发服务,是以太坊Web3.0栈的本地基础层服务。据报道,该项目是由ETHunm基金会投资和开发的,而协议标签BZZ是由V神亲自编写的。它允许矿井池的存储、带宽和计算资源支持EUTUM项目网络的应用。
一、部署环境
本机系统:Windows11
虚拟机系统(部署系统环境):CentOS7
语言:go1.18
二、部署流程
1.安装go语言
wget https://golang.google.cn/dl/go1.18.3.linux-amd64.tar.gz
#下载go语言压缩包
tar -xzvf go1.18.3.linux-amd64.tar.gz -C /usr/local
#解压go至目标目录
sudo vi ~/.bashrc
#配置go语言环境
export GOROOT=/usr/local/go
export GOPATH=~/code
export PATH=$PATH:$GOPATH:$ GOROOT/bin
source ~/.bashrc
go version
如下则安装成功:
[maser@master ~]$ go version
go version go1.18.3 linux/amd64
安装geth和swarm
go install github.com/ethereum/go-ethereum/cmd/geth@latest
go install github.com/ethersphere/swarm/tree/master/cmd/swarm@latest
go install可能遇到的问题:连接超时(time out)
解决方法1:go env -w GOPROXY=https://goproxy.cn
通过更换国内代理网址解决。
解决方法2:使用git获得包配置路径
sudo yum -y install git
cd /usr/local
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum/
安装gcc编译器make
yum -y install gcc automake autoconf libtool make
#安装gcc
yum install gcc gcc-c++
#安装g++
sudo make all
sudo vi /etc/profile
export PATH=$PATH:/usr/local/go-ethereum/build/bin
source /etc/profile
安装完成如下:
[master@master ~]$ geth version
Geth
Version: 1.10.21-unstable
同样方法安装swarm,安装成功如下:
[master@master ~]$ swarm version
Swarm
Version: 0.5.8-unstable
如果在sudo命令后发现环境不存在是因为sudo指令默认将环境还原,可以通过如下方法解决:
解决方法1:sudo -E后再执行命令。
解决方法2:使用sudo visudo将Defaults env_reset改为 Defaults !env_reset。
2.swarm本地部署
$ geth account new
#生成新的geth账户
Your new key was generated
Public address of the key: 0x02229B0956dCc50e02B7F969CCCd3811bE1777ba
#以上为生成的新公钥
export BZZKEY=02229B0956dCc50e02B7F969CCCd3811bE1777ba
#将公钥导入为BZZKEY
$ swarm --bzzaccount $BZZKEY
#用刚才生成的账户作为swarm账户
Unlocking swarm account 0x02229B0956dCc50e02B7F969CCCd3811bE1777ba [1/3]
Passphrase:
WARN [06-12|13:11:41] Starting Swarm service
#可以观察到Swarm服务进程已经启动,端口默认为8500,此时可以在本地“127.0.0.1:8500”看到swarm管理界面
三、文件上传与下载
创建upload.go文件
package main
import (
"fmt"
"log"
bzzclient "github.com/ethersphere/swarm/tree/master/api/client" #导入swarm中client包
)
func main() {
client := bzzclient.NewClient("http://127.0.0.1:8500")#声明新client为bzzclient地址为127.0.0.1:8500
file, err := bzzclient.Open("csdnbolg.txt")
if err != nil {
log.Fatal(err)
}
manifestHash, err := client.Upload(file, "", false)
if err != nil {
log.Fatal(err)
}
fmt.Println(manifestHash)#将打印返回文件哈希值,以便swarm网络中点对点查询下载
}
该go文件目录下:
sudo go run upload.go
manifestHash := “4c57d2f9f3974eca3072f8194176844c74a023ae8adeca02f13f9e01764fea32”
创建download.go
package main
import (
"fmt"
"io/ioutil"
"log"
bzzclient "github.com/ethersphere/swarm/tree/master/api/client"
)
func main() {
client := bzzclient.NewClient("http://127.0.0.1:8500")
manifestHash := "4c57d2f9f3974eca3072f8194176844c74a023ae8adeca02f13f9e01764fea32"
manifest, isEncrypted, err := client.DownloadManifest(manifestHash)
if err != nil {
log.Fatal(err)
}
fmt.Println(isEncrypted)
for _, entry := range manifest.Entries {
fmt.Println(entry.Hash)
fmt.Println(entry.ContentType)
fmt.Println(entry.Size)
fmt.Println(entry.Path)
}
file, err := client.Download(manifestHash, "")
if err != nil {
log.Fatal(err)
}
content, err := ioutil.ReadAll(file)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(content)) // 返回文本内容
}
总结
可以观察到能够返回文本内容,说明存储到本地swarm服务器中并可以通过内容清单哈希值检索服务器中文件并下载。