闪贷Dapp的调研及实现

Posted BEER_7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闪贷Dapp的调研及实现相关的知识,希望对你有一定的参考价值。

前置知识

  • 区块链应用Dapp

    • 概念:去中心化应用(Decentralized Application, DApp)为建构于区块链上的应用程序,也被称之为分散式应用。

    • 架构:传统网站:前端→API→数据库。

      DApp类似于传统的Web应用程序,前端使用完全相同的技术来呈现页面,它包含一个与区块链通信的“wallet”,管理加密密钥和区块链地址。公钥基础结构用于用户标识和身份验证。与连接数据库的API不同,wallet so - ware触发了智能合约的活动,该智能合约与区块链交互:

      Web3.0网站:前端(包括wallet)→智能合约→区块链。

      • 智能合约:通常指代运行在 EVM 兼容网络中的 Solidity 或其他合约语言代码,他们负责与用户交易我们发行的资产并储存 DApp 的链上状态。
      • DApp:整合合约接口以及其他功能的应用程序界面,目前,它们大部分是 Web App,你可以用流行的框架例如 React/Vue 来进行编写。
      • Provider/Signer: 这是一个 DApp 架构中特殊的角色,它负责与区块链进行通信,并进行合约的读/写操作。Metamask 是一个流行的 InjectProvider(Web3Provider)你也可以使用其他 JSON-RPC Provider 与区块链进行通信。
      • Relay: 这个角色隐藏在 Provider/Signer 之后,是真正负责我们与区块链的某一个节点同步状态的服务器集群,它保存了所有账本(全节点)它通常是 Infura、Alchemy、Quicknode、Moralis 或者 Pocket 提供的服务。
      • 服务端(可选):大部分 DApp 仍然有他们的服务端逻辑,这意味着,你需要自己搭建服务环境,或使用流行的 BasS/FaaS 服务,你可以使用深度整合区块链的 Moralis 来完成服务端的开发,也可以使用成熟的 Firebase 体系。当然,你也可以挑战完全不依赖服务端的方式来构建 DApp,就像 Uniswap 所做的那样。
    • 开发步骤:

      • 准备:
        • 公链:公链节点rpc接口,公链钱包,公链gas对应的代币
        • 学习公链接口的访问形式
        • 准备dapp浏览器或钱包插件
      • 开发:
        • 开发智能合约(ETH、bsc、tron合约,solidity语言)
        • 部署智能合约(在测试网申请测试币后部署智能合约,remix工具)
        • 开发dapp前端(vue框架,涉及钱包连接、合约调用、数据查询)
        • 后端开发
      • 技术:
        • web3,web3.js
        • vue框架
        • metamask插件
        • truffle框架简化Dapp开发流程
  • 闪电贷flash loans

    • 概念:用户在借到款之后,可以利用借到的资产进行其他操作,然后在交易结束的时候,用户只要把借到的款项及手续费及时归还就可以,否则该笔交易就会回滚,就像什么也没有发生过一样。
    • DeFi 项目:
      • Aave是最早将闪电贷进行实际应用的DeFi 协议,主要原理是通过调用 Aave 中 lendingPool 合约中的 flashLoan() 函数实现借贷,通过executeOperation() 函数实现具体的业务逻辑。
      • dYdX 是一个针对专业交易者的去中心化交易所,本身并没有闪电贷功能,但是可以通过对 SoloMargin 合约执行一系列操作来实现类似闪电贷功能。其主要原理是通过继承 DydxFlashloanBase 合约编写initiateFlashLoan() 回调 callFunction() 实现借贷、套利、还款等操作。

业务流程与重要函数

说明:参考Aave(基于ETH公链)的业务流程与源码

