架构
应用层
钱包-METAMASK
水龙头: 一、Ropsten测试网络 https://faucet.egorfine.com/ 每个地址每天只能获取一次 二、Kovan测试网
https://ethdrop.dev/
三、Rinkeby测试网 https://www.rinkebyfaucet.com/ 参考:https://blog.csdn.net/YM_1111/article/details/123324293
以太坊客户端(节点)
已经有 Ganache 工具,为什么还需要借助 Metamask?这是因为 Ganache 是用于开发调试的工具,并没有集成 Ropsten 测试网和 Mainnet 主网的链接功能。而 Metamask 中已经做了集成 当我们开始开发DApp,托管智能合约需要你建立一个你想托管它们的区块链节点,但这个过程不仅对刚刚开始Web3之旅的人来说很复杂;它也可能很耗时,需要大量的处理能力来完成。 这就是Infura和Alchemy这样的平台所要解决的问题。从本质上讲,它们是节点提供者;也就是说,它们提供对区块链服务的远程访问,所以你不必运行自己的节点。(https://zhuanlan.zhihu.com/p/514654991)
1、Ganache(本地)
Ganache 继承了原来的 Test-RPC的使命,作为测试环境里的模拟区块链而存在。(其实 Ganache 也就是旧的 Test-RPC 项目换了一个名字而已)【在开发过程中,我们推荐使用以太坊区块链的私有链 Ganache (只有几百 M),免去同步以太坊全部区块数据的麻烦】
HTTP://127.0.0.1:7545 1337 CPAY
(参考:https://blog.csdn.net/weixin_43958804/article/details/109601153)
2、Geth(本地)
典型的以太坊客户端【Geth(Go Ethereum ) 会一直同步以太坊区块链上的所有数据。目前 fast 同步模式下,数据量已经有近 70G;full 同步模式下,已经达到了几百 G】,在开发过程中,我们推荐使用以太坊区块链的私有链 Ganache (只有几百 M),免去同步以太坊全部区块数据的麻烦
(参考:https://ethereum.org/zh/developers/tutorials/run-light-node-geth/)
3、Parity
Parity是完整节点以太坊客户端和DApp浏览器的实现
(参考:https://github.com/paritytech/parity/wiki/Setup)
4、Alchemy(线上)
5、Infura(线上)
通过 Ganache 部署成功并进行了初步校验后,我们需要将合约部署到 Ropsten 测试网,及 Mainnet 主网。这里我们推荐使用 Infura。
Infura 提供了托管的以太坊节点,不再需要我们消耗大量的磁盘空间和时间来搭建本地节点。同时,它为我们的 DApp 应用提供了以太坊节点支持,我们通过 API 和开发人员工具就可以安全、可靠和可扩展的访问以太坊节点。
HDWalletProvider
将合约部署到区块链(不论主网还是测试网)上,都会产生一笔 Transaction。而这笔 Transaction 需要通过外部账户支付 Gas,同时进行交易签名。这里我们需要借助 HDWalletProvider 工具。HDWalletProvider 是一个独立的 npm 软件包,可以处理交易签名以及与以太坊网络的连接。
Network ID以太坊网络 Mainnet //主网 Morden test network //Morden 测试网(已废弃) Ropsten test network //Ropsten 测试网 Rinkeby test network //Rinkeby 测试网 Kovan test network //Kovan 测试网
heroku
登录:https://signup.heroku.com/
Heroku是一个支持多种编程语言的云平台即服务。目前支持Ruby、Java、Node.js、Scala、Clojure、Python、PHP和Perl等语言,基础操作系统是Debian。
Pinata
登录:https://app.pinata.cloud/pinmanager
Dapp开发框架
Truffle
Truffle 是目前最流行的 DApp 开发框架,它可以帮我们处理掉很多繁琐的事情,让我们更专注于智能合约的开发,迅速开始编码 -> 编译 -> 部署 -> 测试 -> 打包 DApp 的流程。 官方:https://trufflesuite.com/docs/truffle/quickstart/ 中文翻译:https://learnblockchain.cn/docs/truffle/ Truffle的基础使用: https://blog.csdn.net/david2000999/article/details/120472092
Truffle常用命令:
truffle init
truffle build
truffle compile
truffle console
truffle migrate
--reset: 从头运行所有的移植。
--network 名称:指定要使用的网络,并将编译后的资料保存到那个网络。
--to number:将版本从当前版本移植到序号指定的版本。
--compile-all: 强制编译所有的合约
--verbose-rpc:打印Truffle与RPC交互的详细日志。
truffle exec
truffle serve
-p port: 指定http服务的端口。默认是8080。
--network 名称:名称:指定要使用的网络,并将编译后的资料保存到那个网络
truffle watch
Hardhat
经常与之对比的是 Hardhat vs Truffle(https://trufflesuite.com/)。相比其它作为web3基础设施的开发工具,Hardhat 更加轻量,采用插件化的思想,非常适合作为新手dapp开发入门的工具。
web3
为了便利Web端和区块链进行交互,我们需要一个JS API来实现这个功能,他就是web3.js,它提供了各种接口来实现和区块链以及智能合约的交互。
react.js、vue.js 或 angular.js 是很好的 javascript 前端框架,因为它们可以使用 ethers.js 或 web3.js 轻松与区块链网络集成。
账户
一个以太坊帐户是一个具有以太币 (ETH) 余额的实体,可以在以太坊上发送交易。 帐户可以由用户控制,也可以作为智能合约部署。 以太坊有两种帐户类型:
- 外部持有 – 私钥的所有者控制
- 合约 – 一种由代码控制,部署在网络上的智能合约。 了解智能合约。
这两种帐户类型都能:
- 接收、持有和发送 ETH 和 token
- 与已部署的智能合约进行交互
主要区别
外部持有(EOA)
- 创建帐户是免费的
- 可以发起交易
- 外部所有的帐户之间只能进行 ETH 和代币交易
合约(CA)
- 创建合约存在成本,因为需要使用网络存储空间
- 只能在收到交易时发送交易
- 从外部帐户向合约帐户发起的交易能触发可执行多种操作的代码,例如转移代币甚至创建新合约
GAS
Gas 即矿工费。以太坊上每笔交易的执行(被矿工打包)都会被收取一定数量的 Gas
1eth=10^18wei ; 1wei=10^9gwei
GasLimit:愿意支付矿工费的上限。 GasPrice:矿工费单价。
gas = GasLimit * GasPrice
以太坊虚拟机(EVM)
EVM 即以太坊虚拟机,全称是 Ethereum Virtual Machine。它是以太坊智能合约的运行环境
EVM 是由以太坊节点提供。每个以太坊节点中都包含 EVM。
Solidity 之于 EVM,就像 Java 跟 JVM 的关系一样。
以太坊虚拟机是一个隔离的环境,在 EVM 内部运行的代码跟外部没有联系
智能合约
【智能合约 —— dapp 的后端,因为缺少更好的术语。 有关详细概述,请访问我们的智能合约部分。一旦部署无法更改】智能合约只是一个运行在以太坊链上的一个程序。 它是位于以太坊区块链上一个特定地址的一系列代码(函数)和数据(状态)。智能合约也是一个以太坊帐户,我们称之为合约帐户(以数字形成定义的能够自动执行条款的合约)智能合约之于区块连,相当于SQL之于数据库
合约编译
以太坊虚拟机上运行的是合约的字节码,类似于汇编语言。这就需要我们在部署之前先对合约进行编译,转换成字节码。
合约部署
合约部署后,当需要调用这个智能合约的方法时,只需要向这个合约账户发送消息(交易)即可,通过消息触发后智能合约的代码就会在 EVM 中执行了。
合约运行
合约部署后,当需要调用这个智能合约的方法时,只需要向这个合约账户发送消息(交易)即可,通过消息触发后智能合约的代码就会在 EVM 中执行了。
开发语言
Solidity (推荐)
参考: https://solidity-by-example.org/ https://solidity-cn.readthedocs.io/zh/develop/
OpenZeppelin
OpenZeppelin 是Solidity语言的一个可重复使用且安全的智能合约的开放框架。他的意义有两个:
- 把合约开发一些通用的组件开发出来,可以方便地复用
- 合约组件经过严格的测试,至今未出现漏洞
数据存储
IPFS(星际文件系统)
是一个分布式文件系统协议。协议定义了文件在分布式系统中如何存储、索引、传输。目标是通过一个文件系统将网络中的所有的设备连接在起来 https://dist.ipfs.io/#go-ipfs https://www.cnblogs.com/coderzjz/p/14924489.html https://segmentfault.com/a/1190000040697342
Swarm
——以太坊官方推出的分布式存储项目 https://swarm-guide.readthedocs.io/en/latest/#
DApp
去中心化应用 (dapp) 是在去中心化网络上构建的应用程序,结合了智能合约(可以包含其他人的智能合约)和前端用户界面。dapp 可以用任何语言编写(就像是一个 app)。它有前端代码(可以托管在去中心化存储上)和用户界面,能调用其后端。
以太坊的github上,有一个dapp-bin的目录(https://github.com/ethereum/dapp-bin),有一些文档和示例。使用前,你需要看看文件最近的状态,因为他们将很可能已经被淘汰。
架构
DApp的组件:
- 1、区块链(智能合约);
- 2、前端(Web用户界面(UI))【Web前端技术(HTML,CSS,JavaScript)】;
- 3、数据存储【由于gas成本高,智能合约目前不适合存储大量数据。因此,大多数DApps将利用去中心化存储(如IPFS或Swarm)来存储和分发大型静态资产,如图像,视频和客户端应用程序(HTML,CSS,JavaScript)。内容的哈希值通常使用键值映射存储为智能合约中的字节。然后,通过你的前端应用程序调用智能合约检索资产,以获取每个资产的URL。】
虽然也可以创建移动DApp,但由于缺少可用作具有密钥管理功能的轻客户端的移动客户端,目前没有创建移动DApp前端的最佳实践。
开发流程
开发工具
IDEA
Atom 或是 IntelliJ IDEA 系列的 WebStorm [安装支持 Solidity 语法的插件。]
在线Remix
https://remix.ethereum.org
使用教程:https://ethereum.org/zh/developers/tutorials/deploying-your-first-smart-contract/ 离线版本:https://github.com/ethereum/remix-desktop/releases)
入门demo
https://download.csdn.net/download/wenwang3000/86734459 (写文章的时候,上传的代码还在审核中)
以太坊开发DApp实战
- Web前端:web前端使用HTML/CSS/JavaScript开发,其中大量使用了web3js来访问区块链。用户将会通过这个前端应用来访问以太坊、IPFS和NodeJS服务器。
- 以太坊区块链:这是去中心化应用的核心,所有的代码(电商合约、资金托管合约)和交易都存储在链上,这包括所有的商品信息、买家的出价信息、商品竞价结果、资金流向投票结果等。
- MongoDB:尽管核心数据存储在区块链上,但是为了方便买家对商品的检索和查询,例如只显示某一类的商品,或者显示即将过期的商品等等,我们会用MongoDB数据库来同步地存储和检索商品信息。
- NodeJS服务器:这是后端服务器,我们会利用它给前端提供REST风格的API来查询商品, 同时,也利用它来响应对前端静态页面的请求。
- IPFS: 当卖家上架一个商品时,前端会商品图片文件和介绍文本上传到IPFS,并将所上传文件的哈希值存到链上。
(1)前端使用一个HTML表单来采集用户输入的商品细节,例如起拍价、商品图片、描述信息等。 (2)(3) 前端将商品图片和介绍文本上传到IPFS,并返回所上传内容对应的链接(哈希)。 (4)(5) 然后,web前端会调用电商合约将商品信息和IPFS链接存储到链上。当合约成功地将商品存入区块链后,就会触发一个事件,该事件中包含了商品所有的信息。 (6)(7)(8) NodeJS服务器监听区块链事件,当事件被电商合约触发时,服务器读取事件内容并将商品信息插入到MongoDB数据库中。
|