什么是dapp?如何在web中开发dapp?
Posted 元宇宙中心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是dapp?如何在web中开发dapp?相关的知识,希望对你有一定的参考价值。
web3
“Web3.0”是对“Web2.0”的改进,在此环境下,用户不必在不同中心化的平台创建多种身份,而是能打造一个去中心化的通用数字身份体系,通行各个平台。更像是一种概念吧。
区块链
区块链(Blockchain
)是由节点参与的分布式数据库系统, 它的特点是不可更改,不可伪造,也可以将其理解为账簿系统(ledger
)。它是比特币的一个重要概念,完整比特币区块链的副本,记录了其代币(token
)的每一笔交易。通过这些信息,我们可以找到每一个地址,在历史上任何一点所拥有的价值。
Dapp
DApp
是Decentralized Application
的缩写,中文直译为去中心化应用,也可以理解为分布式应用。去中心化应用是基于区块链底层开发平台建立的。比如以太坊和EOS
,DApp
与底层平台的关系就好比APP
与ios
和安卓系统。
区块链世界中,经常听到dapp
这个词。我们用惯了手机app
。Applications
.说白了就是给你的手机上安上一个小软件,小程序,然后你可以用。今天从头说说dapp
,再聊聊区块链的功能
Dapp应用特点
一个真正的DApp
应用需要同时满足以下几个条件:应用必须完全开源自治,且只有一个实体控制着该应用超51%token
,该应用必须能够根据用户的反馈及技术要求进行升级,且应用升级必须由大部分用户意见达成一致之后方可进行;应用的数据必须加密后存储在公开的区块链上,应用必须拥有token
机制,可用基于相同底层区块链平台的通用代币或自行发行新币,矿工对应用维护节点需要得到代币奖励;应用代币的产生必须依据标准的加密算法,有价值的节点可以根据该算法获取应用的代币奖励。
以最著名的以太坊的游戏加密猫为例,其实一款运行在以太仿的DApp
,大家可以创建、照顾、购买、喂养并出手存储在以太坊区块链中的以太猫,并且15分钟产出一只小猫,每只猫都具有独一无二的特性,可以通过配对繁衍新的小猫,该DApp
并不是有一个实体所拥有,而是创建在以太坊上永不消失,没有人可以抢走你的猫,没有人能够改变任何一只猫的样子。
V神就是在暴雪取消术士的“生命虹吸”技能后,开始走向以太坊的创业,也没有一个实体对这个DApp
有独断的意志,在这个游戏发行出来之后,每个人都可以参与该游戏,并且由于以太坊的账号,所以参与者的隐私都能够得到良好的保护,所以在未来投资DApp
有着非常值得想象的升值空间。
第一,Dapp的定义。
这里的d就是Decentralized
,去中心化。去中心化的app
。你是不是以为他非常的高大上,和app
有巨大的区别?不好意思,不是的,差不多,有时候外表长得更low
和app
一样,在你手里边儿就是一个图标。而且有没有特别明确的定义?其实没有。
app
就是把一段程序放到你手机的中。dapp
也是把一段程序放到你手机的中。dapp
甚至都没有程序,就是一个网页页面儿。用户体验感,有点像微信里边儿的小程序。
比如你打开你的钱包就可以看到很多去中心化交易所,这就是dapp
,钱包自己,我觉得也可以算作Dapp
.
第二,Dapp是区块链账本的门面。
我们以比特币为例。比特币是什么?是一个去中心化的大账本。而每个节点上都在维护这个账本。人人手里有账本。而这个账本其实是靠程序来记账。每个节点上的程序是一样的,当然我们这里不考虑轻节点和验证节点。假设都一样。
请问,怎么知道你在记账。你直接把代码拿出来让大家看,看不懂。这个时候就需要一个门面装饰一下。就像是传统的app
,要让大家有体验感,点两下
比如说,你弄个比特币钱包,它就可以显示出各种功能,转了多少多少钱,你可以在上边儿建立你的账户
第三,Dapp有哪些特点?
dapp
不一样的地方在于它的代码开源。你是干什么的,别人得知道,你要改,需要社区投票,大家维护。
比如说,传统游戏,你在打副本。区块链游戏,你也在打副本。只不过软件商不能随便把各个怪兽,技能,装备改了,要改得按区块链规矩改。当年v神不就是因为他心爱的一个角色被取消掉了,所以才创建的以太坊吗?
我以太坊为例,游戏app
在全网节点跑,相当于一个复杂合约,你在游戏里边儿养了一只猫,那么这个猫所产生的各种数据都要在各个节点确认。你这个猫的数据不可篡改。
你要改这个猫,如果大家达不成共识,那就要硬分叉,我之前写过。有些节点保留,有些不保留,有些app
里能玩,有些不能玩
然后,他可能会有自己的代币奖励机制。如果是人人都可以参与的公链,就必须要有激励机制,维护数据和网络
第四,Dapp和区块链是不是天下无敌?
这个问题我想单独说一下,很多人认为有了区块链就天下无敌,有了dapp
就可以替代app
,所有一切去中心化,其实不是的。
你可以把dapp
理解为app
的一个儿子,比如某聪分聪,他可以满足某一个细分场景市场。比如特别重要的资产、资料、信息之类。或者就像v神这种,不想开发方随便更改游戏的
再说说区块链的不足或者说局限
比如,有些人可能记性不好,用钱包转账,把私钥给忘了,丢了,或者被盗了,那怎么办?那钱就找不到了。这对于很多人来说是灾难性的。
而如果你是用中心化的系统,可能你做一个kfc
的认证,也可以给你方便找回来。
再比如你被人给骗了转了钱,你如果是在传统的银行转账,有可能就把钱找回来,但是如果在区块链的世界中,假设没有其他的预防机制,丢了就丢了,你打到它的地址就归他了。
比如著名的以太坊the dao
,黑客利用漏洞,就导致了以太坊的回滚和分叉。当时如果不是因为有一个保护期限制,以太坊很多钱就被黑客盗走了。地主家也没有余粮。Code is law ,but code is not perfect.
还有比如很多人说,由于区块链不可篡改,所以我们以后所有做买卖的每一步都把它记录到区块链上,这不就彻底解决问题了吗?
我觉得这个逻辑是有问题的,区块链是可以补充现实生活中的不足,不是可以解决现实生活中所有的问题。
打比方说你卖的是猪肉。你在区块链上记录的是猪肉,这个行。如果底层的制度并不完善,那我可以把猪肉换成羊肉,然后我记录的时候记录猪肉。这个不可篡改有啥意义?
把区块链看作已有生活的补充,区块链并不是完全的去中心化。起码没有你想象的那么去中心化,但是这些其实不重要,你要做的是挣到钱,提高效率,更加的安全,没有止境,而不是纠结于这些词语。
web3终将会解决web2中不能解决的大部分问题,dapp会有更好的应用前景,我们团队从2016年做区块链技术开发以来一直从事前言技术探索和各种dapp产品开发,2020年gamefi 爆发以来持续关注gamefi的最新动态并为大大小小的企业团队设计开发几十款链游产品,并且打造自己的元宇宙生态,如果有兴趣的团队个人可以和我们合作一起研发打造最新最有价值的区块链产品。
用 Python 中的 web3.py 库开发 Dapp
什么是 DApp
“DApp”代表去中心化应用程序。与传统应用程序一样,去中心化应用程序也有前端(客户端)和后端(服务器端)。DApp 的用户界面可以用任何语言编写(就像传统应用程序一样),并且可以调用其后端。那么,Dapps 与传统应用程序有何不同?DApp 的后端代码运行在分散的对等网络(即区块链)上。您可能听说过 BitTorrent、Tor、Popcorn Time——它们是在点对点网络上运行但不在区块链上运行的 DApp。区块链 DApp 有自己的后端代码,称为智能合约,可以部署到区块链(最常见的是以太坊)。智能合约定义了整个 DApp 的逻辑。它是使用区块链作为后端的命脉。那么Python 开发人员可以在哪里利用它?重点来了——web3。Web3 是一组库,允许您与本地或远程以太坊区块链进行交互。简单地说,web3 是与您的后端(区块链)通信的桥梁。幸运的是,以太坊开发人员已经制作了一个 python 库 web3.py 用于与以太坊进行交互。它的 API 源自 web3 的 JavaScript 版本。因此,除了 web3.js,我们也可以通过 web3.py 库与区块链进行交互。
Dapps 开发包括三个简单的步骤:
在区块链网络上部署智能合约
从部署的智能合约中读取数据
将交易发送到部署的智能合约
我们将在带有 web3.py 库的 python 环境中一步一步地进行这三个操作要与区块链交互,我们必须连接到任何完全同步的节点。在本教程中,我们指向一个 Infura 节点。确保你有一个以太坊钱包(使用 Metamask chrome 扩展或 myetherwallet 创建以太坊钱包并安全地存储你的私钥)并在其中添加一些测试 Ether 以进行操作。
安装
Python 2.7 +
Node.js
Truffle
npm install -g truffle
Pip
npm i pip
web3.py
pip install web3
Infura 项目 API
前往 Infura 网站并注册。创建一个新项目并复制 Ropsten Infura RPC URL。我们将把我们的智能合约部署到 Ropsten 测试网络。
智能合约
每个程序员都用他们最喜欢的编程语言执行了一个“hello world”程序,以了解运行该语言的基础知识。这是我们使用 Solidity 语言编写的简单的“hello world”版本的智能合约,我们可以在区块链上添加问候语并检索它。Solidity 是编写智能合约最常用的语言,它编译为可以在节点上运行的以太坊虚拟机上执行的字节码。
pragma solidity ^0.5.7;
contract greeter{
string greeting;
function greet(string memory _greeting)public{
greeting=_greeting;
}
function getGreeting() public view returns(string memory) {
return greeting;
}
}
您可以通过传递字符串值使用 greet()
方法添加问候语,并使用 getGreting()
方法检索问候语。
1. 在区块链网络上部署智能合约
a) 创建项目:
mkdir pythonDapp
cd pythonDapp
truffle init
成功初始化项目后,转到您的文件夹并在 /contracts
目录中创建 greeter.sol
文件。在网络上部署合约之前,我们必须编译它并构建工件。
b) 智能合约的编译:
因此,对于编译,我们将使用 Truffle solc 编译器。在您的主目录中,运行以下命令:
truffle compile
(or)
truffle.cmd compile #(for windows only)
上面的命令将在 /contracts
目录中编译你的合约,并在 /build
目录中创建二进制工件文件 greeter.json
。
c) 部署合约:
打开您的 Python IDLE 编辑器,并在主目录 deploy.py 中使用以下代码创建一个新文件,然后在您的目录中运行 py deploy.py。
import json
from web3 importWeb3, HTTPProvider
from web3.contract importConciseContract
# web3.py instance
w3 = Web3(HTTPProvider("https://ropsten.infura.io/v3/<API key>"))
print(w3.isConnected())
key="<Private Key here with 0x prefix>"
acct = w3.eth.account.privateKeyToAccount(key)
# compile your smart contract with truffle first
truffleFile = json.load(open('./build/contracts/greeter.json'))
abi = truffleFile['abi']
bytecode = truffleFile['bytecode']
contract= w3.eth.contract(bytecode=bytecode, abi=abi)
#building transaction
construct_txn = contract.constructor().buildTransaction({
'from': acct.address,
'nonce': w3.eth.getTransactionCount(acct.address),
'gas': 1728712,
'gasPrice': w3.toWei('21', 'gwei')})
signed = acct.signTransaction(construct_txn)
tx_hash=w3.eth.sendRawTransaction(signed.rawTransaction)
print(tx_hash.hex())
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)
print("Contract Deployed At:", tx_receipt['contractAddress'])
这是我所做的:
导入的 web3 库和所有其他必需的模块
通过指向 Ropsten Infura 节点启动 web3 提供程序
添加了用于签署交易的帐户地址和私钥。不要忘记在代码中添加您的凭据。
通过指向 Truffle 编译的工件文件greeter.json的abi和字节码启动合约实例
添加了带有随机数、gas、gasPrice 等参数的construct_txn。此处,gas 是指交易应在以太坊中使用和支付的最大计算资源量。gasPrice 是指在交易中使用该数量的 gas 时的最小 Ether 数量。to 指的是您发送交易的地址。仅当您将 Ether 发送到帐户或智能合约时才需要 to 参数。
使用我们的私钥签署交易并在网络上广播。
在控制台中记录交易哈希和部署的合约地址。根据以太坊的说法,事务处理时间 <20 秒。所以你必须等待 20 秒才能获得部署的合约地址。您的后端现在已成功部署在以太坊区块链上。现在您可以使用此地址与您的智能合约进行交互。复制此合约地址。
2. 向部署的合约发送交易
在我们的合约中,有一个方法greet()。我们可以单独使用这种方法在我们的合同中添加问候语。让我们看看我们如何使用 web3.py 来做到这一点。打开您的 Python IDLE 编辑器并使用以下代码创建一个新文件 sign.py。然后在您的目录中运行 py sign.py。
import json
from web3 importWeb3, HTTPProvider
from web3.contract importConciseContract
# compile your smart contract with truffle first
truffleFile = json.load(open('./build/contracts/greeter.json'))
abi = truffleFile['abi']
bytecode = truffleFile['bytecode']
# web3.py instance
w3 = Web3(HTTPProvider("https://ropsten.infura.io/v3/<API key>")) #modify
print(w3.isConnected())
contract_address = Web3.toChecksumAddress("<Deployed Contract Address here>") #modify
key="<Private key with 0x prefix here>"#modify
acct = w3.eth.account.privateKeyToAccount(key)
account_address= acct.address
# Instantiate and deploy contract
contract = w3.eth.contract(abi=abi, bytecode=bytecode)
# Contract instance
contract_instance = w3.eth.contract(abi=abi, address=contract_address)
# Contract instance in concise mode
#contract_instance = w3.eth.contract(abi=abi, address=contract_address, ContractFactoryClass=ConciseContract)
tx = contract_instance.functions.greet("Hello all my goody people").buildTransaction({'nonce': w3.eth.getTransactionCount(account_address)})
#Get tx receipt to get contract address
signed_tx = w3.eth.account.signTransaction(tx, key)
#tx_receipt = w3.eth.getTransactionReceipt(tx_hash)
hash= w3.eth.sendRawTransaction(signed_tx.rawTransaction)
print(hash.hex())
这是我所做的:
导入的 web3 库和所有其他必需的模块
通过指向 Ropsten Infura 节点启动 web3 提供程序
添加了用于签署交易的帐户地址和私钥
通过指向 Truffle 编译的工件文件greeter.json的abi和字节码启动合约实例
创建 tx 对象以添加问候语“hello all my goody people”并建立交易
使用我们的私钥签署交易并在网络上广播。
在控制台中记录交易哈希。您可以使用您的交易哈希在 etherscan 上检查交易状态。一旦交易被矿工验证,我们的问候语将被添加到区块链上。您可以使用 getGreeting() 函数检索问候语,如下所述。
3. 从部署的智能合约中读取数据
在我们的合约中,有一个方法 getGreeting() 可以检索我们在区块链中添加的问候语。我们将使用 web3.py 调用此方法 打开您的 Python IDLE 编辑器并使用以下代码创建一个新文件 read.py。运行 py read.py 读取问候语。
import json
from web3 importWeb3, HTTPProvider
from web3.contract importConciseContract
# compile your smart contract with truffle first
truffleFile = json.load(open('./build/contracts/greeter.json'))
abi = truffleFile['abi']
bytecode = truffleFile['bytecode']
# web3.py instance
w3 = Web3(HTTPProvider("https://ropsten.infura.io/<ApI Key here>"))
print(w3.isConnected())
contract_address = Web3.toChecksumAddress("<Deployed Contract Address here>")
# Instantiate and deploy contract
contract = w3.eth.contract(abi=abi, bytecode=bytecode)
# Contract instance
contract_instance = w3.eth.contract(abi=abi, address=contract_address)
# Contract instance in concise mode
#contract_instance = w3.eth.contract(abi=abi, address=contract_address, ContractFactoryClass=ConciseContract)
# Getters + Setters for web3.eth.contract object ConciseContract
#print(format(contract_instance.getGreeting()))
print('Contract value: {}'.format(contract_instance.functions.getGreeting().call()))
这是我所做的:
导入的 web3 库和所有其他必需的模块
通过指向 Ropsten Infura 节点启动 web3 提供程序
通过指向 abi 和 contract_Address 创建合约实例(来自上一步)
调用 getGreeting() 方法并在控制台打印结果
结论
您现在应该了解如何使用 web3.py 部署、交互和签署交易。让我们通过查看我使用 web3.py 创建的实时 DApp 并在此处使用 Flask 作为前端服务器来将所有部分组合在一起。它将帮助您更深入地了解使用 Python 进行 DApp 开发。
点击下方阅读原文加入社区会员
以上是关于什么是dapp?如何在web中开发dapp?的主要内容,如果未能解决你的问题,请参考以下文章
Web3 系列开发教程——创建你的第一个 NFT创建一个 NFT DApp,给你的 NFT 赋予属性,例如图片
如何在 DApp 前端中用 HTML 列出来自智能合约的一些数据