分类 技术前沿 下的文章 - 六币之门
首页
视频教程
网站导航
活动日历
关于我们
用户投稿
推荐
新闻动态
搜 索
1
融资周报 | 公开融资事件11起;加密技术公司Toposware完成500万美元融资,Polygon联创参投
107 阅读
2
六币日报 | 九只比特币ETF在6天内积累了9.5万枚BTC;贝莱德决定停止推出XRP现货ETF计划
73 阅读
3
六币日报 | 美国SEC再次推迟对灰度以太坊期货ETF做出决定;Do Kwon已出黑山监狱等待引渡
68 阅读
4
融资周报 | 公开融资事件27起;L1区块链Monad Labs完成2.25亿美元融资,Paradigm领投
68 阅读
5
【ETH钱包开发06】查询某个地址的交易记录
43 阅读
新闻动态
每日快报
一周精选
融资情况
项目投研
自治组织
数字藏品
去中心化应用
去中心化游戏
去中心化社交
去中心化金融
区块链交易所
科普知识
小白入门
用户手册
开发文档
行业报告
技术前沿
登录
搜 索
标签搜索
新闻
日报
元歌Eden
累计撰写
1,087
篇文章
累计收到
0
条评论
首页
栏目
新闻动态
每日快报
一周精选
融资情况
项目投研
自治组织
数字藏品
去中心化应用
去中心化游戏
去中心化社交
去中心化金融
区块链交易所
科普知识
小白入门
用户手册
开发文档
行业报告
技术前沿
页面
视频教程
网站导航
活动日历
关于我们
用户投稿
推荐
新闻动态
用户登录
登录
找到
109
篇与
技术前沿
相关的结果
2023-03-06
基于Debian搭建Hyperledger Fabric 2.4开发环境及运行简单案例
相关实验源码已上传:wefantasy/FabricLearn: 本项目虚拟了一个工作室联盟链需求并将逐步实现,致力于提供一个易理解、可复现的Fabric学习项目,其中项目部署步骤的各个环节都清晰可见,并且将所有实验打包为脚本使之能够被快速复现在任何一台主机上 (github.com)前言在基于truffle框架实现以太坊公开拍卖智能合约中我们已经实现了以太坊智能合约的编写及部署,但其工作方式注定其只能应用于有限的业务场景中。相比之下,基于超级账本的Fabric具有高可扩展性和高可定制性,能够应用在更为复杂的商业场景中,但Fabric技术涉及很多新的概念,源代码跟新速度快且各版本间兼容性差,对初学者很不友好。为了使能够快速掌握Fabric,本文基于其目前最新的2.4版本搭建了一套区块链运行环境,并在此之上部署了官方示例chaincode并对其进行交互调试,最终整个环境及示例代码能够正常运行且得出预期结果。环境搭建网上几乎所有的Fabric教程都是基于Ubuntu环境而不是Windows,其原因主要是Fabric的运行需要的Docker环境在Windows下表现不佳,此外Fabric许多官方文档也是基于Ubuntu纂写,在windows下运行可能会遇到难以预估的bug。原本为了方便后期部署至公网服务器想在CentOS上搭建环境,但由于CentOS8停止维护,且CentOS Stream使用体验颇差,于是最终选择了Debian系统。本环境各系统、软件版本如下:系统、软件版本VMware Pro16.0.0Debiandebian-11.2.0-amd64-DVD-1.isogit2.30.2curl7.74.0docker20.10golanggo1.17.8jqjq-1.6fabric2.4.0fabric-ca1.5.2fabric-samplesv2.3.0本环境各Docker镜像版本如下:镜像版本hyperledger/fabric-tools2.4hyperledger/fabric-peer2.4hyperledger/fabric-orderer2.4hyperledger/fabric-ccenv2.4hyperledger/fabric-baseos2.4hyperledger/fabric-ca1.5警告:建议Fabric所有实验过程皆在root权限下进行,否则在sudo权限切换的过程中会出现很多环境变量的问题。杂项安装安装最新版本Git apt install git 复制代码 安装最新版本cURL apt install curl 复制代码 安装Golang 安装jq apt install jq 复制代码 安装Fabric官方脚本安装为了帮助开发者快速搭建Fabric环境,官方创建了一个Fabric环境搭建的批处理工具bootstrap.sh,可以通过该工具直接安装环境:wget https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh chmod +x bootstrap.sh ./bootstrap.sh 复制代码不出意外的话会看见脚本顺利的环境安装过程:手动安装当然,直接使用官方脚本不出意外的话肯定会出意外(网络原因),在此我们可以通过手动安装需要的各项环境。安装fabric-samplesfabric-samples是Fabric的官方Demo集合,其内部包含多个示例,每个示例有Golang、JavaScript、typescript、Java的链码实现,并且这些链码可以直接部署到对应的Fabric上,对初学者很有帮助。fabric-samples安装非常简单,使用git clone git@github.com:hyperledger/fabric-samples.git将项目源码克隆到本地即可,若一直失败也可以直接在release中下载对应版本的压缩包。 安装Fabric Fabric是联盟链的核心开发工具,包含了我们开发、编译、部署过程中的所有命令。 下载fabric 2.4.0并解压 wget https://github.com/hyperledger/fabric/releases/download/v2.4.0/hyperledger-fabric-linux-amd64-2.4.0.tar.gz mkdir /usr/local/fabric tar -xzvf hyperledger-fabric-linux-amd64-2.3.2.tar.gz -C /usr/local/fabric 复制代码下载fabric-ca 1.5.2并解压 wget https://github.com/hyperledger/fabric-ca/releases/download/v1.5.2/hyperledger-fabric-ca-linux-amd64-1.5.2.tar.gz tar -xzvf hyperledger-fabric-ca-linux-amd64-1.5.2.tar.gz mv bin/* /usr/local/fabric/bin 复制代码设置环境变量,在/etc/profile末尾添加 #Fabric export FABRIC=/usr/local/fabric export PATH=$PATH:$FABRIC/bin 复制代码更新环境变量source /etc/profile 安装Docker如果存在则移除旧的版本 apt remove docker docker-engine docker.io containerd runc 复制代码更新apt索引包并允许其使用HTTPS安装 apt update apt install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release 复制代码添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 复制代码添加Docker仓库 echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null 复制代码安装Docker引擎 apt update apt install docker-ce docker-ce-cli containerd.io 复制代码安装docker-compose apt install docker-compose 复制代码安装Docker镜像依赖Fabric相关镜像均可以在DockerHub官方镜像网站进行下载,搜索需要的镜像则可获取安装方法,本试验用到的所有镜像为:docker pull hyperledger/fabric-tools:2.4 docker pull hyperledger/fabric-peer:2.4 docker pull hyperledger/fabric-orderer:2.4 docker pull hyperledger/fabric-ccenv:2.4 docker pull hyperledger/fabric-baseos:2.4 docker pull hyperledger/fabric-ca:1.5 复制代码使用docker images命令查看安装完成后镜像:hyperledger/fabric-tools 2.4 625237d887db 4 weeks ago 473MB hyperledger/fabric-peer 2.4 ee643d889779 4 weeks ago 62.3MB hyperledger/fabric-orderer 2.4 df64446ac2df 4 weeks ago 37.3MB hyperledger/fabric-ccenv 2.4 da4f00cb576a 4 weeks ago 517MB hyperledger/fabric-baseos 2.4 0287ebf8aaf3 4 weeks ago 6.94MB hyperledger/fabric-ca 1.5 4ea287b75c63 6 months ago 69.8MB 复制代码示例代码中使用的镜像标签都为latest,但如果在pull时直接选择latest可能会报错,因此我们在上面镜像拉取完成后手动使用以下命令为镜像打上latest标签:#docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签) docker tag 625237d887db hyperledger/fabric-tools:latest docker tag ee643d889779 hyperledger/fabric-peer:latest docker tag df64446ac2df hyperledger/fabric-orderer:latest docker tag da4f00cb576a hyperledger/fabric-ccenv:latest docker tag 0287ebf8aaf3 hyperledger/fabric-baseos:latest docker tag 4ea287b75c63 hyperledger/fabric-ca:latest 复制代码最终的镜像为:运行测试启动fabric网络进入fabric-sample的test-network目录 cd fabric-samples/test-network 复制代码运行./network.sh up 启动网络 Creating network "fabric_test" with the default driver Creating volume "docker_orderer.example.com" with default driver Creating volume "docker_peer0.org1.example.com" with default driver Creating volume "docker_peer0.org2.example.com" with default driver Creating peer0.org1.example.com ... done Creating orderer.example.com ... done Creating peer0.org2.example.com ... done Creating cli ... done CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7738c1e84751 hyperledger/fabric-tools:latest "/bin/bash" Less than a second ago Up Less than a second cli 1f24de2c6cd5 hyperledger/fabric-peer:latest "peer node start" 2 seconds ago Up Less than a second 0.0.0.0:9051->9051/tcp, :::9051->9051/tcp, 0.0.0.0:19051->19051/tcp, :::19051->19051/tcp peer0.org2.example.com bfc48b20360c hyperledger/fabric-orderer:latest "orderer" 2 seconds ago Up Less than a second 0.0.0.0:7050->7050/tcp, :::7050->7050/tcp, 0.0.0.0:7053->7053/tcp, :::7053->7053/tcp, 0.0.0.0:17050->17050/tcp, :::17050->17050/tcp orderer.example.com b9a61fdaf47a hyperledger/fabric-peer:latest "peer node start" 2 seconds ago Up Less than a second 0.0.0.0:7051->7051/tcp, :::7051->7051/tcp, 0.0.0.0:17051->17051/tcp, :::17051->17051/tcp peer0.org1.example.com 复制代码最终出现以上输出日志则表示网络启动成功,每个加入Fabric网络的Node和User都需要隶属于某个组织,以上网络中包含了两个平行组织————peer0.org1.example.com和peer0.org2.example.com,它还包括一个作为ordering service维护网络的orderer.example.com。创建channel上节已经在机器上运行了peer节点和orderer节点,现在可以使用network.sh为Org1和Org2之间创建channel。channel是特定网络成员之间的私有通道,只能被属于该通道的组织使用,并且对网络的其他成员是不可见的。每个channel都有一个单独的区块链账本,属于该通道的组织可以让其下peer加入该通道,以让peer能够存储channel上的帐本并验证账本上的交易。 使用以下命令创建自定义通道testchannel:./network.sh createChannel -c testchannel 复制代码部署chaincode建议部署操作全部在root账户下进行,否则可能发生未知错误,以下流程为笔者在非root用户下所遇问题,最终重建虚拟机全部指令在root账户下才完成部署。创建通道后,您可以开始使用智能合约与通道账本交互。智能合约包含管理区块链账本上资产的业务逻辑,由成员运行的应用程序网络可以在账本上调用智能合约创建,更改和转让这些资产。可以通过./network.sh deployCC命令部署智能合约,但本过程可能会出现很多问题。使用以下命令部署chaincode:./network.sh deployCC -c testchannel -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go 复制代码此命令执行后可能会出现错误:scripts/deployCC.sh: line 114: log.txt: Permission denied,很明显这是权限不足所致,加上sudo试试:./network.sh deployCC -c testchannel -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go 复制代码加上sudo后出现新的错误:deployCC.sh: line 59: go: command not found。检查本用户go命令可用,检查root用户go命令可用,单单sudo后不能用。查阅资料后发现这是因为linux系统为了安全,限制在使用sudo时会清空自定义的环境变量,最简单的解决方法是在/etc/sudoers文件中直接将该限制注释1: 加上注释后重新执行上条命令,又出现了新的错误:go: github.com/golang/protobuf@v1.3.2: Get "https://proxy.golang.org/github.com/golang/protobuf/@v/v1.3.2.mod": dial tcp 172.217.160.81:443: i/o timeout 复制代码很明显这是因为本地网络无法访问proxy.golang.org所致,在命令行输入go env -w GO111MODULE=on && go env -w GOPROXY=https://goproxy.cn,direct命令配置国内代理2后再次执行。令人意外的是错误不变,设置的代理没有生效?手动使用go get github.com/golang/protobuf手动下载安装后再次运行错误还是不变,此时检查本地GOPATH目录下已有github.com/golang/protobuf包,为什么没有识别到?此时灵机一动,使用go env查看GOPATH环境变量,发现与本地用户不一致,原来sudo命令会使用root的go环境变量,而之前设置的代理、下载的包都只能在本地用户下生效,因此这个问题最终的解决方案是直接切换到root用户下重新配置go代理并运行。成功运行后可看见如下结果:2021-08-15 00:45:54.064 PDT [chaincodeCmd] ClientWait -> INFO 001 txid [ebeb8df6904f45b81fb30714f7eecb30b4bbfd32f4acc809f34f7c660e396eb8] committed with status (VALID) at localhost:7051 2021-08-15 00:45:54.144 PDT [chaincodeCmd] ClientWait -> INFO 002 txid [ebeb8df6904f45b81fb30714f7eecb30b4bbfd32f4acc809f34f7c660e396eb8] committed with status (VALID) at localhost:9051 Chaincode definition committed on channel 'testchannel' Using organization 1 Querying chaincode definition on peer0.org1 on channel 'testchannel'... Attempting to Query committed status on peer0.org1, Retry after 3 seconds. + peer lifecycle chaincode querycommitted --channelID testchannel --name basic + res=0 Committed chaincode definition for chaincode 'basic' on channel 'testchannel': Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true] Query chaincode definition successful on peer0.org1 on channel 'testchannel' Using organization 2 Querying chaincode definition on peer0.org2 on channel 'testchannel'... Attempting to Query committed status on peer0.org2, Retry after 3 seconds. + peer lifecycle chaincode querycommitted --channelID testchannel --name basic + res=0 Committed chaincode definition for chaincode 'basic' on channel 'testchannel': Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true] Query chaincode definition successful on peer0.org2 on channel 'testchannel' Chaincode initialization is not required 复制代码合约交互在安装fabric中我们已经设置了fabric可执行文件的环境变量,需保证可以成功在test-network目录下使用peer命令。设置FABRIC_CFG_PATH变量,其下需包含core.yaml文件 export FABRIC_CFG_PATH=$PWD/../config/ #export FABRIC_CFG_PATH=/usr/local/fabric/config/ 复制代码设置其它Org1组织的变量依赖 #Environment variables for Org1 #CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH环境变量指向Org1的organizations文件夹中的身份证书。 export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=$/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=$/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=localhost:7051 复制代码初始化chaincode peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C testchannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles $/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles $/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '' 复制代码4. 查询账本资产列表peer chaincode query -C testchannel -n basic -c '' 复制代码5. 修改账本资产peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C testchannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles $/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles $/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '' 复制代码6. 关闭网络./network.sh down 复制代码该命令将停止并删除节点和链码容器、组织加密材料、删除之前运行的通道项目和docker卷,并从Docker Registry移除链码镜像。因为asset-transfer (basic)链码的背书策略需要交易同时被Org1和Org2签名,所以链码调用指令需要使用--peerAddresses标签来指向peer0.org1.example.com和peer0.org2.example.com;因为网络的TLS被开启,指令也需要用--tlsRootCertFiles标签指向每个peer节点的TLS证书。参考Footnotesqq_JWang_03215367. 解决command not found 报错. 慕课. [2018-07-31] ↩ 沐沐子枫. failed to normalize chaincode path: 'go list' failed with: go. 博客园. [2020-11-27] ↩
2023年03月06日
7 阅读
0 评论
0 点赞
2023-03-06
使用Remix入门Solidity智能合约(一)
PS. 才疏学浅,欢迎交流指正。Remix介绍Remix:remix.ethereum.org/Remix是一个可以编写、调试、部署智能合约的在线工具。下面我们将使用Remix编写Solidity智能合约。第一个智能合约进入Remix,删除自带的所有文件和文件夹。创建一个contracts文件夹,在其中创建文件SimpleStorage.sol。sol文件首先需要指定代码使用协议,这里我们使用限制较少的MIT协议。// SPDX-License-Identifier: MIT 复制代码接着需要指定Solidity版本,这里我们使用此时较为稳定的0.8.7版本。// SPDX-License-Identifier: MIT pragma solidity 0.8.7; 复制代码Solidity版本有多种指定方式,例如可以使用pragma solidity ^0.8.7;指定0.8.7或以上的版本。可以使用pragma solidity >=0.8.7 <0.9.0;指定0.8.7或以上、0.9.0以下的版本。此时可以点击Compile按钮编译合约,编译前编译器版本会自动更改为符合代码中指定的版本。因为此时文件中没有实际的合约代码,因此会提示No Contract Compiled Yet,但只要侧边栏上的SOLIDITY COMPILER按钮上有勾,那么编译就是成功的。下面编写合约代码。// SPDX-License-Identifier: MIT pragma solidity 0.8.7; contract SimpleStorage { } 复制代码其中contract关键字表示后面的代码是合约代码。此时的合约文件中就已经包含一个有效的合约了,编译成功后侧边栏中也会出现新的合约相关的选项。基础数据类型bool即boolean类型,值为true或falseuint无符号整数。无符号的意思是只会是可正可负的,只会是正数。可以通过使用不同的uint关键字给uint类型的值分配空间,如uint8表示给该uint值分配8个bit。使用unit关键字不指明分配的空间时,效果等同于使用uint256,分配256bit。给uint类型指定空间需要按照8的倍数,即以bytes(8个bits)为单位,如:uint8,uint16,uint32等,最多为uint256。如果声明uint类型的变量,但是不赋值,如uint256 defaultUint;则该变量会被赋值为0。int(带符号)整数,可正可负。int类型和uint类型一样可以指定分配的空间。address地址类型,可以用来表示钱包地址。bytesbytes最多分配为bytes32。bytes等同于bytes32。string字符串类型。本质上是bytes类型,可以自动转化为bytes类型,比如可以给bytes类型的变量赋值字符串。关于类型的更多的知识可以去看solidity的官方文档。下面尝试定义上述类型的变量// SPDX-License-Identifier: MIT pragma solidity 0.8.7; contract SimpleStorage { bool hasFavoriteNumber = true; uint256 defaultUint; uint256 favoriteNumber = 5; string favoriteNumberInText = "Five"; int256 favoriteInt = -5; bytes32 favoriteBytes = "cat"; } 复制代码尝试编译,成功则表明代码中定义的变量都符合要求。函数Remix VM是本地测试用的区块链,可以快速模拟交易,不需要等待。Remix还提供了大量本地测试用的账户,初始时里面都有100Ether的测试币。将SimpleStorage.sol中的合约代码修改如下后,我们将部署这个合约。// SPDX-License-Identifier: MIT pragma solidity 0.8.7; contract SimpleStorage { uint256 favoriteNumber; function store (uint256 _favoriteNumber) public { favoriteNumber = _favoriteNumber; } } 复制代码这里可选择要部署的合约文件。点击Deploy按钮后,如果部署成功,可以在下图所示位置看到部署好的合约,其中红框部分是合约的地址。部署成功后,我们还可以在底栏看到部署相关的信息。点击可以查看更多部署详情。在部署详情中我们可以看到有交易哈希(transaction hash)、发送方(from)、燃料费(gas)等,这是因为部署一个合约实际上就是发送一个交易,在区块链上修改任何数据都是在发送交易。下图中的红框部分为部署好的合约中的方法,可以在这里调用合约方法。输入任意一个数字并点击按钮后,就调用了store合约方法,这次调用改变了合约中的favoriteNumber变量的值,前面说过只要修改区块链上的数据就是在发送交易,因此发起调用后我们可以在侧栏看到交易的详情。为了查看favoriteNumber变量的值,我们需要给favoriteNumber加上public关键字。// SPDX-License-Identifier: MIT pragma solidity 0.8.7; contract SimpleStorage { uint256 public favoriteNumber; function store (uint256 _favoriteNumber) public { favoriteNumber = _favoriteNumber; } } 复制代码我们可以重新部署合约来查看上面改动的效果。在部署之前,为了方便观察,我们可以点击Deployed Contract旁边的删除按钮删除前面部署好的合约。只是界面上删除。区块链的数据不能被删除。但这只是在本地测试区块链上,不可删除只是一定程度上。再次部署成功后侧边栏多了变量名按钮。点击后会出现该变量当前值,此时值为默认值0。调用store方法后,再次点击按钮查看,可以看到变量的值已被修改。可见性变量的可见性变量的可见性默认为internal可见性为public的变量和internal变量的区别在于编译器会为前者自动创建getter方法,其它合约可以通过getter方法读取这些public变量的值。这个我们在前面已经看到了效果。函数的可见性现在我们只需要知道view函数只能读取数据就好了。下面我们尝试添加view函数retrieve,代码如下:// SPDX-License-Identifier: MIT pragma solidity 0.8.7; contract SimpleStorage { uint256 public favoriteNumber; function store (uint256 _favoriteNumber) public { favoriteNumber = _favoriteNumber; } function retrieve() public view returns(uint256){ return favoriteNumber; } } 复制代码调用改变状态的函数和读取状态的函数的日志有不同。改变状态的方法的日志会有勾图标和交易哈希,如下图:2-5 数组和结构体定义结构体使用Struct关键字定义结构体。如下:struct People { uint256 favoriteNumber; string name; } 复制代码使用结构体struct People { uint256 favoriteNumber; string name; } People public person = People(); 复制代码效果部署成功之后可以看到person的getter方法,点击Person按钮后可以看到结构体中的数据,如下图:声明数组People[] public people; 复制代码部署成功后出现people的getter按钮,按钮旁边有一个输入框。如下图:按钮旁边的输入框是用来输入数组索引的,由于目前People数组为空数组,因此输入索引也看不到效果。数组大小这个数组的大小是动态的,可以容纳动态数量的元素,我们也可以在中括号中指明数组的大小,如下:People[3] public people; 复制代码这个数组就只能容纳3个元素。不过下面我们依然使用动态大小的People数组。在进入下一环节前,我们先把favoriteNumber变量的public关键字去掉,因为我们已经有了retrive方法可以获取favoriteNumber的值了。此时的完整代码如下:// SPDX-License-Identifier: MIT pragma solidity 0.8.7; contract SimpleStorage { uint256 favoriteNumber; function store(uint256 _favoriteNumber) public { favoriteNumber = _favoriteNumber; } function retrieve() public view returns (uint256) { return favoriteNumber; } struct People { uint256 favoriteNumber; string name; } People[] public people; } 复制代码向数组添加元素定义addPerson方法,如下:function addPerson(string memory _name, uint256 _favoriteNumber) public{ People memory newPerson = People({ favoriteNumber: _favoriteNumber, name: _name }); people.push(newPerson); } 复制代码部署成功后侧边栏出现addPerson方法的按钮,如下图:在addPerson按钮右边的输入框中输入数据,并点击按钮调用addPerson方法向people中添加元素,如下图。如果调用成功,则此时我们已经在people数组中添加了第一个元素。在People按钮右边的输入框中输入0,并点击按钮,我们就可以看到数组已经有了刚刚添加的数据,如下图:定义结构体变量的简单写法可以不用花括号,直接按照键在结构体中的顺序传入参数定义结构体变量,效果是一样的,代码如下。People memory newPerson = People(_favoriteNumber, _name); 复制代码在此之上,我们可以更进一步地简化代码,将构造结构体变量的代码直接作为下一步的参数。代码如下:function addPerson(string memory _name, uint256 _favoriteNumber) public { people.push(People(_favoriteNumber, _name)); } 复制代码错误和警告错误尝试把下图所指位置的分号删掉,左侧行号位置会出现红色感叹号。鼠标放到红色感叹号上可以看到如下图的错误信息,告诉我们缺了分号。把分号加回去后重新编译,错误就消失了。警告尝试把第一行的代码使用协议的声明去掉,左侧行号位置会出现黄色感叹号,侧边栏的编译器按钮也会出现黄色标签,如下图。鼠标放到黄色感叹号上可以看到警告信息,如下图。上面的警告信息告诉我们需要添加SPDX许可证,把删掉的代码恢复,再重新编译,警告就消失了。警告不会阻止代码的编译,但最好还是尽可能的消除警告。映射类型下面使用mapping类型构造一个将name映射到favoriteNumber的变量。mapping(string => uint256) public nameToFavoriteNumber; 复制代码在addPerson方法中添加给nameToFavoriteNumber赋值的功能,代码如下:function addPerson(string memory _name, uint256 _favoriteNumber) public { people.push(People(_favoriteNumber, _name)); nameToFavoriteNumber[_name] = _favoriteNumber; } 复制代码部署成功后左边会出现nameToFavoriteNumber按钮,如图:mapping的value默认值是0,在对mapping变量赋值前从中取值都会得到0,如图:调用addPerson方法时,会对nameToFavoriteNumber变量进行赋值。调用后就可以从nameToFavorite变量中取出值了,如图:部署合约到链上切换环境,如图:随后会弹出MetaMask弹出,选择想要用来进行部署到钱包账户,并将MetaMask连接的链切换为Goerli,效果如图:点击左侧的Deploy按钮,在MetaMask中确认交易,然后就会开始部署合约到链上。等到底栏出现带绿色勾的记录,就说明合约部署成功,可以点击view on etherscan查看部署合约这笔交易的信息。这是左边的Deployed Contracts里的就是刚刚部署到链上的合约了,下面我们尝试在这里与部署好的合约进行交互。在store按钮右边的输入框输入要保存的数字,和前面与本地环境中的合约交互不同,这时会唤起钱包,因为这是个改变链上数据的方法,需要支付gas才能调用。调用成功后,点击retrieve按钮,就能看到刚刚保存到合约里的数字了。
2023年03月06日
5 阅读
0 评论
0 点赞
2023-03-06
Web3.0你究竟了解多少
当前Web3.0热度空前高涨,不难免面试官会借此来考察你对前端发展的敏锐度与洞察力。刚好最近DevUI组内做了一期关于Web 3.0 的精致分享,负责团队掘金账号运营的同事说让我帮忙把分享的内容写成一篇文章。我的内心其实是有些拒绝的,对于那些只要花时间去做就能完成的事情来说,我总是缺乏一些耐心。不过很快,我就想到了Kagol 的那篇文章,把时间沉淀到自己的热爱里 | Kagol 的 2022 开源年终总结,想到了那句十分触动我的话,“虽然时间是无形的,看不见、摸不着,也无法贮存,但却可以通过有形的东西沉淀下来。当你花时间写完一篇文章,时间就沉淀到文字中……”。所以还是在元旦三天假期中,抽出点时间来,把这篇文章整理了一下,希望大家阅后能稍微有一点收获。 从Web 1.0到Web 3.0Web 1.0 阶段可以概括为PGC(Professionally Generated Content),即专业生产内容,主要就是像搜狐、网易、新浪这样的门户网站,用户一般只能在这里获取信息,没有办法发布信息,所以这个阶段用一个词描述,就是“你写我看”。到了Web 2.0 时代,用户可以产生大量的内容,就进入了UGC(User Generated Content)的时代,比如微博、微信、抖音。我们可以在上面发布消息、感悟,发文字、发视频等。也用一个词来描述,就是“你写我看,我写你赞”。作为互联网的原住民,这些工具几乎已经成为了我们身体的一部分,我们每天早晨醒来后的第一件事情,和睡前的最后一件事情,都是在跟这些工具打交道。Web 2.0 的阶段存在很多问题。一方面,我们针对每一个平台都需要注册一个账号,所以我们大概每个人都在类似于印象笔记的工具中有一个专门的文档,记录各个网站的账号密码。另外,我们的行为数据都在平台那里,所以平台会对我们针对性地推送广告,而且可能效果很好。拥有大量的数据,平台就会进行垄断,或者存在隐私泄露的风险。比如2021 年4 月份Facebook 上超过5 亿的用户数据被泄露,包括电话号码、电子邮件等信息。所以对监管机构强依赖,得有人看着他们,你们要做这个,不能做那个,如果做了错事就需要受到惩罚。到了Web 3.0 时代,一切都会发生很大的变化,这个阶段我们暂时没办法用一个统一的词汇来描述它,所以我们需要用很多词汇,比如DAO、NFT、DeFi 等…... Web 3.0相比于Web 2.0有很多优势,包括一个账号、不看广告、没有隐私泄露问题等等。那这么多好的特性,是怎么做到的呢?咱们接着往下看。区块链Web 3.0 底层的技术就是区块链,17年我还在学校读书的时候,身边的人都在聊区块链,在搞各种币。当时有个朋友拷贝了一份代码,自己发行了一种币,给我分了好多,但是我那会申请的钱包地址找不到了,所以里面的币也都丢了。说回区块链,如果要用一句话来描述它,那就是“一串分布式的,包含人人可验证的、不可篡改的、永久存储的交易信息的区块按照时间顺序有序连接成的链表结构。“这句话里面的关键词,我们拆开一个个来讲。首先,它是一个记录交易信息(账本数据)的链表,信息存在于链表上的若干区块中。然后这个链表是分布式的,也就是说,很多设备都存储了这个链表信息。每一个存储这个信息的设备叫节点。节点分为全节点和轻节点,全节点维护的是完整的全量的账本数据,而轻节点维护的是一个和自身相关的状态数据库。全节点会作为区块链的参与方,参与交易背书,而轻节点不承载背书功能,仅同步相关状态数据,实现隐私数据隔离和快速访问。POW与币为了保证链上的信息不可篡改和链表发展的稳定性,每一个区块上链必须要付出一定的成本,也就是POW(Proof of Work),即工作量证明。具体要做的事情就是对上一个区块的区块头进行某种运算,得到一个目标值,即出块成功。这个过程消耗的算力非常大,耗电,但是没有其他作用。但是一旦你生成了这个区块,你就能促进这个链生长,就给为有信息存储需要的人提供了物质条件,所以你就可以得到“币”作为奖励。不同的链对应不同的币,比如我们常见的比特币,以太坊,狗狗币等,他们都是不同的链衍生出来的。以比特币为例,比特币发明最初时每生成一个区块可以拿到 50 个比特币的奖励, 比特币以一个确定的但不断衰减的速率被挖出来,所以2016 年时生成一个区块可以获得 12.5 个比特币,到2040 年,达到总数接近 2100 万个比特币,在那之后新的区块不再包含比特币奖励,矿工的收益全部来自交易费。因为挖到的币价格很高,所以很多人会在电力便宜的地方,租用大量机器“挖矿”。2021年比特币的价格达到60000美元的时候,中国的比特币开采量一度占到全球总量的三分之二。(图片来自:Web3.0是未来,还是骗局?区块链/DeFi/NFT/GameFi...)分布式 + 工作量证明的机制保证了数据的不可篡改和永久存储,但是基于POW 的共识机制对于能源的损耗是很大的,所以也存在其他类型的共识机制,比如POS(Proof of Stake,权益证明)、POH(Proof of History,历史证明)等。其他类型的共识机制不再展开,有兴趣的可以参考以太坊的文档:权益证明机制(POS)智能合约一个简化的区块中主要包含三项信息:作为POW 的随机数、上一个区块的hash 值,以及存储的交易信息。所以一个典型的区块链大概像下面这样: 目前区块链可以简单划分为两个版本,第一个版本就是以比特币为代表的分布式账本,这个被称为区块链1.0,上面主要就是记录了交易信息,比如张三借给李四100块钱。以太坊在比特币的基础之上演进出区块链2.0 的版本,除了分布式账本的功能之外,它还具备了可以公开、自动执行的约定,也被称为智能合约。比如,如果明天下雨,张三就转给李四100 块钱。到了这一步,就有一个问题,这100 块钱堵得是明天下不下雨,赌约是放在区块链上自动执行的,明天下不下雨又是真实世界里面的情况。那区块链怎么知道明天下不下雨,然后去执行这个约定呢?预言机所以就需要有一样东西,来回答明天下不下雨的问题,这个东西就是预言机。预言机是链上与链下的信息桥梁,它负责将真实世界的情况传递到链上。到了这里,又产生了一个新的问题,预言机撒谎怎么办?目前已有的解法主要是两个,一是预言机网络,即智能合约选择若干台预言机,大家一起投票来回答某一个问题;二是为预言机建立信誉系统,每一台预言机的信誉由它的运行时间、响应时间及成功完成的任务量等组成,智能合约可以根据预言机的信誉来选择一个来执行此次的任务。DID & ENS我们上面讲到,Web 3.0 下只需要一个账号,就能访问(同构公链下的)所有应用,这个账号叫做DID(Decentralized ID)。它的特点是全网(同构公链)通用、自主控制、长久有效、可迁移。这个账号也被称为钱包地址,它实际上就是一个不对称加密的公私钥对中的公钥。公钥全网可见,用于交易;私钥个人保存,用于验证身份,如果私钥丢了,就找不回来了。私钥一般是一个很长的由数字、字母组成的字符串,很难记住,所以一般会把这个字符串转换成12个单词,我们保存这些单词就行。因为私钥的重要性,目前除了我们常见的在线保持账号登录状态(热钱包)的方式以外,也存在离线保存的方式(冷钱包),冷钱包是一个像U盘一样的硬件设备,用户把私钥存在里面,每次需要交易的时候,插入设备,进行交易。如果用户失去了他们的私钥,他们将永远失去对钱包的访问。与Web 2.0 中提供忘记密码工具的中心化服务不同,Web 3.0 上没有任何恢复措施。写到这里,我想到前一阵子的一个案例,老乡的手机号被运营商回收,新拿到这个手机号的用户注册了一个新的vx 号,老乡账号被顶下来了,又记不住vx 号和密码,登录不上,账号里还有3 万块钱,打电话向我求助。我打通了vx 客服的电话,他们在对我做了一轮真实用户信息确认之后,就提供了账号和密码让我可以找回原来的vx 号。在Web 3.0 的世界中,找回账号这种操作永远不会发生。钱包地址全网可见,用于交易,所以我们在上面提到记录张三与李四交易信息的的区块链就变成了下面这样。在交易的场景下,区块链上的信息记录成上面这个样子没什么问题。但是在社交类应用中,如果出现了“0x1016f75c54c607f082ae6b0881fac0abeda21781给你点赞”这种信息,我们可能会崩溃。所以最好有一种方式,能够将这种我们很难看懂记住的长字符串转换为我们更容易记住的信息。说到这里,你或许想起了DNS(Domain Name System),即域名解析服务,它可以将一串我们很难记住的IP 信息转换一个相对容易记住的域名,比如devui.design <=> 117.78.24.39。Web 3.0 在这种场景下的解决方案与此类似,即ENS(Ethereum Name Service),它做的事情就是域名到钱包地址的转换,xxx.siudong.eth <=> 0x1016f75c54c607f082ae6b0881fac0abeda21781。ENS域名被看做Web 3.0 身份的一种象征,圈内玩家在查看一个Web 3.0 地址时如果发现这个地址持有ENS 域名,则往往会认为这个人还是稍微懂行的。目前ENS 按照域名的字符数量收费,3字符640美元/每年、4字符160美元/每年、5字符及以上5美元/每年。FT & NFT接下来要聊的两个概念,是FT(Fungible Token)和NFT(Non-fungible Token),FT 就是同质化代币,它不唯一,可分割。比如我们在Web 3.0 的网站上买一些东西的时候,商品会被标记为0.002以太币,大概就是3美元。NFT 就是非同质化代币,非同质化的意思就是每个都不一样,它可以是图片、音频、视频、文本等。Mint (制作发布NFT作品)操作十分简单,只要你先完成图片设计,通过打开去中心化钱包,打开 Mint 网站简单设置,上传作品就完成 NFT 的“Mint”了(不过要收取gas 费)。在不同平台上,铸造一个NFT 所需的gas 费从2 美元(平时)到32 美元(链上活动疯狂的时候)不等。我曾跟同事讨论过一个问题,NFT 跟“王者荣耀”游戏里的皮肤有什么区别,每一个皮肤也可以有一个唯一的编号,可以有差异,是属于某一个人,不可分割的。这个跟NFT 的特征好像没有太大区别。直到后来,我看到这样一句话,Web 3.0 的承诺之一是,用户现在可以拥有数字物品而不需要任何中心化平台。回到皮肤这个问题,如果离开了“王者荣耀”,皮肤还能用吗?关于NFT 还有一个经常被聊到的问题,NFT 不就是一个头像吗?别人花几千万美元买了一个头像,我截图一下,不就是有一个一模一样的了吗?我在《一本书读懂Web 3.0:区块链、NFT、元宇宙和DAO》这本书中,找到了一个很好的回答。“在Web 3.0 中,NFT 的价值并不在于你有一个长这样的NFT,而在于其背后凝结的社区共识。也就是说,你当然可以复制、粘贴一套NFT,但是除了你本人之外没有人认可这套仿品,因此它就毫无价值。”关于NFT,还有很多有意思的故事:2021 年3 月,美国艺术家Beeple 的NFT 作品《每一天:前5000天》以6900 万美元拍卖。2022 年1 月,印尼小哥将三年内的900 多张自拍做成NFT,4 天内赚了奖金100 万美元。新加坡KOL(Key Opinion Leader,关键意见领袖)的自拍照做成NFT,单张可以买到将近1 万美元。NBA 球星库里以55 ETH(约18万美元)的价格购买BYAC(Bored Ape Yacht Club,无聊猿)NFT 作为头像。阿迪达斯、耐克、奈雪的差、新华社发布/收购NFT 藏品/公司。 DAO & X-to-earn最后要聊的两个概念是DAO 和X-to-earn。DAO 的全称是Decentralized Automous Organization,即去中心化自治组织。它的特点是:去中心化、自主性与自动化、可治理、高度透明、Token激励。看了很多关于DAO 的描述和案例,还是没搞懂,它到底是什么,应该怎么参与,所以这里摘抄了一段在概念上讲的相对比较清楚的一段文字供大家参考:DAO 在组织方式与运行方式上,与如今的CMO十分相似。CMO 是Cyber Movement Organizations 的缩写,在学术上称为动态网民组织,可简单地理解为网民群体。在网络空间中,网民们会针对特定的话题或事件在短时间内迅速集结形成社会运动组织或团体,这些组织或团体会基于相应的事件做出行动。互联网水军就是CMO 的典型代表,如帝吧出征,指的是爱国网友(最早期以百度贴吧“李毅吧”为主要力量)自发到海外各大社交平台传播爱国声音的网络行为,因行动迅速、声势浩大,逐渐在网络上出现了“帝吧出征、寸草不生”的形容。在Web 2.0 的世界中进行创业是一件很难的事情,比如开发一个应用,你需要做到上百万级别的用户活跃度才能支撑起包括开发人员在内的大量用工成本,而DAO 通过智能合约极大地简化了工作流程,通过简单的交互就可以完成交易,这在极大提高效率的同时降低了组织创新创业、生产交易的流程成本,这就意味着在Web 3.0 时代,做一个成功项目的核心是创意点,而不需要得到上百万个用户数据来进行融资。DAO 给那些原本不被认为能产生价值的行为赋予了经济意义,比如打游戏、点赞、转发、看广告。这个过程被称为X-to-earn,这里的X 可以指任何事情。比如21 年最火爆的链游——《Axie Infinity》,就是Play-to-earn 中的一个典型代表。游戏的基本设定是,玩家需要先花钱购买三只宠物,然后通过宠物的战斗、升级和繁殖获取代币,将代币转换为以太币,最后转为现金。在《Axie Infinity》这款游戏中,会有很多因素互相作用。一方面,需要保证不断有新玩家来,付费、玩游戏,这个Play-to-earn 的链条才能持续下去,而随着游戏的火爆,宠物的价格会越来越高,从几美元一只,到几百美元一只。另一方面,随着玩的人越来越多,游戏里的代币也越来越多,代币就会贬值,赚到同样的钱,就需要花费更多的时间。这种赚钱的模式并不健康,所以《Axie Infinity》在2021年4月拥有大约270万日活跃玩家,到2022年10月份,这项数据已经暴跌至11.1万。总结时刻文章里提到很多名词/概念,最后再用一个表格做一下简单的汇总,方便大家快速打包带走。名词/概念含义区块链用于记录交易信息的分布式账本POW共识机制的一种,需要用很大的算力来计算一个随机数币生成区块后得到的奖励,可以用于交易/购买智能合约写在区块链上的自动执行的合约预言机链上/链下(真实世界)的信息通道DIDWeb 3.0 中的账号信息,实际上就是非对称加密中的公钥ENS将公钥转换为容易记住的域名服务FT同质化代币,比如比特币、以太币等NFT非同质化代币,可能是图片、音频、视频、文本等DAO去中心化自治组织X-to-earn拒绝内卷,解构职业。任意的X都可以赚钱2023,新的一年,祝大家能办成心中所想的那几件大事!了解更多欢迎大家关注 DevUI !未来华为云前端开源社区也会将更多内部优秀工程实践开源出来,欢迎朋友们加入我们的社区,一起打造有竞争力的开源产品,营造有温度的开源社区,期待你的加入!官网:devui.design源码仓库:github.com/DevCloudFEDevUI微信小助手:devui-official文 / DevUI社区贡献者 徐绍栋
2023年03月06日
3 阅读
0 评论
0 点赞
2023-03-06
我认为 web3 是什么(大白话 web3)
说到 web3,很多人觉得这是骗局,是割韭菜。是因为大部分介绍 web3 的文章都离不开 NFT、数字货币、区块链、比特币、以太坊、元宇宙等概念,玄之又玄,脱离我们的生活,没解决我们的痛点。一般文章最后还教给我们怎么炒币,怎么买卖 NFT,妥妥的割韭菜套路,所以大部分觉得 web3 就是在忽悠人。说实话,很多东西我也觉得是在炒作,我也不信。一个图片卖几百万美金? 一个空气币要卖我钱? 元宇宙?可能要等我儿子长大了玩吧?关于 web3 是什么,可能每篇文章介绍的都不一样,好像现在大家对 web3 是什么还没达成共识。但对于普通人来讲,我们只关心 web3 有没有解决我的痛点,有没有给我带来价值。本篇文章,我会通过大白话来介绍我认可的 web3 形态,极大解决了我们的痛点,我愿称之为未来!本文不会涉及任何韭菜币等相关概念(我也不懂),请放心食用。web2 的牢笼(现在的痛点)通常大家说的 web1,是指门户时代,内容由各大门户网站创作,普通用户只是作为浏览方。数据由门户网站产出,收益当然归他们所有,价值流向正确。总结:平台创造、平台所有、平台控制、平台受益。通常大家说的 web2,就是我们当下的互联网形态:用户创造、平台所有、平台控制、平台分配。举一些典型的例子:我们在抖音创作了短视频,抖音拥有了我们的视频,控制视频分发,间接产生的收益也归抖音平台所得 我们在微信上维护的社交关系、聊天记录、朋友圈数据等,也归微信平台所有,间接产生的收益归微信所得 我们在微信淘宝购买了商品,海量的购买记录归淘宝所有,淘宝通过分析购买记录间接产生收益 ...... web2 的问题有很多:所有权和收益权不合理: 不符合 “谁创造、谁拥有、谁收益”的市场规则。比如:我在知乎、公众号等渠道发布的几十篇文章,没有收益。 平台垄断,并控制用户: 数亿用户创造的海量内容,无偿提供给平台,催生了多个超级巨头的产生。反过来,巨头开始控制用户,比如: 各大内容平台通过算法控制推荐给用户的内容 ???? 百度搜索首页全是付费广告 ???? 平台割裂,微信屏蔽支付宝、淘宝、抖音分享,淘宝不支持微信支付等 ???? 电商平台杀熟 ???? 在朋友圈发布的内容,被屏蔽仅自己可见 ???? 数据割裂,且无法迁移: 即使我们对各大平台的控制已经忍无可忍,但我们没有办法去改变。我们的数据归平台所有,无法迁移。另外就是在当前的模式下,很难诞生白莲花平台。 我每次写一篇文章,需要在公众号、掘金、知乎、Github 等各个渠道发布一次。大家对于文章的评论、点赞、关注都是割裂的,属于各个平台,而不是属于我这篇文章 我忍受不了微信的垄断,但我也没办法把微信的好友、聊天记录、朋友圈等我创作的内容迁移到其它平台 我没办法把知乎的粉丝、文章、评论、关注迁移到掘金 我在 QQ 音乐购买的音乐,没法在网易云音乐播放器播放 隐私问题: 我们的社交关系、聊天记录、购物记录、搜索记录等数据,均由各大平台控制,他们可以随意使用我们的隐私数据 数据可信度: 平台提供的数据不可信,比如: 我的文章阅读量可能都是虚假的 商品的购买量可能都是虚假的 推荐的热门视频可能并不是真的热门 数据安全性: 我们的数据由平台中心化存储,如果平台挂了,那我们的数据也没了 就我个人而言,我对 web2 中的很多点已经达到忍无可忍的程度,如果 web3 能解决这些问题,那我就是 web3 的粉丝。自由和发展基于市场经济,web3 的宗旨必须是用户创造、用户所有、用户控制、协议分配。在 web3 中,用户的所有数据都归属用户个人,用户可以授权其它平台访问自己的某类数据。想象一下这种场景:社交关系、聊天记录、实时聊天消息等由我个人管理,微信做的不好,我就炒他鱿鱼,不给他授权了。我把这些信息授权给另外一个体验真正好的聊天工具。 我购买的音乐由我个人管理,QQ 音乐让我不爽,我就炒了他,把我的音乐授权给另外一个音乐软件。 我写的文章、以及文章的评论、收藏、关注等数据我个人管理,哪个平台体验好,我就授权给他。 总结就是,哪个软件让我不爽,我就无缝切换到另外一个软件,让软件供应商去内卷吧。能随意炒微信的鱿鱼,想想都开心。以前不可能,但 web3 确实带来了这种机会。我认为 web3 的实现思路应该是这样的:用户的数据存储在某个地方,用户对数据拥有完全控制权,未经授权,任何人不能访问和修改数据。 软件需要经过用户授权,才能访问用户特定的数据。 针对数据存储部分的技术解决方案,我们要求能解决信任问题。即用户完全信任数据存储方,非用户授权,任何人无法访问和修改数据。中心化的数据存储肯定不能符合要求,从目前来看,「区块链」去中心化技术就非常适合充当这里的可信任数据存储解决方案。这也是为什么 web3 总是和区块链绑定在一起。其实如果有其它技术能解决信任问题,也是 OK 的。针对软件提供方,未来可能会更轻量。比如很多软件可能都不需要数据库了,数据完全由用户自带。软件需要做的就是帮用户管理数据,比如播放音乐、管理文章、聊天等。软件提供方必须用优质的体验来吸引用户,想想都幸福。大家快来学前端吧 ????,按我讲的,前端就是未来呀!欢迎关注我的公众号《前端技术砖家》跟我学前端。哈哈哈。总结哪里有压迫,哪里就有革命。web3 让我们可以完全控制自己的数据,可以让我们用上更好的软件,用户会用脚投票的,为何不会成功呢?所以我还是笃定 web3 这个方向的,虽然这条路真的很难,需要无数人去探索,但互联网的未来一定属于 web3!如果下次还有谁介绍 web3 的时候,提到数字货币、NFT 啥的,那就妥妥的是割韭菜了。最后需要说明的是,本篇文章关于 web3 的定义不一定准确,纯属我一个菜鸡的 YY,另外文中的很多观点和话术来自网络,感谢互联网。
2023年03月06日
7 阅读
0 评论
0 点赞
2023-03-06
Uniswap V2:质押挖矿原理与源码分析
最近在写uniswap相关业务代码,发现自己对于LPtoken质押挖矿(流动性挖矿)这方面一头雾水,看了很多资料,决定写一篇输出,有不对的地方欢迎大家指正~一、前言1.1 Uniswap价值2021.9.17,uniswap向早期参与交易以及LP(提供流动性)的用户空投了总计1.5亿枚UNI治理代币,Uniswap的交易额和交易量瞬间出现了陡坡式增长,一个月创造了330亿美元的交易额,占到总交易额的近乎60%。UNI的价格也在一个月上涨近乎30%。UNI作为uniswap的平台币,是流动性提供者的权益证明,其升值空间也巨大。1.2 如何获得UNI从二级市场直接购买可以获取相对的UNI代币。 流动性挖矿。不同于比特币那种通过矿机来进行挖矿,而是通过流动性挖矿来获取奖励分红。 二、什么是质押挖矿?质押挖矿是将质押的代币存入矿池中,矿池每分钟或每个新区块产生一些奖励代币,这些奖励代币按照流动性提供者质押的代币份额分发给LP。通俗来说,就是质押代币,获得其他代币的奖励。2.1 质押挖矿分类质押交易对得到收益 在uniswap中,任何用户都可以根据流动性池中的A,B两种代币的比例提供对应数量的A,B,即可成为流动性提供者,而流动性提供者可以在用户进行交易的时候以交易的手续费为奖励,手续费一般是0.3%。Uniswap对流动性提供者按照份额分配奖励,而份额的大小取决于注入流动性池的代币数量占整个流动性池数量的比重质押流动性代币得到收益 如果用户手中有流动性代币,可以将其质押在挖矿合约中,可以锁仓质押,也可随时提取,此合约按照设定的规则,按质押金额和质押时长发放奖励给流动性提供者。在Uniswap中,该奖励一般是UNI。以上两种类型的区别为:第一个是用户方提供收益,第二种是平台以自己的平台币作为收益三、质押挖矿原理(计算用户得到多少收益)3.1 正常思路1.计算矿池中每秒产生的奖励代币数量(相当于速率) rewardRate = 奖励代币总数 / 质押时长2.计算每单位质押代币所得到的奖励代币 rewardPerToken = rewardRate / 此时矿池中质押代币的总数3.计算某个用户得到的收益——遍历所有质押的用户,得到每个用户质押代币的份额 rewards = rewardPerToken * 某个用户质押代币的份额以上算法是否有什么问题?众所周知,solidity语言注重gas消耗,如果遍历的用户特别多,就会造成gas耗尽,导致失败。3.2 正确思路通过上面,我们知道正常思路是无法用solidity语言写出来,那怎么计算用户挖矿奖励呢?我们可以根据最后一次奖励时间和开始质押时间来计算A用户的挖矿奖励假设a 表示每秒产生的奖励代币数量(是3.1当中的rewardRate)P表示此时矿池质押代币的总数a/P表示每单位质押代币所获得的奖励代币Tn表示第n分钟开始的时候,累计的每质押代币可以分配的奖励之和,即:Tn = a / P1 + a / P2 + a / P3 + … + a / Pn假设 用户A在第2分钟开始的时候质押了b个质押代币,用户B在第4分钟开始的时候质押了c个质押代币,那么第6分钟开始的时候,用户A可获得的奖励 :T6 表示 用户A在第6分钟开始结算的时候,累积的每单位质押代币收到的奖励之和T2 表示 用户A在第2分钟开始质押的时候,累积的每单位质押代币收到的奖励之和b 表示结算的时候用户A的总质押代币数量可以看出,用户的挖矿奖励 = 用户质押的代币总数 *(结算的时候累计的每单位质押代币获得收益之和 - 质押的时候累计的每单位质押代币获得收益之和)四、源码分析想看质押挖矿所有代码可以去uniswap github上,我介绍的是简化版的质押挖矿,有些函数我没有写。一共有四个合约,分别如下:LPToken.sol:表示质押代币rewardToken.sol: 表示奖励代币stakeFactory.sol: 表示工厂合约,主要是部署质押合约staking.sol: 表示质押合约,主要是一些相关函数LPToken.sol和rewardToken.sol 就是主要是继承ERC20合约,用于创建质押代币和奖励代币,接下来就不介绍这两个合约,主要介绍stakeFactory.sol和 staking.sol。4.1 staking.sol该合约主要是实现质押挖矿过程中所用到的功能。导入的依赖 import "./rewardTokens.sol"; import "./LPToken.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; 复制代码定义变量和常量 rewardUNITokens : 创建奖励代币对象,一般是UNI平台币stakingLPTokens :创建质押代币对象,一般是LPtokenstakingFinishTime = block.timestamp + stakingTime : 质押挖矿结束时间 stakingTime : 质押时长_totalSupply: 矿池中质押代币总量rewardPerTokenStored: 存储每单位质押代币获取的收益lastUpdateTime : 上一次更新时间 rewardTokens public rewardUNITokens; LPToken public stakingLPTokens; uint public stakingFinishTime = block.timestamp + stakingTime; uint public stakingTime; uint public rewardRate = 100; uint private _totalSupply; uint public rewardPerTokenStored; uint public lastUpdateTime; 复制代码映射 rewards: 用户地址=> 用户获得的收益balances: 用户地址=> 用户质押代币数量userRewardsPerToken: 用户地址 => 每单位质押代币获取的收益数 mapping(address => uint) public rewards; mapping(address => uint) public balances; mapping(address => uint) public userRewardsPerToken; 复制代码事件 Stake: 存储质押者地址和质押了多少代币Withdraw: 存储此时取回收益的用户地址和取出奖励代币数目Rewards: 存储用户地址和对应的奖励总数 event Stake(address sender,uint amounts); event Withdraw(address recipient,uint amounts); event Rewards(address recipient,uint amounts); 复制代码构造函数和修饰器 1.构造函数初始化传入的参数分别为 _rewardUNITokens``,_stakingLPTokens, _stakingTime,对应的含义是奖励代币地址,质押代币地址,质押时长2.modifier用于修饰后面的stake(),withdraw(),getRewards()三个函数(这三个函数改变了矿池的状态),用于更新一些变量包括上一次状态改变的时间,用户操作之前得到每token奖励代币数量,两个映射函数 constructor(address _rewardUNITokens,address _stakingLPTokens,uint _stakingTime){ rewardUNITokens = rewardTokens(_rewardUNITokens); stakingLPTokens = LPToken(_stakingLPTokens); stakingTime = _stakingTime; } modifier update(address owner) { lastUpdateTime = getLastTime(); rewardPerTokenStored = rewardUNIPerToken(); if(owner != address(0)){ userRewardsPerToken[owner] = rewardPerTokenStored; rewards[owner] = allRewardsOfUser(owner); } _; } 复制代码主要方法 getLastTime()从当前区块时间和挖矿结束时间两者中返回最小值。当挖矿未结束时返回的就是当前区块时间,而挖矿结束后则返回挖矿结束时间。挖矿结束后,lastUpdateTime 也会一直等于挖矿结束时间 function getLastTime() public view returns(uint){ return Math.min(block.timestamp, stakingFinishTime); } 复制代码rewardUNIPerToken()一段时间内每份LPtoken获取的奖励代币数量用累加计算的方式存储到 rewardPerTokenStored 变量中。当挖矿结束后,则不会再产生增量,rewardPerTokenStored 就不会再增加了。 function rewardUNIPerToken() public view returns(uint rewardUNI){ if(_totalSupply == 0){ rewardUNI = rewardPerTokenStored; } rewardUNI = rewardPerTokenStored.add(getLastTime().sub(lastUpdateTime).mul(rewardRate).mul(1e18).div(_totalSupply)); } 复制代码allRewardsOfUser() 计算用户挖矿获得的奖励总数奖励总数 = 用户质押代币份额 * (结算的时候累计每单位质押代币奖励总数 - 质押刚开始每单位质押代币奖励总数) + 之前存储的奖励 function allRewardsOfUser(address account) public view returns(uint){ return balances[account].mul(rewardUNIPerToken().sub(userRewardsPerToken[account])).div(1e18).add(rewards[account]); } 复制代码stake() 用户质押代币1.判断质押代币数量是否大于02.更新矿池中总的质押量3.更新用户的质押数量4.将用户质押代币转让到质押合约(矿池)中 function stake(uint stakingAmounts) public update(msg.sender) { require(stakingAmounts > 0); _totalSupply = _totalSupply.add(stakingAmounts); balances[msg.sender] = balances[msg.sender].add(stakingAmounts); stakingLPTokens.transferFrom(msg.sender, address(this), stakingAmounts); emit Stake(msg.sender, stakingAmounts); } 复制代码withdraw()取出质押代币1.判断取出的质押代币数量是否大于02.更新矿池中总的质押量3.更新用户的质押数量4.将要取出的质押代币转给用户中 function withdraw(uint stakingAmounts) public update(msg.sender) { require(stakingAmounts > 0); _totalSupply = _totalSupply.sub(stakingAmounts); balances[msg.sender] = balances[msg.sender].sub(stakingAmounts); stakingLPTokens.transferFrom(address(this), msg.sender, stakingAmounts); emit Withdraw(msg.sender, stakingAmounts); } 复制代码getRewards()用户领取挖矿奖励1.计算用户可以得到多少奖励代币2.更新rewards映射,令其值为03.将奖励转发给用户 function getRewards() public update(msg.sender) { uint stakingRewards = rewards[msg.sender]; require(stakingRewards > 0); rewards[msg.sender] = 0; rewardUNITokens.transfer(msg.sender, stakingRewards); emit Rewards(msg.sender, stakingRewards); } 复制代码exitStake()解除质押1.提取用户质押的所有token2.领取奖励 function exitStake() public{ withdraw(balances[msg.sender]); getRewards(); } 复制代码
2023年03月06日
4 阅读
0 评论
0 点赞
2023-03-06
万字长文聊聊Web3的组成架构
Web3 发展至今,生态已然初具雏形,如果将当前阶段的 Web3 生态组成架构抽象出一个鸟瞰图,由下而上可划分为四个层级:区块链网络层、中间件层、应用层、访问层。下面我们来具体看看每一层级都有什么。另外,此章节会涉及到很多项目的名称,因为篇幅原因不会一一进行介绍,有兴趣的可以另外去查阅相关资料进行深入了解。区块链网络层最底层是「区块链网络层」,也是 Web3 的基石层,主要由各区块链网络所组成。组成该层级的区块链网络还不少,Bitcoin、Ethereum、BNB Chain(BSC)、Polygon、Arbitrum、Polkadot、Cosmos、Celestia、Avalanche、Aptos、Sui 等等,还有很多。根据 Blockchain-Comparison 的统计,截止撰文之日的区块链至少有 150 条。这里我们主要说的是公链,联盟链不包括在内。因为区块链实在太多,会有些眼花缭乱,所以有必要进行分门别类。首先,不同区块链之间存在着分层结构,有 Layer0、Layer1、Layer2 之分。其次,Web3 的繁荣发展,依赖于智能合约技术,而智能合约的运行环境为虚拟机。智能合约和虚拟机的关系,就和 Java 程序和 JVM 的关系类似。从不同的虚拟机维度上划分区块链,就可以分为两大类:EVM 链和 Non-EVM 链。EVM 是 Ethereum Virtual Machine,即为以太坊虚拟机的简称。EVM 链即为兼容 EVM 的区块链,而 Non-EVM 顾名思义就是不兼容 EVM 的区块链。最后,还可以根据存储的数据大小进行分类,可以分为计算型区块链和存储型区块链。先从分层结构说起。最好理解的是 Layer1,我们所熟知的比特币、以太坊、EOS、BSC 都属于 Layer1,也称为主链。在分布式系统中,存在 CAP 定理,即一个分布式系统不可能同时满足三个特性:一致性、可用性、分区容错性。一个分布式系统只能满足三项中的两项。Layer1 的区块链本质上也是分布式系统,也同样存在不可能三角问题,只是三个特性与 CAP 不同,分别为:可扩展性、安全性、去中心化,每个区块链也只能满足三项中的两项。比特币和以太坊偏向于安全性和去中心化,所以可扩展性比较弱,TPS 比较低。EOS 和 BSC 则只依赖于少数节点来维护共识,相比于比特币和以太坊,减低了去中心化特性,但提高了可扩展性,从而能达到很高的 TPS。为了解决比特币和以太坊的可扩展性问题,就慢慢衍生出了 Layer2。Layer2 是作为依附于主链的子链而存在,主要用于承载 Layer1 的交易量,承担执行层的角色,而 Layer1 则可变成结算层,可大大减少交易压力。目前主流的 Layer2 都是扩展以太坊的子链,包括 Arbitrum、Optimism、zkSync、StarkNet、Polygon 等。比特币也有 Layer2,主要包括闪电网络、Stacks、RSK 和 Liquid,但目前都比较小众。Layer0 则比较抽象了,一般被定义为区块链基础设施服务层,主要由模块化区块链所构成,包括 Celestia、Polkadot、Cosmos 等。模块化区块链这个概念主要是由 Celestia 提出的,其核心设计思路就是把区块链的共识、执行、数据可用性这几个核心模块拆分开来,每个模块由一条单独的链来完成,再将几个模块组合到一起完成全部工作。这和软件架构设计中所提倡的模块化设计思想是一样的,可实现高内聚低耦合。实现跨链通信的跨链桥或跨链协议也可以划入 Layer0。跨链桥的数量也是非常多,撰写此文时,debridges.com 上统计的跨链桥多达 113 条,其中 TVL 排名最高的三个分别为 Polygon、Arbitrum、Optimism 的官方跨链桥,这几个桥分别实现了各自的 Layer2 和以太坊之间的资产跨链。TVL 排名第四位的则是 Multichain,其前身为 Anyswap,是连接了最多条区块链的第三方跨链桥,截至今年 1 月份时,其连接的区块链多达 81 条。聊完分层结构的划分,我们再从 EVM 的维度来梳理下不同的区块链。前面说过,从 EVM 维度上可划分为 EVM 链和 Non-EVM 链两大类。EVM 链是目前最主流的方向,基于 EVM 链的 DApp 和用户群体是目前整个 Web3 生态里规模最大的。有些原生就是兼容 EVM 的,比如 BSC、Heco、Arbitrum、Optimism 等;有些则是后期才扩展兼容 EVM 的,比如 zkSync 1.0 并不兼容 EVM,而 zkSync 2.0 则是兼容 EVM 的。很多区块链就算早期并不兼容 EVM,但也逐渐在拥抱 EVM。比如,Polkadot 推出了 Moonbeam 平行链来兼容 EVM,Cosmos 则有 Evmos。目前来看,排名靠前的区块链中,大部分都已经兼容 EVM,不过依然还有少部分 Non-EVM 链存在,比如 Solana、Terra、NEAR、Aptos、Sui。另外,EVM 链的智能合约主要使用 Solidity 作为开发语言,而 Non-EVM 链则主要使用 Rust 或 Move 语言开发智能合约。以上提到的这些区块链,主要还是偏向于解决去中心化计算的区块链,这些区块链普遍不支持大数据的存储,比如文件存储。而存储型的区块链则聚焦于解决大数据存储的问题,这类区块链目前不太多,主要有 Filecoin、Arweave、Storj、Siacoin 和 EthStorage。目前组成「区块链网络层」的区块链成员们主要就包括这些了,未来还会不断有新成员加入,但也有不少旧成员逐渐没落而被遗落在角落里。中间件层在区块链网络层之上的这一层,我称之为「中间件层」,主要为上层应用提供各种通用服务和功能。所提供的通用服务和功能包括但不限于:安全审计、预言机、索引查询服务、API 服务、数据分析、数据存储、基本的金融服务、数字身份、DAO 治理等。提供通用服务和功能的组件则可称为「中间件」,这些中间件也是存在多种形式,可以是链上协议,也可以是链下平台,或链下组织,包括中心化的企业或去中心化自治组织 DAO。下面就来聊聊这一层具体都有哪些中间件。先来聊聊安全审计,这是非常核心的中间件,因为 Web3 里的区块链和应用大多都是开源的,且很多都是跟金融强相关,因此,安全性就成为了重中之重,安全审计自然也变成了刚需。安全审计的服务大多由一些安全审计公司所提供,比较知名的审计公司包括:CertiK、OpenZeppelin、ConsenSys、Hacken、Quantstamp,以及国内主要有慢雾、链安、派盾等。另外,还有不少知名度不高的小审计公司。除了审计公司,还有一些提供 Bug Bounty 的平台,一般就是在这些平台上发布任务,让白帽黑客们来找 Bug,找到的 Bug 安全漏洞等级越高则可获得的赏金越高。目前,全球最大的 Bug Bounty 平台是 Immunefi。接着,再来聊聊预言机(Oracle Machine,简称 Oracle),在 Web3 生态里也是扮演着非常重要的角色,是区块链系统与外部数据源之间沟通的桥梁,主要实现智能合约与链下真实世界的数据互通。因为区块链网络本身对状态一致性的限制,需要保证每个节点在给定相同输入的情况下必须获得相同的结果,所以区块链被设计成一个封闭系统,只能获取到链内的数据,而无法主动获取外部系统的数据。但很多应用场景中是需要用到外部数据的,这些外部数据就由预言机来提供,这也是目前区块链与外部数据实现互通的唯一途径。根据预言机所提供的具体功能,目前对预言机的分类大致有:DeFi 预言机、NFT 预言机、SocialFi 预言机、跨链预言机、隐私预言机、信用预言机、去中心化预言机网络。具体的预言机项目有 CreDA、Privy、UMA、Banksea、DOS、NEST、Chainlink 等,其中,Chainlink 为预言机的龙头,其定位为去中心化预言机网络,推出了 Data Feeds、VRF、Keepers、Proof of Reserve、CCIP 等一系列产品和服务。然后,索引查询服务也是很关键的中间件,解决了链上数据的复杂查询问题。比如要查询 Uniswap 上某一天的总交易量,如果直接在链上查询是很麻烦的。所以就有了对索引查询服务的需求,这块的主要代表为 The Graph 和 Covalent。The Graph 的实现方案主要是可定制化监听链上数据并映射成自定义的数据进行存储,从而方便查询。而 Covalent 则是将很多通用、广泛使用的数据封装成统一的 API 服务,供用户查询。提到 API 服务,除了 Covalent,还存在解决其他不同需求的 API 提供商,比如:NFTScan,是聚焦于提供 NFT API 数据服务的;Infura 和 Alchemy,则主要提供区块链网络节点服务;API3,旨在打造去中心化 API 服务。不管是索引查询服务还是 API 服务,都是链上数据相关的服务,数据分析也是数据相关的服务,这一版块的成员主要有 Dune Analytics、Flipside Crypto、DeBank、Chainalysis 等。数据存储中间件则和底层几个专门做存储的区块链容易混淆,也有人将底层的 Filecoin、Arweave、Storj 等划分到这一层,但我觉得这些本质上还是底层区块链,所以我将其划入到区块链网络层。而中间件层的数据存储,目前主要就是 IPFS。IPFS 全称为 InterPlanetary File System,中文名为星际文件系统,是一个基于内容寻址、分布式、点对点的新型超媒体传输协议,其旨在取代 HTTP 协议。IPFS 与区块链网络很相似,但其实并不属于区块链网络,基于 IPFS 的 Filecoin 才是区块链网络。接下来,看看有哪些中间件是提供基本金融服务的。这块的代表性组件主要包括 Uniswap、Curve、Compound、Aave 等,Uniswap 和 Curve 提供了链上交易功能,而 Compound 和 Aave 则是链上借贷平台。这几个本质上都是应用层的链上协议,但因为这些协议都逐渐被越来越多其他应用所依赖,类似于成为了乐高积木,可以用来组合搭建出不同的应用,于是就变成了通用性的应用协议,即下沉为了中间件的角色。其实,任何具有可组合性的组件,不管是链上应用协议,还是链下提供不同服务的中心化实体,或者是 DAO,只要其提供的服务和功能是大部分应用都需要的,就可以划入「中间件层」。不同的中间件就和不同的乐高积木一样,通过组装不同的积木就可以创建出不同的应用。包括数字身份、DAO 治理的工具等,其实也都是同样道理。应用层应用层是 Web3 生态里最繁荣的一层,这一层里,充斥着各种不同的 DApps,可谓是百花齐放、百家争鸣。下面我们主要介绍几个发展得相对比较繁荣的板块。NFTNFT 全称为 Non-Fungible Token,表示「非同质化代币」,国内也称为数字藏品,用于代表艺术品等独一无二的数字资产。第一个真正意义上的 NFT 项目叫 CryptoPunks,于 2017 年 6 月发布,由 10,000 个 24x24 像素的头像所组成。每个头像都是由算法生成的,独一无二且所有头像都上传到了以太坊上,也是目前为止唯一一个将所有头像数据全部上链的 NFT 项目。下图为 CryptoPunks 官网展示的部分头像:截止撰文之日,CryptoPunks 的地板价(即最低价)为 66.88 ETH,按 ETH 的价格换算成美元,大概为 $84,397.21 美元。最贵的一个 CryptoPunk,成交价达到了 8000 ETH,成交于 2022 年 2 月 12 日。一个 NFT 头像为何会这么贵,这对于很多人都是很难理解的。其中,最主要的一个原因,就是它是第一个 NFT 项目,就和比特币是第一个区块链一样,其开创性的地位所带来的价值潜力非常大。受 CryptoPunks 的启发,一家名为 Axiom Zen(Dapper Labs 的前身)的公司于 2017 年 11 月底发行了 CryptoKitties,国内也称为加密猫、以太猫、谜恋猫。CryptoKitties 上线后便病毒式地传播开来,还造成了以太坊的拥堵,暴露出以太坊的性能问题。CryptoKitties 发行之前,Axiom Zen 的技术总监 Dieter Shirley 以 CryptoKitties 为案例,还提出了 ERC721 Token 协议作为 NFT 的通用技术标准,而随着 CryptoKitties 爆火后,以 ERC721 为主要技术标准的 NFT 被进一步采用,如今 ERC721 已经成为了所有 NFT 的基础标准之一。继 CryptoPunks 和 CryptoKitties 之后,NFT 开始逐渐遍地开花,NFT 生态逐渐蓬勃发展。NFT 发展至今,已经涉足到了多个领域,如果对 NFT 生态的所有组成部分做详细分类的话,可以多达几十种。如果只聚焦于 NFT 本身,即 NFT 的不同用例,那大致可以做出以下分类:收藏品、艺术品、音乐、影视、游戏、体育运动、虚拟土地、金融、品牌、DID。下面主要介绍每个分类的一些代表性的 NFT 项目。收藏品其实很难单独定义为一个类别,宽泛地讲,几乎任何东西都可以归为收藏品,包括艺术品、游戏道具、虚拟土地等。能被定义为收藏品的 NFT 主要需具备一个特性:稀缺性。比如,10000 个 CryptoPunks 中,外星人的数量最少,所以有很高的稀缺性,而男性最多,稀缺性就很低了。最知名的收藏品 NFT,除了 CryptoPunks,还有 BAYC,全称为 Bored Ape Yacht Club,也称为无聊猿。无聊猿不只是一套单独的 NFT,其实只是「无聊猿宇宙」的开端,基于无聊猿之后,背后的团队 Yuga Labs 又相继发行了无聊猿犬舍俱乐部(Bored Ape Kennel Club,BAKC)、变异猿游艇俱乐部(Mutant Ape Yacht Club,MAYC),也发行了 ApeCoin(APE)代币,还推出了 Otherside,专为元宇宙打造的虚拟土地。这些,都已经形成了「无聊猿宇宙」系列 IP,而且无聊猿不只是在加密圈内流行,在圈外的周边产品也在不断增加,比如有无聊猿的帽子、衣服、雕像、餐厅等。无聊猿的成功已超越了 CryptoPunks,Yuga Labs 之后还直接收购了 CryptoPunks。NFT 的特性能有效保护版权的所有权,所以在艺术品领域流行开来也是理所当然。艺术品 NFT 有几个代表性的作品值得介绍一番,第一个是艺术家 Beeple 的作品,名为“每一天:第一个 5000 天(EVERYDAYS: THE FIRST 5000 DAYS)”,是将他过去 5000 天内每天创作一幅的所有作品(共 5000 幅)合成一个 NFT 图像,在 2021 年 3 月以 69,346,250 美元售出。第二个值得介绍的是生成艺术,也称为衍生艺术。生成艺术中的艺术品不是由人创作出来的,而是由编程算法自动生成的,最知名的 NFT 生成艺术平台叫 Art Blocks,是一个基于以太坊的随机生成艺术平台。艺术家们可以把自己设计的独特算法上传到 Art Blocks 平台,并设定特定数量 NFT 进行发行,NFT 会根据算法自动生成。最后再介绍目前最贵的 NFT 艺术品,叫 ”The Merge“,2021 年 12 月以 9180 万美元天价成交。与其他 NFT 不同,”The Merge“ 其实不是一个单独的作品,而是由多个「mass」代币动态组合而成的。销售的其实也是 mass 代币,当初共售出 312,686 个 mass 代币,共有 28,983 个买家,即是说,”The Merge“ 是由这 28,983 个买家共同拥有其所有权,每个买家所拥有的 mass 代币数量就代表了占有多少份额的所有权。”The Merge“ 也可以理解为是一个碎片化 NFT 作品。音乐 NFT 的兴起和艺术品类似,主要也是因为版权。下面介绍几个具有代表性的音乐 NFT 相关人物,第一个要介绍的是 Justin David Blau,是美国 DJ 和电子舞曲制作人,以艺名 3LAU 而闻名。他是最早采用音乐 NFT 的人之一,在 2020 年秋天卖出了他的第一张 NFT。而在 2021 年 2 月底,凭借 Ultraviolet NFT 专辑为他带来了 1168 万美元的收入。2021 年 5 月又成立了 NFT 音乐平台 Royal,8 月份完成了种子轮融资 1600 万美元,有 a16z、Coinbase 等顶级机构参与。第二个要介绍的是 Don Diablo,荷兰 DJ、数字艺术家、唱片制作人、音乐家和电子舞曲创作者,他在 2021 年卖出第一部完整的音乐会电影 NFT,名为 “Destination Hexagonia”,成交价 600 ETH(当时为 126 万美元)。最后再介绍一个叫 Kingship 的摇滚乐队,这是一支由无聊猿组成的虚拟乐队,由环球音乐集团所组建。NFT 也席卷到了影视圈,有几个知名的影视剧都陆续发行了 NFT,国外有《权力的游戏》《蝙蝠侠》《指环王》《黑客帝国》《行尸走肉》等,国内有《大话西游》《流浪地球》《我不是药神》《封神三部曲》等。NFT 用在游戏里主要就是作为游戏资产的载体,相比于传统游戏内的资产,NFT 的形式对游戏玩家来说可以真正拥有游戏资产的所有权,且 NFT 可以在游戏外流通交易。第一个游戏 NFT 项目就是 CryptoKitties,每一只猫都是一个独立的 NFT。后面讲到 GameFi 小节再继续深入聊聊游戏这块。体育运动领域也同样涉足了 NFT,目前最知名的两大体育 NFT 平台是 NBA Top Shot 和 Sorare。NBA Top Shot 顾名思义主要以 NBA 为主,而 Sorare 则服务于足球领域。除了 NBA 和足球,橄榄球、棒球、拳击、摔跤也都纷纷推出了各自的 NFT 纪念品。虚拟土地类 NFT 主要由一些主打「元宇宙」概念的项目所推行,比较知名的有 Decentraland、The Sandbox、Roblox、Axie Infinity Land、Otherdeed 等。金融和 NFT 的结合,主要就是将 NFT 应用到 DeFi 中,比如 UniswapV3 中的流动性仓位就是 NFT。另外,还有一个思路则是先将 NFT 碎片化,接着将这些碎片后的 NFT 再赋予 DeFi 功能,比如可以赋予交易、借贷、质押挖矿等功能。品牌和 NFT 的结合,主要是作为一种新的营销方式。这两三年陆续有各种品牌加入这个阵营,比如,奢侈品品牌有 GUCCI、LV、爱马仕等,餐饮品牌有 Taco Bell、星巴克、必胜客、可口可乐等,汽车品牌有迈凯伦、雪佛兰等,运动品牌有阿迪达斯、李宁、耐克等,还有很多其他品牌。最后,聊聊 DID,全称为 Decentralized Identity,即去中心化身份。所有人都知道 DID 非常重要,但其发展还比较缓慢,目前除了细分领域 ENS 域名之后,还没有成熟的 DID 体系形成网络效应。目前,应用最广泛的只有域名,基于以太坊的 ENS 是龙头,ENS 之于 Web3,就相当于 DNS 之于 Web2。不同的是,ENS 解析的域名,映射的不是网站 IP,而是用户的以太坊地址。比如,以太坊创始人 V 神的 ENS 为 “vitalik.eth”,映射的地址为 0xd8da6bf26964af9d7eed9e03e53415d37aa96045。NFT 的可应用场景实在太多了,上面所列出的分类还没能覆盖到全部。因为 NFT 的特性,任何具有所有权的东西都可以指代,所以坊间有“万物皆可 NFT”的说法。DeFiDeFi 即去中心化金融,崛起于 2020 年夏天,因此那段时间也被称为 DeFi Summer。根据 TradingView 的统计数据,2020 年夏天刚崛起时,DeFi 总市值仅 50 亿美元,随后一路飙升,在 2021 年底达到了最高峰,将近 1800 亿美元。DeFi 有很多细分板块,主要包括:稳定币、交易所、衍生品、借贷、聚合器、保险、预测市场、指数等。稳定币主要可分为三类:中心化稳定币、超额抵押稳定币、算法稳定币。其中,超额抵押稳定币和算法稳定币为去中心化稳定币。中心化稳定币直接与法定货币挂钩,由中心化机构所发行,要求每单位稳定币需要有 1:1 的法币储备。目前交易量最大的两个稳定币 USDT 和 USDC,都是法币抵押稳定币,与美元 1:1 挂钩,分别由 Tether 和 Circle 两家中心化机构所发行。另外,币安,全球第一大中心化数字货币交易所,联合 Paxos 发行了自己的法币抵押稳定币 BUSD,目前也是全球交易量排名第三的稳定币,仅次于 USDT 和 USDC。超额抵押稳定币通过超额抵押其他加密货币而锻造,抵押品会被锁定在智能合约里,智能合约会根据抵押品的价值锻造出对应数量的稳定币,智能合约依靠价格预言机来维持与法币的锚定。此类型的稳定币主要以 DAI 为代表,由 MakerDAO 推出,和美元保持 1:1 锚定,目前交易量排名第四。算法稳定币则比较新颖,顾名思义,主要是通过算法来控制稳定币的供应。此赛道的选手也不少,包括 UST、FEI、AMPL、ESD、BAC、FRAX、CUSD、USDD、USDN 等,但目前还没有一个真正实现稳定的算法稳定币出现。接着,来聊聊交易所,DeFi 里的交易所是指去中心化交易所,简称 DEX。DEX 是 DeFi 所有板块里市值占比最高的板块,也是 DeFi 的基石板块。如果对 DEX 再进一步细分,还可以分为现货 DEX 和衍生品 DEX,衍生品 DEX 主要交易永续合约或期权。如果从交易模式上划分,那 DEX 主要可分为两种:Orderbook 模式和 AMM 模式。Orderbook 模式的 DEX,主要包括 dYdX、apeX、0x、Loopring 等。AMM 模式的 DEX 则比较多了,主要包括 Uniswap、SushiSwap、PancakeSwap、Curve、Balancer、Bancor、GMX、Perpetual 等。Orderbook 模式是最早出现的交易类型,交易方式和股票盘口的买卖方式一样,交易用户可选择成为挂单者(maker)或吃单者(taker),交易会根据价格优先和时间优先的规则撮合成交。采用 Orderbook 的 DEX,根据其发展历程主要还可以再分为三种模式:纯链上撮合+结算模式、链下撮合+链上结算模式、Layer2 模式。纯链上撮合结算模式,用户提交的挂单和吃单都是直接在链上,吃单会直接和链上的挂单成交。该模式的代表为 EtherDelta,其优点是完全链上,去中心化程度高,但缺点是交易性能很低且交易成本很贵,用户挂单、撤单都需要支付燃料费。链下撮合+链上结算模式的代表则是 0x 协议,相比于第一种模式,主要多了链下的「中继器」角色,用户通过链下签名的方式生成委托单并提交给中继器,由中继器来维护 Orderbook,撮合成功的委托单再由中继器提交到链上进行结算。因为将撮合移到了链下处理,大大提高了交易性能,但结算是一笔笔单独结算的,所以结算的性能成为了瓶颈。Layer2 模式的代表为 dYdX,背后所使用的技术主要由 StarkWare 所提供的产品 StarkEx 所支持。其基本原理就是部署一个单独的、专用的 Layer2,用户的撮合交易和结算都发生在这个 Layer2 上,然后定时将所有交易记录(包括结算记录)全部打包生成证明并发送到 Layer1 上进行验证。与 Layer2 公链不同,Layer2 公链提供的是通用交易,而 dYdX 背后所使用的这个 Layer2 只能用于专用的交易场景,这其实算是个私有链,也可称为应用链,这也是一种新的应用模式。这种模式的交易体验和中心化交易所已经相差无几了,但中心化程度比较高。完全去中心化且交易体验也较好的交易模式,目前主流的就是 AMM 模式了,AMM 为 Automated Market Maker 的简称,也称为自动做市商模式。引爆 AMM 模式的是 Uniswap,于 2018 年 11 月上线,之后的 SushiSwap、PancakeSwap、Curve 等都是基于 Uniswap 的模式进行改造。该模式需要流动性池作支撑,流动性提供者(简称 LP)往交易池里注入资产作为流动性,其实就是资金池,然后用户直接和流动性池进行交易,而 LP 则从中赚取用户的交易手续费。关于交易所暂时就先聊这么多,接着来看看衍生品。DeFi 衍生品板块主要包括几个方向:永续合约、期权、合成资产、利率衍生品。永续合约也是期货合约,加了杠杆的交易产品,前面提到的 dYdX、apeX、GMX、Perpetual 就是知名的几个永续合约 DEX。期权比期货复杂,DeFi 期权领域的玩家主要包括 Hegic、Charm、Opium、Primitive、Opyn 等,但目前期权市场还很小,被关注的不多。合成资产是由一种或多种资产/衍生品组合并进行代币化的加密资产,早期主要合成 DAI、WBTC 等数字资产,后面基于现实世界中的股票、货币、贵金属等的合成资产也越来越多,目前该赛道的龙头项目是 Synthetix,另外还有 Mirror、UMA、Linear、Duet、Coinversation 等项目。DeFi 的利率衍生品主要是基于加密资产利率开发不同类型的衍生产品,以满足 DeFi 用户对确定性收益的不同需求,主要玩家有 BarnBridge、Swivel Finance、Element Finance 等。接着来看看借贷,这也是 TVL 很高的一个版块,和 DEX 一样也是 DeFi 的基石。这块的借贷协议主要有 Compound、Aave、Maker、Cream、Liquity、Venus、Euler、Fuse 等。目前,大部分借贷协议都是采用超额抵押的借贷模型,所谓超额抵押,举个例子,比如,要借出 80 美元的资产,那至少需要存入价值 100 美元的抵押资产,即抵押资产价值要高于借贷资产价值。虽然超额抵押模型是主流,但也存在几个创新方向:无息贷款、资产隔离池、跨链借贷、信用贷。无息贷款的代表为 Liquity,用户在 Liquity 借出其稳定币 LUSD 的时候,用户一次性支付借款和赎回费用,借出后无需支付利息。资产隔离池就是将不同的借贷资产分开为不同的池子,每个借贷池都是独立的,避免一个不良资产或者一个池子受损导致整个平台都被连累。目前,资产隔离池差不多已经成为了标配,很多借贷协议都引入了这种模式,除了一开始就使用这种模式的 Fuse,包括 Compound、Aave、Euler 等协议也都加入了阵营。跨链借贷也是一个新趋势,Flux、Compound、Aave 等都在这个方向上进行拓展。信用贷在传统金融非常普遍,但在 DeFi 领域还比较少,主要是还缺乏有效的链上信用体系,目前的代表项目是 Wing Finance。下一个是聚合器,DeFi 聚合器也分为好几种类型:DEX 聚合器、收益聚合器、资产管理聚合器、信息聚合器。DEX 聚合器,主要就是将多个 DEX 聚合到一起,通过算法从中寻找出最优的交易路径,主流的 DEX 聚合器包括 1inch、Matcha、ParaSwap,以及 MetaMask 钱包内置的 MetaMask Swap 等。收益聚合器主要有 Yearn Finance、Alpha Finance、Harvest Finance、Convex Finance 等,主要就是聚合各种流动性挖矿,让参与多平台的 Yield Farming(收益耕作)实现自动化。资产管理聚合器主要就是监控、跟踪和管理 DeFi 用户的资产和负债,主要以 Zapper 和 Zerion 为代表。最后是信息聚合器,主要包括 CoinMarketCap、DeFiPulse、DeBank、DeFiPrime 等平台。另外,这些其实都是中心化数据平台,但其在 DeFi 生态里依然扮演了重要角色,DeFi 生态里并非全都是去中心化的应用。然后,再简单聊聊保险。我们知道,保险在传统金融中是非常大的一块市场,但 DeFi 里的保险发展至今,却是非常缓慢。整个 Web3 行业里,各种风险很多,协议漏洞风险、项目跑路风险、监管风险等,所以实际上对 DeFi 保险的需求市场本身很大,但因为开发设计门槛高,且流动性比较低,所以才导致整个保险赛道发展缓慢,目前依然处于非常早期的阶段,Nexus Mutual、Cover、Unslashed、Opium 等项目是该领域主要的玩家。然后,再看看预测市场。预测市场是依托数据的市场,可用于押注和预测未来的所有事件,也是以太坊生态最早出现的应用场景之一,并在 2020 年美国大选中迎来爆发式增长,主要项目有 PolyMarket、Augur、Omen 等。最后就是指数板块,提供一揽子资产敞口的指数基金在 DeFi 领域逐渐兴起。但广为人知的指数其实并不多,主要有:DPI、sDEFI、PIPT、DEFI++。DPI 全称为 DeFi Pulse Index,是由 DeFi Pulse 和 Set Protocol 合作创建的,是一种市值加权指数,包含了一些主流 DeFi 协议代币作为基础资产,包括 Uniswap、Aave、Maker、Synthetix、Loopring、Compound、Sushi 等。DPI 可以赎回为一揽子基础资产。sDEFI 则是由 Synthetix 所推出的指数代币,是该领域历史最悠久的指数。sDEFI 是一种合成资产,它不持有任何基础代币,而是使用预言机喂价来跟踪代币价值。PIPT 全称为 Power Index Pool Token,是由 PowerPool 所发行,由 8 种代币资产所组成。PowerPool 发行的指数除了 PIPT,另外还有 Yearn Lazy Ape Index、Yearn Ecosystem Token Index 和 ASSY Index 三个指数。DEFI++ 则是由 PieDAO 所发行,其组成有 14 种资产。PieDAO 还发行了 BCP 和 PLAY,BCP 由 WBTC、WETH、DEFI++ 三种代币组成,PLAY 则由一些元宇宙项目的代币所组成。GameFiGameFi 从字面上理解就是 Game Finance,是游戏和金融的融合体,也是目前 Web3 游戏的代名词。GameFi 这个词语诞生之前,Web3 游戏则通常被称为区块链游戏,或简称链游。CryptoKitties 是第一款广为人知的区块链游戏,这是一款虚拟养猫的养成类游戏,每一只猫咪都是一个独立的 NFT。初代猫咪总共有 50000 只,每只猫咪都有不同的属性。玩家购买猫咪 NFT 后,就可以开始玩繁殖小猫的游戏。生出来的小猫咪,有部分基因属性会遗传自上一代,而有些基因则随机生成。生出来的猫咪本质上就是新的 NFT,可以卖出变现。如果生成的新猫咪产生了稀有的基因属性,还可以卖到不错的价格。截止撰文之日(2023 年 1 月底),已经产生了 2,021,774 只猫咪,持有的钱包地址有 136,283。继 CryptoKitties 之后,越来越多养成类游戏陆续出现,如加密狗、加密兔、加密青蛙等等。打破这种局面的是一款叫 Fomo3D 的游戏,这是一款公开、透明、去中心化的博彩资金盘游戏。游戏规则也简单,用户通过支付 ETH 购买 Key 参与游戏,用户支付的 ETH 会分配到奖池、分红池、空投池、官方池等。拥有 Key 则可以得到持续的分红,拥有的 Key 越多,则得到的分红会越多。且每轮游戏存在一个倒计时(24 小时),倒计时结束时,最后一个购买 Key 的玩家可以获得奖池里大部分的 ETH。但每次有用户购买 Key,则倒计时剩余时间会增加 30 秒。第一轮游戏持续了很久时间,最后被人用技术手段赢走了奖池。Fomo3D 爆火之后,也是各种优化升级版的同类游戏不断出现,但事实证明,这类游戏还是无法持久。而之后,再次引爆市场的游戏则是 Axie Infinity,国内则被称为“阿蟹”(与 Axie 谐音)。这是一款结合了宝可梦和加密猫玩法的游戏,游戏里的 Axies 可以升级、繁殖、对战、交易等。与加密猫等游戏不同的是,Axie Infinity 的经济系统里还引入了 SLP 和 AXS 代币,玩家可通过战斗赢取 SLP 代币,而通过消耗 SLP 和 AXS 可以繁殖新的 Axies,赢取的 SLP 代币和繁殖出来的 Axies 都可以在市场上出售来赚取收入。不过,Axie Infinity 其实在 2018 年就已经问世,但直到 2021 年才开始爆红,让其爆红的主要原因在于它的 Play-To-Earn 模式被推广开来了,即边玩边赚的特性呈病毒式传播了。其赚钱路径主要是先投入成本购买 Axies,然后通过玩游戏赚 SLP 代币和繁殖新的 Axies,再把 SLP 代币和 Axies 出售换成 ETH 或稳定币,最终将 ETH 或稳定币换成法币。这种赚钱模式一开始是从菲律宾逐渐流行起来的,当时,新冠疫情爆发,菲律宾当地许多人陷入了无收入的困境,而 Axie Infinity 的边玩边赚特性让这些人看到了希望。而且,这种赚钱模式也吸引了众多打金工作室,且逐渐从菲律宾扩展到了印度、印度尼西亚、巴西、中国等。截止撰文之日,日活用户已达 280 万。而现在,边玩边赚模式几乎成为了 Web3 游戏的标配。其他比较知名的游戏还有 Decentraland、The Sandbox、Illuvium、Star Atlas、Alien Worlds 等。这些就不展开说了,感兴趣的可以自行去搜索了解。SocialFiSocialFi 顾名思义就是 Social Finance,是社交和金融在 Web3 领域的有机结合,其实就是去中心化社交,是近两年才开始流行的概念。目前,在这个赛道的知名项目还比较少,目前的龙头是 Lens Protocol。Lens Protocol 是由 Aave 团队所开发的,在 2022 年 5 月上线。它不是一个独立的社交应用,也不是一个带有前端的完整社交产品,而是提供了一系列模块化组件的社交图谱平台,而具体的应用产品可以采用这些组件去构建。所以,Lens 的定义其实是 Web3 社交应用的基础设施。上线之初就已经拥有了 50 多个生态项目,比较热门的有 Lenster、Lenstube、ORB、Phaver、re:meme、Lensport、Lensta 等。Lenster 是去中心化社交媒体应用,可以通过连接 Web3 钱包并使用 Lens 来登录。登录用户就可以在 Lenster 发布内容,和在微博或推特发布内容类似,不同的是,在 Lenster 上发布内容时可选择收费。也可以评论其他用户的内容,不过目前还不支持层级式的评论。Lenstube 则是去中心化视频平台,可以理解为就是去中心化的 Youtube。ORB 是去中心化职业社交媒体应用,具有端到端链上信誉系统。具体来说,ORB 可以通过将各种 NFT 和 POAP 与用户经验、教育、技能和项目联系起来,从而创建个人去中心化专业档案并建立链上可信度,以及探索工作机会和申请链上身份,还可以用在链上分享自己的想法,与 Web3 人士建立联系并构建社区。此外,ORB 还允许用户利用碎片化时间通过学习 Web3 知识来获取 NFT,即 Learn-to-Earn。Phaver 是一款适用于 iOS 和 Android 的 Share-to-Earn 社交应用,用户可以发布帖子,内容可以是图片、链接、产品应用等。用户还可以浏览 Lens 内的所有内容。Lens Profile 用户连接钱包后,还可以通过 Phaver 直接发布帖子到 Lens 中。re:meme 是一个链上 meme 生成器,允许用户上传 meme 模版,也能选择是否收费,然后其他人可以用图像编辑器添加文本、绘图和补充图像等。:meme 还可以扩展到音乐、视频和学术论文等媒体格式。Lensport 是一个只聚焦于 Lens 协议的社交 NFT 市场,用户可以发现、发布和出售帖子,也可以投资支持创作者。Lensta 是一个聚焦于 Lens 协议的图片流应用,可以浏览 Lens 中带有图片的最新、最热门以及 Lenster、Lensport 等上收集费用最多的帖子。访问层访问层是 Web3 组成架构里的最上层,也是直接面向终端用户的入口层。这一层里主要包括钱包、浏览器、聚合器等,另外,有一些 Web2 的社交媒体平台也成为了 Web3 的入口。先来看看钱包,这也是最主要的入口。目前的钱包有多种分类,有浏览器钱包、手机钱包、硬件钱包、多签钱包、MPC 钱包、智能合约钱包等。浏览器钱包就是通过网络浏览器使用的加密钱包,是大部分用户使用最广泛的钱包,最常用的就是 MetaMask、Coinbase Wallet、WalletConnect 等。MetaMask 是最被广泛支持的钱包之一,支持所有的 EVM 链,也已经成为了所有 DApps 的标准,目前支持的浏览器包括 Chrome、Brave、Firefox、Edge,以浏览器插件的方式存在。Coinbase Wallet 顾名思义是由交易所 Coinbase 所发行的钱包,于 2021 年 11 月推出后迅速发展,成为了与 MetaMask 旗鼓相当的对手,但浏览器还只支持 Chrome。WalletConnect 则比较特殊,它并不是一款具体的钱包应用,而是连接 DApps 和钱包的开源协议。最常用的就是用于连接手机钱包,在浏览器上的 DApp 选择连接 WalletConnect,会展示一个二维码,用你的手机钱包扫这个二维码就可以授权你的手机钱包连接上浏览器上的 DApp。而且,WalletConnect 支持所有区块链,不只是 EVM 链,也支持接入所有钱包。另外,不像 MetaMask 和 Coinbase Wallet 需要安装其浏览器插件,WalletConnect 不需要安装浏览器插件,所以可以支持所有浏览器,比如也支持 Safari,而 MetaMask 和 Coinbase Wallet 是不支持 Safari 的。因此,WalletConnect 成为了最受欢迎的钱包,也成为了所有 DApp 接入钱包的标配。手机钱包,即移动端数字资产钱包,很多钱包都支持。MetaMask 和 Coinbase Wallet 也有手机端的钱包 App。另外,比较知名的手机钱包还有 TokenPocket、BitKeep、Rainbow、imToken、Crypto.com 等。大部分流行的手机钱包都支持多链,包括 EVM 链,也包括 Non-EVM 链,比如 TokenPocket 目前支持了 Bitcoin、Ethereum、BSC、TRON、Polygon、Arbitrum、Avalanche、Solana、Cosmos、Polkadot、Aptos 等。硬件钱包则是把数字资产私钥存储在安全的硬件设备中,与互联网隔离,可通过 USB 即插即用。现在使用最广泛的硬件钱包是 Ledger 和 Trezor。Ledger 目前有三款不同型号的硬件钱包:Ledger Stax、Ledger Nano X、Ledger Nano S Plus。Ledger Stax 是在 2023 年才推出的新型号,支持触摸屏,而另外两款则不支持。Trezor 则有两款型号:Trezor Model T 和 Trezor Model One。Model T 支持触摸屏。除了 Ledger 和 Trezor,市面上的硬件钱包还有 SafePal、OneKey、imKey、KeepKey、ColdLar 等。多签钱包,顾名思义,是指需要多人签名才能执行操作的钱包。最知名的多签钱包就是 Gnosis Safe,其本质上是一套链上智能合约,最常用的就是 2/3 签名,即总共有三个用户共同管理钱包,每次执行操作时,需要这三人中至少两个人的签名才能触发链上执行。MPC 全称为 Multi-Party Computation,MPC 钱包也称为多方计算钱包,是新一代钱包类型,通过对私钥进行多方计算在链下实现多签和跨链等复杂的验证方式。简单来说,就是将私钥拆分成多个分片,然后由多方各自存储管理每个分片,签名的时候,再联合多方将分片重新拼接成完整的私钥。MPC 钱包与多签签名很类似,也可以实现 2/3 签名,不同的是,多签钱包是在智能合约层面实现签名校验,而 MPC 钱包则是通过链下计算实现的。目前已提供 MPC 钱包服务的还不多,主要有 ZenGo、Safeheron、Fordefi、OpenBlock、web3auth 等。智能合约钱包就是使用智能合约账户作为地址的钱包,多签钱包 Gnosis Safe 也属于智能合约钱包。而近一两年对智能合约钱包最新的尝试则是结合「账户抽象(Account Abstraction)」的新一代钱包。账户抽象主要是要将签名者和账户分离开来,钱包地址不再与唯一的私钥强绑定,可以实现更换签名者,也可以实现多签,还可以实现更换签名算法。目前在这个赛道的选手除了 Gnosis Safe 还有 UniPass、Argent、Blocto 等。钱包暂时就聊这么多,接着来说说浏览器。很多 DApp 都还是只提供了网页版本的前端,所以浏览器就成为了重要的访问入口。但因为不是所有浏览器都支持钱包扩展插件,所以也不是所有浏览器都能成为很好的 Web3 入口。最常用的浏览器是 Chrome,所有浏览器钱包都会开发 Chrome 的钱包插件。而 Safari 则很少用做 Web3 DApp 入口,因为除了 WalletConnect,没有其他浏览器钱包能够支持。还有一个值得介绍的浏览器是 Brave,这是一款内置了钱包的浏览器,其内置钱包叫 Brave Wallet。有一些聚合器也是 Web3 的访问入口,比如 DappRadar 收集了各种 DApps,用户可以通过它浏览并连接到这些 DApps。还有 Zapper、DeBank、Zerion 之类的聚合器,可以帮助用户追踪他们在各种 Web3 应用的所有资产和操作记录。最后,像 Twitter 和 Reddit 这类 Web3 的社交媒体平台,因为聚集了很多 Web3 社群,也逐渐变成了 Web3 的访问入口。文章首发于「Keegan小钢」公众号:万字长文聊聊Web3的组成架构
2023年03月06日
5 阅读
0 评论
0 点赞
2023-03-06
Damus 是什么以及我怎么看
2023 年 2 月 2 日,一串以 npub 开头的字符串开始在各类社交应用中悄然传播,在我的记忆里,这似乎不是第一次,人们从产生好奇和疑问开始,涌入一款产品。本篇文章旨在为各位科技行业从业者介绍这一串字符背后产品的相关信息,并分享我的看法。希望能够满足一些读者朋友的好奇,也欢迎大家各抒己见,一起理性探讨。提示:请不要在评论区讨论关于某个国家和地区政策的政论性内容。请仔细斟酌本话题中可以讨论的边界。封面图片来源:dailycoin.com/damus-power…1. 一串字符背后编程行业从业者应该在看到 npub 开头的一串字符,就推测出这是一串「公钥」,应该是与加密技术相关的某个产品。事实也的确如此,这一串字符背后的产品即是基于 Nostr 协议的社交网络应用 Damus。该产品历经波折,终于于昨日(2023 年 2 月 2 日)成功上架 iOS 平台,并在上架不久后,迅速吸引大量用户注册。是什么让 Damus 如此具有吸引力呢?要回答这个问题,我们需要知道产品背后的 Nostr 协议,并理解该协议为我们提供了什么样的机会。1.1 Nostr 协议Nostr 协议是「Notes and Other Stuff Transmitted by Relays」的首字母缩写[1],即通过「中继器」传输文本和其他类型资源,并通过「加密密钥对」(cryptographic keypairs)保护数据安全的一种数据传输协议。无需多言,该协议的关键在于「中继器」和「加密密钥对」两个概念,下面将分别介绍:中继器的功能与我们所熟知的服务器相同,负责存储数据,并提供数据读取服务。但与服务器不同的是,它不被任何一个机构或个人所私有,网络中的任何人都可以在自己的设备中架设中继器,以向他人提供服务。这就意味着基于 Nostr 协议的任何应用都是「去中心化」的,其内容理论上无法被删除。而「加密密钥对」则是一种常见的数字加密技术,通过用户保留私钥,公开公钥的方式对数据进行加密,从而保障数据不被篡改(HTTPS 即使用到该技术)。在 Damus 中,甚至通过私钥来标识个人 ID,这意味着您无需提供邮箱,手机号或通过第三方社交账号进行注册。通过上面的介绍,您应该能感受到,Nostr 协议与同时代的前沿应用一样,都基于「去中心化」的思想,试图通过构建一个强加密的类 P2P 网络,来避免某个中央服务器管理机制带来的强制审查,广告税[附录 4.1]和影子禁令[附录 4.2]。1.2 基于 nostr 的 Damus现在您应该明白 Damus 是基于 nostr 的一款产品,这意味着 Damus 继承了 nostr 去中心化的思想。从 Damus 的官网,您可以看到 Damus 对外宣称的如下特性:去中心化:意味着您的数据不会被审查,不会被删除并且理论上会被永久保留; 端到端加密:意味着您的信息很能被第三方获取或篡改; 无需注册:通过基于私钥认证身份 ID,您注册账户无需提供任何个人信息(但另一方面,这也暗示了服务器有遭受女巫攻击的可能[附录 4.3]); 可编程:您可以通过 API 将 Damus 集成至您的应用; 支持加密货币:您可以使用区块链货币为您喜欢的作者或内容付费; 可以看到,目前为止 Damus 就是 nostr + 区块链货币技术的融合产品。其目标消费群体为:加密货币使用者; 中心化审查的厌恶者; 此外,还需要注意的是,Damus 并不是唯一一个基于 nostr 的产品,更多相关产品可以移步查看该链接。2. 我对 Damus 的看法自区块链兴起以来,「去中心化」的概念就在互联网行业和投资界被反复提及,相关的产品也层出不穷,一定程度上,去中心化的概念也成为众说纷纭的 Web3.0 世界的精神内核。这反映了当前相当一部分人对现有中心化体制下,严格的内容审查机制与行业垄断的不满。从这个方面看,Damus 等类似的去中心化产品解决方案有其用户基础,并且从产品功能的实现上看,去中心化思潮下的各类技术基础设施,也趋于成熟,能够基于加密货币支撑起一个成熟产品的去中心化「平替」。而从 Damus 发布还没几天,就吸引众多用户通过类似口口相传的方式注册,使产品迅速在美国 iOS 社交网络类应用中排名第 10,甚至出现了「推特末日」这样危言耸听的媒体报道来看,市场和媒体都对这种去中心化「平替」产品抱持积极乐观的态度。虽然目前看来似乎一切都在向好的方面发展,但是我认为有一些潜在的风险仍需值得我们关注:2.1 政策性风险不可否认,当今世代的人们生活在一个拥有健全,成熟审查机制的网络环境中,这种情况有利有弊,并且利弊分明。虽然现今「去中心化」逐渐从一种概念变成了一种小众但强有力的思潮,但是从目前各类去中心化产品的发展现状来看,政策的不健全,或与部分国家,部分平台的部分政策相抵触,仍然使产品很有一个安稳的发展环境。此外,即使不考虑那些与产品立意产生对抗的政策,政策制定本身也有其惯性和滞后性,例如 Damus CEO 声称虽然 Damus 已经完全满足 App Store 的全部规范,但产品上架时间也比预期晚了数周。我们都知道互联网产品注重敏捷,政策性风险无疑会阻碍这种敏捷。2.2 核心用户不足互联网行业没有新鲜事,我们已经看过太多光鲜亮丽的产品横空出世,平地一声惊雷,但是没过多久就隐退在历史的长河中,不再有人问津。因此要考虑一个产品的生命力,我们不妨秉持第一性原则,思考这个产品究竟解决解决了用户什么需求痛点,我认为有以下两点:规避审查:影子禁令等审查制度的确令创作者感到沮丧,但是另一方面,有多在意审查这件事,取决于某个国家或地区审查机制的松紧,创作者的创作意图与心态。从这个角度来看,究竟有多少创作者愿意因为没有审查而转战 Damus 平台,又有多少创作者愿意持续在 Damus 上发表高质量内容从而吸引更多用户加入?这个问题的答案对于产品的未来发展至关重要。 提供加密货币支付方式:货币只有流通起来才有价值,继 NFT 之后,Damus 则为各类加密货币提供了又一个可流通的场所,但这里的问题是,加密货币本身是否足够安全可靠仍是一个值得广泛讨论的问题,因此通过加密货币进行结算的平台究竟能走多远,依然是个未知数。 所以,我认为 Damus 的核心用户应该是厌恶审查制度的创作者和加密货币的使用者(或者都是),而这类用户有多少?创作质量有多高?决定了该产品的未来发展高度。2.3 功能缺陷目前,Damus 并不支持图片的直接上传,使用图片时,需要使用图片链接,同时删除消息的功能还有 Bug。当然,对于一款刚刚上线的产品,我们或许不应该如此苛刻。但是从 nostr 原理上看,如何禁止负面,恶意的信息,如何防止女巫攻击等等影响用户体验和产品正常发展的关键问题,仍有待持续探索。理论上,在基于 nostr 协议的产品中创作,永远没有「删除」一说,互联网始终有记忆。而人类是一种会随着时间成长的生物,可能很多年后的思想已有翻天覆地的改变,但是由于 Damus 记忆力惊人,创作者仍有可能陷入某个中继服务提供者翻出以前的文章内容进行批判的窘境。创作者是否甘愿承受这样的风险,这也是一个因人而异的问题。3. 总结以上是我对最近兴起的去中心化社交产品 —— Damus 的简要介绍和一些思考分享。总的来说,和任何一款新产品一样,它新鲜有趣但却并不完美,它最终成功与否只能交给时间去评判。但通过了解 Damus 这款产品,我们可以保持我们对互联网行业的敏感,去有意识的训练我们的产品逻辑和商业思维。也许我们并不会成为一款产品的活跃用户,但始终了解行业最新动态,把握行业发展脉搏,是每一位互联网从业者的必备功课。希望各位读有所获,欢迎您在评论区和我分享您的看法,感谢您的阅读。3.1 一些思考题您是否愿意免费让渡您设备的计算资源,充当产品的「中继器」? 如果您发布的文章永远无法删除,这会鼓励您创作还是会是您在发表言论时三思而后行?当您确信没有人能对应现实生活中的您时,您的选择会有变化吗? 期待您的回复。4. 附录4.1. 广告税免费的就是最贵的。世上没有白得的午餐。大多数免费的商业应用,都通过推送广告的形式获取商业利润。在这个过程中,创作者的创作为用户有机会被广告吸引从而产生消费行为提供了土壤,而消费者则在免费阅读感兴趣的内容的同时,被迫消费自己的注意力或者是金钱来阅读或购买广告推荐的产品。我将这种模式称为免费内容平台的隐形「广告税」。请注意,我并不完全同意广告税在道德上处于不利地位,毕竟平台的运营需要资金支持,所以广告税的征收是否道德,需要视具体的情况而定。4.2 影子禁令影子禁令(shadow ban)又称秘密屏蔽,限流,是一种对网络社区上用户的审查方法。当平台对某个用户实施影子禁令时,用户通常难以察觉自己发布的内容实际上仅对自己可见,从而抑制了信息的传播。更多信息参见 wiki。4.3 女巫攻击女巫攻击(Sybil Attack)是指攻击者通过创建多个虚假的身份账户,伪装成唯一的用户,从而实行目标意图(例如 DDOS 攻击)的一种攻击方式。更多信息参见 wiki4. 参考资料github.com/nostr-proto… news.ycombinator.com/item?id=337…
2023年03月06日
6 阅读
0 评论
0 点赞
2023-03-06
聊聊Web3为什么能赚钱?为什么不要All in Web3?
Web3 是集各种技术之大成而形成的一种全新概念。Web3 之所以赚钱,是因为它不是特别透明,而且大多数项目似乎都有魔法。很多项目并没有那么高的价值,只是对其他项目进行 fork,然后换皮,或者换概念。换汤不换药。这种感觉和十几年前移动端兴起,各种垃圾 App 泛滥很相似。究其原因,是因为没有审查机制。Web3 的市场也没有形成正规化,很多人并没有那么了解 Web3,可以利用的套路还有很多。这个道理很简单:趁现在食品安全监管不严格,可以用地沟油赚钱。等食品安全监管严格之后,做餐饮自然没有之前赚钱了。另外,做 Web3 的人也少。早期 Web3 开发者少,DApp 也少,随便有一些创意,开发一些应用,都会有一定的概率获得用户、市场和关注。就像 98 年的互联网;08 年的移动互联网;改开年代的下海经商;抖音 B 站创作观看比例 1:100 的时代。这也就是为什么 Web3 是一个机会。但也不是任何一个 Web3 应用都可以随随便便赚到钱。也许可以利用一些抄袭、加杠杆套娃的脏玩法割一波韭菜,但这不是长久之计。君子爱财,取之有道。要想赚大钱,必须有价值。这和 Web2 时代的软件本质上没有什么区别,都需要满足两个条件:具备价值,能够很好地解决用户痛点。 做到极致,从一众应用中脱颖而出。 IPFS 就是一个非常典型的代表。但我仍然不建议 All in Web3,是因为 Web3 现在仍然有可能会归零。因为它还远远没有达到全民共识的程度。另外现在的 Web3 很多应用都有一些致命的漏洞,包括一些处于基石位置的基础设施。区块链的交易瓶颈,比如以太坊每秒只能结算交易 10+ 笔,但支付宝每秒支持 10万+ 笔。 区块链的存储瓶颈,BTC/ETH 这类区块链的链上数据实在是太贵了。 NFT 上面的 URL 容易被篡改,文字、图像、音视频并没有完全数字化。 很多项目总喜欢 Token 化,而大多数优质项目一旦 Token 化就会走向黑化。 以及更多...... 我们是一群立志改变世界的人。而 Web3 是未来世界一大变数,我们想帮助更多人了解 Web3,如果你对 Web3 感兴趣,可以添加我的微信:LZQ20130415,邀你入群,一起沉淀、一起成长、一起拥抱未来。
2023年03月06日
5 阅读
0 评论
0 点赞
2023-03-06
【区块链】HyperLedger Besu简介
在调研区块链技术时了解到现在大部分区块链都是用GoLang、C或C++、Nodejs来写。但对于我这个忠实的Java信徒来说还是希望能够有Java的解决方案。那有没有原生就适配Java的SDK或者客户端呢?有。fabric-sdk-java就是专门为HyperLedger Fabric提供的Java端SDK接口,虽然维护(提交)的人少但是活跃度一直都维持着的。那我又会想,有没有整个客户端都是由Java写的呢(我承认到这里就有点执着了,想整套解决方案都用Java实现)?最终在HyperLedger全家桶中我发现了Besu。这一年是2018年,我跟Besu的第一次相遇。Besu整个客户端都是通过Java编写使用的是Vert.x技术,利用了EventLoop(事件循环)解决异步上链的性能问题(这因为eth1.0的BFT机制引发的,后面会详细说明)。平心而论,在使用Besu的过程中并没有感觉到它比其他以太坊客户端差。1. Besu的前世今生Besu本不属于HyperLedger原名Pantheon,由ConsenSys的PegaSys团队提供维护的开源产品,而之后加入Linux基金会的开源区块链组织(HyperLedger)因此正式将Pantheon改名为Besu。在收购了摩根大通Quorum后Quorum将作为ConsenSys的GoLang解决方案继续延伸。2018年底ConsenSys官网上提供的基于Besu的解决方案如下:含有单独提供的Besu、Orion(现已有其他替代方案)、EthSigner(现已有其他替代方案)安装包,也有Besu Bundle以捆绑包的方式打包使用。如果您是不使用容器的情况下建议直接使用Besu Bundle来运行,因为所有的组件直接就整合完成一句脚本就可以简单运行起来。但本次我将使用到Docker来进行整合所以会单独下载对应镜像后再整合。2. PoA共识算法2.1 Besu特有IBTF2.0共识算法当初选择使用Besu的原因主要是对IBFT2.0共识算法感兴趣。目前所有基于PoA的共识算法来讲IBFT2.0在性能性和安全性上面取得了平衡。其实,一般来说IBFT1.0共识算法已经足够理想了,但是在理论上会存在缺陷。通过与两组验证者达成共识,拜占庭提议者可以在区块链同一高度上分配不同的区块,例如,如果网络有5个验证器,则IBFT 1.0只需同意3个节点,即可将下一个块添加到区块链。如下所示:拜占庭式提议者可以使用两组不同的验证器在不同的区块上达成共识,因此Besu开发团队提出了更为完善的IBFT2.0。2.2 IBFT2.0特点IBFT2.0由多个验证者组成验证者组,验证者能够通过投票来新增和删除验证者; 整个区块链中必须运行至少2/3的验证者才能继续创建块; IBFT2.0不允许派生,并且总会有一个主链。也就是说IBFT2.0能够在原生上解决双花问题,也不需要UTXO来解决; 由于它采用的PoA的共识算法模式,因此采用的是数据签名来保证区块的正确性; 由于IBFT2.0目前只有Besu能够支持,所以在项目应用上还需要多加考虑。毕竟Besu相比于Geth本来就是小众,社区和成熟度在国内都还在成长中,这要在实际项目中应用还需要长期的验证和考验; 2.3 Clique共识算法除IBFT2.0外Clique是另一种PoA共识算法。相比于IBFT2.0,Clique的使用范围更广。目前几乎所有的以太坊客户端都支持Clique,它具备以下特点:它是一种确保容错能力的保护算法,它最多可以接受一半的验证器失败,公式为: N-(N/2+1),推演节点如下图: 它跟IBFT2.0一样使用数字签名来密封这些块并实现数据不变性,且每个区块仅由一个签名(即提议者的签名)密封; 当以太坊GHOST协议整理出分叉时,Clique特别提供了最终的PBFT与PoA分析一致性; 由于多个以太坊客户端都支持使用Clique共识算法,所以Clique组成的区块链网络是可以接入不同的客户端的。譬如:我用的是Besu,你用的是Geth,他用的是Go Quorum。Geth和Go Quorum都可以通过配置信息无缝接入到Besu的Clique网络中; 3. PoW共识算法Besu中也提供了名为Ethash的PoW共识算法。但是一般来说企业应用不会使用PoW共识,哪怕私有链可以将gas limit变为0。因为企业应用一般来说都具备明确的接入节点信息和用户信息,在一般情况下上链的内容都应该是可控且清晰的。而PoW共识之所以要通过大量运算来保证区块的真实性原因在于在公链上无法得知接入人身份和目的,只能通过大量的算力来提高数据的安全性。安全性提高的代价就是资源被严重消耗。这些都与企业以成本控制为目的的理念相违背。因此PoW共识区块链很难在企业中使用甚至推广。除此之外,PoW算法还具备以下几个缺点:算力被严重消耗; 区块生成到后期难度会越来越大,这是因为区块的总量是有限的,剩余数量越少越难以发生碰撞; 普遍存在双花问题,只能通过DAG(有向无环图)和UTXO来解决; 只有节点数量庞大的时候才不会发生数据被重写的情况,这是因为要改写PoW节点数据至少要改写链上51%节点内数据。基于这种情况,如果区块链节点是3个的情况下,我只需要占领2个节点就可以篡改数据了。因此唯有节点量庞大的情况下数据在PoW节点中是安全的; 4. IBFT(伊斯坦布尔拜占庭容错算法)讲解为什么要讲解IBFT?因为IBFT容错算法应该是区块链中主流的容错算法了。就选几个重点来说:IBFT是建基于PBFT(实用拜占庭容错算法)修改优化的实现; 诞生原因在于保证即时的确定性,也就是意味着一旦将交易结果添加到的区块中,就可以保证它始终是区块链的一部分; 每个区块都需要一组验证者进行多轮投票才能达成共同协议,块上必须带有签名者的数字签名; 可以容灾节点极限为总量的1/3,具体如下图: ;验证者节点公式为:floor(N/2)+1,一般建议验证者个数>=4; IBFT使用三相共识机制“PRE-PREPARE”,“PREPARE”和“COMMIT”,这一点继承了原始PBFT,如下图: 在每个回合之前,都会从验证者池中挑选一个提议者(例如,以循环方式)。然后,提议者将提出一个新的整体提议,并将其与PRE-PREPARE消息一起广播。验证者从提议者接收到PRE-PREPARE消息后,进入PRE-PREPARED状态,然后广播PREPARE消息。此步骤是确保所有验证器都在相同的序列和相同的回合上工作。之后,接收到2F+1 PREPARE消息的验证器进入PREPARED状态,然后广播COMMIT消息。此步骤是告知其对等方它接受建议的块并将要插入到链中。最后,验证器等待2F+1的COMMIT消息进入COMMITTED状态,然后将块插入到链中;5. 各项横向对比5.1 算法对比| 对比参数 | PoW (Proof of Work 工作量证明) | PoA (Proof-of-Authority 权威证明) | PoS (Proof of Stake 权益证明) | PoET (Proof-of-Elapsed-Time 经过时间证明) | | --- | --- | --- | --- | --- | | 实现原理 | 采用Hash地址碰撞来获得区块,所以全网挖矿需要耗费大量的资源和算力 | 区块网络中将出现验证者角色而不是单纯的账号角色。链上网络、区块、数据都必须经过验证者验证方可自动执行 | 权益证明模式就是一个根据所持有货币的量和时间,来发利息的一个模式。 | 这是一种依赖硬件的共识算法。在每个节点都能获得在网节点的基础上,通过上一区块Hash随机抽签选出出块人 | | 硬件要求 | 要求CPU或GPU的浮点精度高,并且需要并行多路运算来计算区块Hash地址 | 硬件要求不高,与一般系统几乎无异,其中内存和磁盘空间根据使用技术的不同会略有差异 | 与PoW相比,虽然都需要挖矿,但是PoS不需要为了生成新区块而大量消耗电力,也在一定程度上缩短了共识达成的时间 | 采用 Intel® Software Guard Extensions (SGX) 来随机选出一个出块人(无法作弊) | | 适用场景 | 由于安全性高适用于主网比特币的挖掘 | EEA(企业区块链模式)略微中心化,普遍适用于私有链与联盟链使用 | 由于算法存在漏洞,在币圈中已经基本被淘汰 | HyperLedger Sawtooth中使用到此算法,多配套PoW算法用作供应链溯源 |除了上述的几个之外,还有PoC、DPoS等由于没有大规模使用所以就不再叙述了。综上所述可以看出基于PoA的共识算法应该是联盟链的首选。5.2 客户端对比对比参数GethHyperLedger Besu节点许可(节点连接)基于智能合约或基于文件。该合约包含可以加入网络白名单节点。基于智能合约或基于文件(本地强制)。该合约包含可以加入网络白名单节点。API权限没有内置对JSON RPC Api读写权限支持。使用链上许可(智能合约)支持账户白名单进行交易广播支持JWT Pub密钥或者通过JSON RPC Api身份验证和授权的用户。使用链上许可(智能合约)支持账户白名单进行交易广播身份验证公钥(易于分发,并可与任何基于EVM的链进行互操作)公钥(易于分发,并可与任何基于EVM的链进行互操作)交易达成共识排序、执行和验证排序、执行和验证共识算法Clique、IBFT1.0、RaftClique、IBFT2.0、Quorum IBFT1.0智能合约引擎EVMEVM智能合约语言Solidity,VyperSolidity,Vyper智能合约部署易于部署且不可变易于部署且不可变智能合约升级本地不支持。繁琐的编程模式用于迁移数据或更改实现本地不支持。繁琐的编程模式用于迁移数据或更改实现开发语言GoLangJava从上表可以看出若要做成开源且完整的Java解决方案,没有比HyperLedger Besu更适合的了。5.3 Clique与IBFT2.0对比对比参数CliqueIBFT2.0初始节点数X=N-(N/2+1),N为节点数,X为容错节点数,当节点数大于等于3的时候区块链网络才具备基本的容错能力X=(N/2)+1,N为节点数,X为容错节点数,当节点数大于等于4的时候区块链网络才具备基本的容错能力容错能力最多可以接受一半的签名者失败必须运行至少2/3的验证者才能继续块创建加密使用数字签名来密封这些块并实现数据不变性使用数字签名来密封这些块并实现数据不变性加密方式每个区块仅由一个签名(即提议者的签名)密封每个区块必须有66%的验证者签名密封速度快一般是否会出现分叉会不会能否异构客户端上链可以,目前Geth客户端也提供了Clique协议,可以通过Geth客户端进行上链操作。不可以,目前IBFT2.0是HyperLedger Besu的独有协议,其他客户端暂不支持。都是PoA共识,Clique和IBFT2.0各有优势,主要是看具体的业务场景。6. 后话其实个人觉得HyperLedger Besu区块链算是比较好部署和实施的区块链,当然在成熟度上面跟Geth还是无法比拟的,但是只要配置到位没有部署不起来的。所以如果出现无法部署的情况90%的可能性是因为配置文件出现问题了(经验之谈)。另外,现在网上大部分的Besu教程都是教如何通过二进制版本来部署的,很少有直接Docker部署估计大部分Docker在于异地组网的问题导致的。大家都知道区块链是一个分布式账本,若无法解决异地部署将会毫无意义。使用二进制发行版来部署只要有一个对公IP就可以了,成功率高且不用担心网络延迟问题推荐初学者可以通过这种方式快速部署。后面的分享我就不会过多介绍Besu概念性的东西了,主要说一下详细的实施过程告诉大家如何一步一步地搭建这个Besu区块链。
2023年03月06日
4 阅读
0 评论
0 点赞
2023-03-06
Delegate cash 合约分析
最近猴子游戏 Dookey Dash 很火,这个游戏可以看成神庙逃亡的下水道版本,跑得越远,分数越高。但是很多人手残(比如我),很难玩出高的分数,于是游戏代打很自然的出现的了。但是有个难处理的细节,代打的人如何获取到门票的授权?总不能直接把钱包给出去或者把游戏门票(Sewer Pass)转出去,这样太不安全了。在这里的关键就是怎么去证明你拥有这个资产的所有权,但是又不威胁到资产的安全。在这个过程中,我发现有一个合约很好地解决了这个问题,就是这个 Delegate Cash。这个合约可以解决很多场景下资产所有权的问题:比如上面的代打场景 保护资产安全,在加群或者领空投时,不想直接操作钱包 整个流程就是在 Delegate Cash 合约,你可以把自己的地址 A 代理给另外一个地址 B,B 拿到这个代理之后,能证明这些资产是属于你的,但是同时 B 合约无法操作 A 合约中的任何资产。这点很重要,这样即使 B 合约被钓鱼了或者私钥泄漏了,地址 A 中的资产也是安全的。 Delegate Cash 有三种代理模式:代理一个 token 代理一个合约地址 代理整个地址 // 代理整个地址 function delegateForAll(address delegate, bool value) external; // 代理某个合约地址 function delegateForContract(address delegate, address contract_, bool value) external; // 代理一个 token function delegateForToken(address delegate, address contract_, uint256 tokenId, bool value) external; 复制代码用户所有的代理信息都被存储在下面两个变量中:mapping(address => EnumerableSet.Bytes32Set) internal delegationHashes; mapping(bytes32 => IDelegationRegistry.DelegationInfo) internal delegationInfo; 复制代码delegationHashes 中存储的是相关代理信息(比如代理地址、被代理地址、被代理的合约或者 token)算出来的 hash, delegationInfo中存储的是这些信息的原文。绑定代理和解除代理都是通过下面这个方法来实现:function _setDelegationValues( address delegate, bytes32 delegateHash, bool value, IDelegationRegistry.DelegationType type_, address vault, address contract_, uint256 tokenId ) internal { if (value) { delegations[vault][vaultVersion[vault]].add(delegateHash); delegationHashes[delegate].add(delegateHash); delegationInfo[delegateHash] = DelegationInfo(); } else { delegations[vault][vaultVersion[vault]].remove(delegateHash); delegationHashes[delegate].remove(delegateHash); delete delegationInfo[delegateHash]; } } 复制代码如果 value 为 true,则是绑定代理,如果 value 为 false,则是解除代理。然后还提供了一系列的查询方法来检查代理关系是否存在。整体的逻辑就这些,相当简单。但是还存在一个小问题,如果在使用的过程中,绑定了很多代理关系,一个个去解绑就会浪费很多 gas,所以还需要一个一件解绑所有代理的功能,Delegate Cash 的实现相当巧妙。引入了下面两个 version 的 map,其中 valutVersion 记录的是地址的版本,在当前的合约实现中,这个 map 的值的返回值一直是 0,delegateVersion 中记录的是当前这次代理的版本。mapping(address => uint256) internal vaultVersion; mapping(address => mapping(address => uint256)) internal delegateVersion; 复制代码这两个 Map 中存储的版本信息在每次算代理信息 hash 的时候会被用到:function _computeAllDelegationHash(address vault, address delegate) internal view returns (bytes32) { uint256 vaultVersion_ = vaultVersion[vault]; uint256 delegateVersion_ = delegateVersion[vault][delegate]; return keccak256(abi.encode(delegate, vault, vaultVersion_, delegateVersion_)); } 复制代码所以在取消对某个地址的全部代理时,只需要对这个版本号加 1:function _revokeDelegate(address delegate, address vault) internal { ++delegateVersion[vault][delegate]; } 复制代码这样就会让后续检查代理时的 hash 对比都会失败,对应的代理关系也全部失效: if (delegationHash == _computeAllDelegationHash(vault, delegationInfo_.delegate)) { //.... } 复制代码后续在其他的 DAPP 中,如果要检查用户是否拥有某个资产,只需要来检查这个代理关系就可以:address requester = msg.sender; if (_vault != address(0)) { bool isDelegateValid = dc.checkDelegateForContract(msg.sender, _vault, NFT_CONTRACT); require(isDelegateValid, "invalid delegate-vault pairing"); requester = _vault; } 复制代码 通过这样的一个简单的合约,就可以在安全的情况下来证明用户是否拥有某个资产。这个也符合链上资产使用习惯,在大多数场景中,只需要证明资产是自己的,但很多人的资产就是在这个证明的过程中丢的。这个合约对 gas 的消耗很大,在使用的过程中,要尽量减少代理和取消代理的次数。参考链接[1]delegate.cash/[2]etherscan.io/address/0x0…
2023年03月06日
3 阅读
0 评论
0 点赞
1
...
9
10
11