以太坊开发入门--相关知识点说明

Posted 青龙小码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以太坊开发入门--相关知识点说明相关的知识,希望对你有一定的参考价值。

架构

应用层

钱包-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常用命令:

#在当前目录下初始化一个全新的APP
truffle init
#构建一个开发中的app版本,创建.build目录。
truffle build
#编译 --compile-all: 强制编译所有合约  
#    --network 名称:指定使用的网络,保存编译的结果到指定的网络上
truffle compile
#运行一个控制台,里面包含已初始化,且随时可用的合约对象。
truffle console
#移植(部署)
truffle migrate
        --reset: 从头运行所有的移植。
        --network 名称:指定要使用的网络,并将编译后的资料保存到那个网络。
        --to number:将版本从当前版本移植到序号指定的版本。
        --compile-all: 强制编译所有的合约
        --verbose-rpc:打印Truffle与RPC交互的详细日志。
#在Truffle的环境下执行一个javascript文件 truffle exec /path/to/my/script.js   
truffle exec        
#在http://localhost:8080提供编译的app对应的服务,且在需要的时候自动构建,自动部署
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实战

  1. Web前端:web前端使用HTML/CSS/JavaScript开发,其中大量使用了web3js来访问区块链。用户将会通过这个前端应用来访问以太坊、IPFS和NodeJS服务器。
  2. 以太坊区块链:这是去中心化应用的核心,所有的代码(电商合约、资金托管合约)和交易都存储在链上,这包括所有的商品信息、买家的出价信息、商品竞价结果、资金流向投票结果等。
  3. MongoDB:尽管核心数据存储在区块链上,但是为了方便买家对商品的检索和查询,例如只显示某一类的商品,或者显示即将过期的商品等等,我们会用MongoDB数据库来同步地存储和检索商品信息。
  4. NodeJS服务器:这是后端服务器,我们会利用它给前端提供REST风格的API来查询商品, 同时,也利用它来响应对前端静态页面的请求。
  5. IPFS: 当卖家上架一个商品时,前端会商品图片文件和介绍文本上传到IPFS,并将所上传文件的哈希值存到链上。

(1)前端使用一个HTML表单来采集用户输入的商品细节,例如起拍价、商品图片、描述信息等。
(2)(3) 前端将商品图片和介绍文本上传到IPFS,并返回所上传内容对应的链接(哈希)。
(4)(5) 然后,web前端会调用电商合约将商品信息和IPFS链接存储到链上。当合约成功地将商品存入区块链后,就会触发一个事件,该事件中包含了商品所有的信息。
(6)(7)(8) NodeJS服务器监听区块链事件,当事件被电商合约触发时,服务器读取事件内容并将商品信息插入到MongoDB数据库中。

以上是关于以太坊开发入门--相关知识点说明的主要内容,如果未能解决你的问题,请参考以下文章

以太坊是啥丨以太坊开发入门指南

python以太坊开发的主要相关技术

以太坊DApp开发实战基础

以太坊DApp开发实战基础

以太坊是什么 - 以太坊开发入门指南

以太坊是什么 - 以太坊开发入门指南