flashLoan 函数实现借款功能,executeOperation函数实现还款功能

  • 用户调用flashLoan 函数。传入参数:用户借款地址、外借资产地址、借款金额、债务模式等

  • flashLoan 函数进行借款金额判断。验证外借资产地址余额是否小于借款金额,如果是就回滚初始状态,不是继续后续操作

  • flashLoan 函数进行手续费判断。计算手续费(带宽和能量),验证手续费是否大于 0,是则继续后续操作,否则回滚初始状态

  • flashLoan 函数向用户借款地址转账。将用户借款地址定义为可接受转账地址,并从外借资产地址向用户借款地址转账借款金额

  • executeOperation 函数执行附带调用信息,并进行还款操作。在 flashLoan 函数进行有效转账后,executeOperation 函数将被触发并接受来自 flashLoan 函数的传参

  • executeOperation 函数将验证接收到的金额是否正确,不正确则回滚初始状态

  • 借款用户系列操作xxx

  • executeOperation 函数偿还资金。调用函数交易,偿还资金,还款金额= 借款金额 + 手续费

  • flashLoan 函数进行转账前与还款后余额比较。还款完成后,进行转账前后余额比较,如果转账前余额+手续费与还款后余额不相等回滚初始状态,相等则继续后续操作

  • 还款完成,更新闪电贷进程,触发闪电贷交易完成事件

# 参考资料

完整操作步骤及源码:Creating a Flash Loan using Aave

Ganache+Truffle+MateMask实现第一个Dapp(Windows)

一、Ganache安装

官方下载地址https://trufflesuite.com/ganache/
下载完成后直接安装即可。

Ganache是一个以太坊运行环境的模拟器,它模拟了以太坊公链的行为和接口,可以通过与此模拟环境链接和交互,方便地调试智能合约和用户交互系统

二、安装Truffle

在安装Truffle之前需要安装Node.js 8.9.4及以后的版本,以及python的环境。下载Node.js 的网址为https://nodejs.org/zh-cn/,下载python网址为https://www.python.org/安装成功之后,通过npm命令行来安装Truffle。

nodejs安装完成后配置npm下载源

npm config set registry https://registry.npm.taobao.org

输入以下命令即可安装truffle

npm install -g truffle@5.1.13

最好加上版本号,以防报错

第一次安装失败过后再次安装可能出现的问题
Cannot read properties of null (reading ‘pickAlgorithm’)
解决办法

npm cache clear --force

然后重新安装即可
安装完成后,查看版本号

truffle version

安装成功

三、新建项目

新建目录,在目录中运行cmd,运行下列命令下载代码

truffle unbox webpack

Truffle的unbox功能类似于GitHub的包管理工具,通过unbox可以下载已经编入Truffle库的既有代码。webpack是这个代码库的名称,下载webpack代码后的目录结构如图所示。

  • app目录下存放的是与用户交互的JS文件、HTML文件、CSS文件等用于在Web容器中运行的代码。
  • contracts目录是智能合约SOL文件的源代码的存放位置。
  • migrations是设定加载智能合约到区块链上的说明文件的存放位置。
  • test用来测试脚本的存放位置,开发人员可以开发JS或者SOL文件的测试用例。
  • truffle-config.js是Truffle编译和运行环境的配置文件,其中本节使用的Ganache模拟器需要在该文件中配置,找到相关代码进行以下修改:

    填写Ganache中的地址及端口。

    在修改好配置文件之后,编译当前工作目录下的智能合约代码,并将智能合约部署到Ganache区块链模拟器上,执行的命令如下

1、编译代码

truffle compile


2、部署到Ganache

truffle migrate


3、进入到app目录下,运行程序

cd app
npm run dev

第一次运可能会报错

'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序或批处理文件。


运行

npm install


再重新启动

启动成功后浏览器输入http://localhost:8080/

链接MateMask

链接MateMask后默认有10000META

进行交易,复制Ganache中的另外一个账户,向这个地址转入100个META

在MateMask上确认交易,会发现当前账户只有9900个META

在MateMask中切换到刚刚转入的账户,重新连接当前页面,会发现有100个META

同时我们在Ganache中也可以看到交的信息

补充:在MateMask中导入Ganache账户的方法
1、点击头像

2、点击导入账户

3、在Ganache中复制账户私钥


4、在MateMask中黏贴私钥,导入即可

以上是关于闪贷Dapp的调研及实现的主要内容,如果未能解决你的问题,请参考以下文章

区块链学习--以太坊Dapp开发

区块链 Hello World -- 基于以太坊的投票Dapp

如何从零开始学习区块链技术——推荐从以太坊开发DApp开始

区块链 solidity 零知识证明DApp开发实践身份证明/以太坊

以太坊 DApp 开发入门实战! 用Node.js和truffle框架搭建——区块链投票系统!

以太坊开发DApp实战教程——用区块链星际文件系统(IPFS)Node.js和MongoDB来构建电商平台