公有链
公有链(Public Blockchain)通常也称为非许可链(Permissionless Blockchain),公有链是区块链的一种,无官方组织及管理机构,无中心服务器,参与的节点按照系统规格自由接入网路、不受控制,节点间基于共识机制开展工作。
公有链一般适合于虚拟货币、面向大众的电子商务、互联网金融等B2C、C2C或C2B等应用场景,比特币和以太等就是典型的公有链。
智能合约
智能合约是在区块链中“实时”运行的小型程序,它使得区块链是可编程的,它提供了一个平台,开发人员可以在这个平台上,为区块链网络创建分布式应用程序。
智能合约就是一段由EVM虚拟机执行的字节码,常都是由编译器负责把高级语言编译为字节码。当智能合约被编译成二进制文件后,被部署到区块链上。用户通过调用智能合约的接口,来触发智能合约的执行操作。EVM执行智能合约的代码,修改当前区块链上的数据(状态),被修改的数据,会被共识,确保一致性。
智能合约主要是为了解决信任问题而产生的,由于智能合约存放在区块链,并且区块链不可抵赖,不能篡改,因此智能合约比现实中任何一个机构的公信力都强,而区块链的去中心化思想的最大优势就是解决了信任问题。
但是如果智能合约出错后,可能会造成代币被盗或者消耗大量的gas,必须去修复错误,而修复bug只能重新部署合约,就会产生一个问题:原来的合约已经有很多人在使用,如果部署新的合约,老合约的数据就丢失。
去中心化
去中心化(Decentralized)的意思就是用户可以不通过Google、Facebook、微博等中介的服务访问互联网上的数据和信息,而是由个人自己拥有和控制互联网的各个部分。也就是说,在Web3上,开发者不需要在一个单独的服务器上建立和部署应用,也不用在一个单独的数据库中储存数据,极大降低了单点故障的风险。
区块链是真正去中心化互联网的核心,它改变了数据存储和管理的方式,其独特的架构允许多个节点在没有一个集中的事实来源的情况下就数据集的当前状态保持一致。作为用户为去中心化执行而激活的自动执行代码,智能合约是加密难题的重要组成部分,这允许两方在彼此不知情的情况下进行价值转移。
gas费用
链上交易需要手续费,手续费被称为gas(汽油),gas是用于评估在区块链上执行特定操作所需的计算工作量的单位。
gas只是一个抽象单位,它仅存在于以太虚拟机中,用户实际上总是在以太网络中使用ETH(以太币)进行交易。
为什么要引入gas呢?
以太虚拟机可以执行任意代码,但它也更容易受到halting problem的影响。halting problem是指从一个任意计算机程序的代码和输入来确定该程序是会结束运行,还是会永远继续运行。如果没有gas,用户就可以执行一个永远不会停止的程序,为了防止这种情况发生,以太引入了与每个操作相关的gas成本,这将防止程序处于永远运行的状态,最终使整个网络陷入停滞状态。
DApp的基本架构图:
主要分为三个部分:
1、区块链以及本身提供的能力
2、三方钱包等提供的能力
3、我们要写的DApp部分----分为三个部分:
(1)和EVM交互的合约层--solidity编写;(2)和合约层、钱包交互的交互层-web3js,其和Ajax类似,可以用来读取以太区块链,主要使用的JSON RPC和区块链进行通信,对区块链网络进行数据的读写操作;(3)前端代码业务层-vue、react等编写;DAPP可以使用
开发dapp的步骤
1、开发智能合约:一般使用solidity语言进行开发,选用以太合约、bsc合约等;
2、部署智能合约:一般使用remix工具进行部署,先在测试环境中进行部署智能合约,申请对应的测试币;
3、开发dapp前端:使用前端框架进行开发,前端设计到和钱包的连接、调用合约、数据查询等内容;
环境搭建
主要需要解决的问题是模拟链(毕竟真链上的操作都是要花钱的)、钱包和合约的问题;
1、链可以用ganache进行模拟
2、钱包用MetaMask
3、solidity既然是一个编程语言,并且要跑再EVM上,那就有编写、编译、测试和调试的地方,这里推荐使用remix
3.2.4部署和调用
DApp在被调用之前需要先部署到以太上,主要分为部署和调用两部分;
(1)部署
一个DApp可以由多个智能合约组成,因此部署一个DApp也就是同时部署多个智能合约,那么部署一个智能合约的流程图如下:
智能合约使用RPC调用以太的钱包、Web3.js等工具;
Web3.js将合约部署到以太中的Solc编译器中;
编译器将编译后的字节码返回;
将合约字节码以及相关参数发送到以太的节点中;
以太部署节点后返回合约地址以及二进制接口(ABI)
(2)调用
部署好的合约可以进行调用,前端调用主要依赖MetaMask插件,前端的Web3 Provider是与特定的以太节点相连,可以直接使用
web3.currentProvider调用,下图展示了前端调用合约的一般流程。
智能合约:存在于区块链上的代码片段。它们在区块链内操作,且不可更改。
节点/Web3提供者:要从区块链获取数据,需要节点或Web3提供者;节点运行区块链的副本。节点是web3开发人员栈的重要组成部分,因为没有节点,web3库就无法与智能合约交互。它们充当进入区块链领域的门户。