DAPP,是基于区块链的底层开发平台,被称为去中心化应用、分散式应用程序,所有数据都存储在分布式分类帐中。DApp自P2P网络开始以来就已经存在,其在不同计算机的P2P网络上运行,而不是在一台计算机上运行。DAPP旨在以不受任何单个实体控制的方式在网络上运行。
DAPP can also be understood as an upgraded version of the app.The app currently developed by the IOS and Android systems is taken out and thrown on the blockchain system.Combined with smart contracts,it becomes DAPP.DAPP firmly emphasizes decentralization.It is necessary to run on a distributed operating system and cannot work on traditional approaches such as Android and iOS.DAPP appears in many new distributed channels or networks such as Ethereum and EOS.It does not need to rely on any central server to achieve the purpose of decentralization.It can be run automatically and the code is open source.In addition,DAPP does not need to be downloaded and installed.It directly jumps from the platform to the application page to run.It can be opened and used anytime and anywhere.It is easy to operate.
Dapp based on blockchain can solve the trust problem.Dapp widely uses the decentralized technology of smart contract,which can solve the trust problem between users and Dapp developers.It is to write the protocol code into the smart contract,and then automatically execute the contract content after certain conditions.The smart contract realizes the credibility and transparency of the contract at the code level to ensure decentralization.The asset custody of smart contracts ensures the safe transaction of decentralized and trusted assets.In the DAPP of the decentralized exchange,users completely control their own assets.Any transaction and transfer are controlled by users,and the exchange cannot touch your assets,which greatly reduces the trust risk with the exchange.
去中心化,是互联网发展过程中形成的社会关系形态和内容产生形态,是相对于“中心化”而言的新型网络内容生产过程。在一个分布有众多节点的系统中,每个节点都具有高度自治的特征。节点之间彼此可以自由连接,形成新的连接单元。任何一个节点都可能成为阶段性的中心,但不具备强制性的中心控制功能。节点与节点之间的影响,会通过网络而形成非线性因果关系。这种开放式、扁平化、平等性的系统现象或结构,我们称之为去中心化。
作为区块链诸多特性中的重要的一个特点,其使用分布式储存与算力, 使得整个网络节点的权利与义务相同,系统中数据本质为全网节点共同维护,从而区块链不再依靠于中央处理节点,实现数据的分布式存储、记录与更新。
dApp组件
dApp的组件会有三个不同的类型:智能合约,前端逻辑(UI)和数据存储。
智能合约
智能合约存储了dApp的业务逻辑和当前的状态,这个是dApp和传统网络应用的最大区别,也正是因为这一点让dApp具备了以上提到过的优势。
前端/UI
尽管后端逻辑需要开发者完成智能合约代码,并把它部署在区块链上,但是在前端,开发者还是使用标准的网络技术,比如HTML和javascript,因此开发者可以使用自己熟悉的工具,库和框架。
第一步:创建智能合约:
我们dApp中的智能合约是一个简单的例子,它可以查看数据并且反应出区块链上的变化。在这个例子中,我们会通过Chainlink ETH/USD喂价对查看ETH/USD的价格,然后将结果永久存储在智能合约上。
第一步是打开Chainlink的文档,然后导航到Using Data Feeds页面。从这里将源代码复制进你的IDE中的一个新的文件里(比如Visual Code),或者你可以点击“Open In Remix”按钮,然后使用在线IDE Remix。
在这个例子中,我们会使用Visual Studio Code和Hardhat(一个EVM开发框架)。
首先,为我们的dApp创建一个新的文件夹,并在这个文件夹中创建一个后端文件夹,用来存储智能合约代码:
mkdir chainlink-dapp-example
cd chainlink-dapp-example
mkdir backend
cd backend
接下来,我通过VS Code打开创建好的文件夹,然后安装Hardhat:
npm init-y
npm install--save-dev hardhat
npx hardhat
(choose create javascript project,choose default parameters)
当安装完成之后,在“contracts”文件夹中删掉Touch.sol,然后在这个文件夹中创建一个叫做PriceConsumerV3.sol的文件。在这个文件将存储我们的合约,所以将Chainlink文档中的代码复制到这个文件中,然后保存。
在样例代码中,你会看到demo合约已经有一个叫做getLatestPrice的功能来通过Rinkeby上的ETH/USD喂价对查看Ethereum的当前价格。
function getLatestPrice()public view returns(int){
(
/uint80 roundID/,
int price,
/uint startedAt/,
/uint timeStamp/,
/uint80 answeredInRound/
)=priceFeed.latestRoundData();
return price;
创建一个新的变量和函数,在智能合约上储存这个值。
int public storedPrice;
然后,创建一个新的函数,它会被dApp的前端调用。这个函数会通过调用getLatestPrice函数查看Ethereum的最新价格,然后将这个值存储在storedPrice这个参数中:
function storeLatestPrice()external{
storedPrice=getLatestPrice();
}
你的新的合约应该和下面的一样:
//SPDX-License-Identifier:MIT
pragma solidity^0.8.7;
import"chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract PriceConsumerV3{
AggregatorV3Interface internal priceFeed;
int public storedPrice;
/**
*Network:Rinkeby
*Aggregator:ETH/USD
*Address:0x8A753747A1Fa494EC906cE90E9f37563A8AF630e
*/
constructor(){
priceFeed=
AggregatorV3Interface(0x8A753747A1Fa494EC906cE90E9f37563A8AF630e);
}
/**
*Returns the latest price
*/
function getLatestPrice()public view returns(int){
(
/uint80 roundID/,
int price,
/uint startedAt/,
/uint timeStamp/,
/uint80 answeredInRound/
)=priceFeed.latestRoundData();
return price;
}
function storeLatestPrice()external{
storedPrice=getLatestPrice();
}
}