主页 > imtoken下载官方 > 以太坊 dapp 的应用架构
以太坊 dapp 的应用架构
开始学习开发以太坊dapp应用后,了解以太坊智能合约的运行,阅读网上很多教学文章。 您将开始编写智能合约和自动测试。 这时候你会面临新的问题,如何规划以太坊dapp的应用架构? 会不会和传统的app应用程序架构一样?
因为区块链的使用,在传统的主从架构中增加了一个新的元素——区块链,这使得以太坊dapp的应用架构设计变得复杂。 本文将分享一些以太坊应用架构,说不定你能找到使用方法(因为平时开发用的是web3.js,文中的例子用的是web3.js)。
OKX(OKX)——数字货币兑换
注册领取最高¥60,000元数码盲盒,享20%手续费减免
点击注册
web3.js 目前仍处于 beta 版本,请注意 API 规范可能随时调整!
客户端——区块链、无服务器应用
以太坊 dapp 最基本的应用是 Serverless 架构。 这样以太坊dapp,只用到了客户端和区块链。 客户端可以直接与区块链通信。 如果要编写网页程序,可以使用web3.js制作网页与区块链通信,如果要编写手机程序,则需要使用以太坊语言的web3库。 目前只能看到web3j android。
查询交易
以太坊的每个区块可以包含很多笔交易,如何查询交易的内容?
首先创建 web3 连接对象:
const Web3 = require('web3'); const provider = new Web3.providers.HttpProvider(' https://mainnet.infura.io/vuethexplore'); const web3 = new Web3(provider);
获取区块信息:
let txs = []; web3.eth.getBlock(blockNumber).then((block) => { txs = block.transactions; }).catch((err) => { console.warn(err.message); } );
最后获取的交易数据:
web3.eth.getTransactionReceipt(transactionHash).then((transaction) => { console.log(transaction); }).catch((err) => { console.warn(err.message); });
以本次主网交易为例,会得到这些信息:
blockHash:”0x2e70662ed2e44f92b054e06ad640ffb2a865a3c8923fa2b3956684d616a7736b” blockNumber:”0x46d623" contractAddress:null cumulativeGasUsed:”0x5208" from:”0x32be343b94f860124dc4fee278fdcbd38c102d88" gasUsed:”0x5208" logs:[] logsBloom:”0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" status:”0x1" to:”0x00fed6dd82611313e26818b82dfe6dff71aeb309" transactionHash:”0xcf9ab5afac463944dda517c9592d9cd58d55432e869e72bb549c2fa632067986" transactionIndex:”0x0"
想为以太坊区块链编写一个浏览器吗? 可以参考vuetheexplore!
发送交易
每笔交易都需要私下签名。 目前有很多钱包可以发送一般交易和复杂合约交易。 如果只是喜欢自己动手,可以使用ethereumjs-tx来签名。
const ethereumTx = require('ethereumjs-tx'); const privateKey = Buffer.from('your private key', 'hex'); const txParams = { nonce: '0x00', gasPrice: '0x04e3b29200', gasLimit: '0x5208 ', to: '0xca35b7d915458ef540ade6068dfe2f44e8fa733c', value: '0x02d79883d20000', data: '', // EIP 155 specify chainId chainId: 1 }; const tx = new ethereumTx(txParams); // sign tx.sign(privateKey);
发送交易:
区块链:什么是以太坊和以太坊?
什么是以太? 以太币是在以太坊平台上流通的代币(Token)。 使用以太坊平台时,需要花费的费用将以以太币支付。
web3.sendRawTransaction('0x' + tx.serialize(), (err, txId) => { if (err) { console.warn(err.message); } console.log(txId); });
确认交易:
web3.eth.getTransaction(txId, (err, tx) => { if (err || !tx) { // transaction was failed return; } if (web3.eth.blockNumber >= (tx.blockNumber + 12)) { // transaction was confirmed } });
与区块链通信有时需要另一台主机来运行该节点。 测试时运行节点非常麻烦。 目前有一个项目infura,开放使用APIs连接不同的以太坊网络,让开发者不用担心基础设施问题,示例中的链接就是使用这个项目创建的。
想为以太坊区块链写钱包? 可以参考vuethwallet!
服务器端——区块链
接下来我们看一下服务器与区块链的通信方式。 这里所说的服务器可以是一个单独的服务应用程序,也可以是一个批处理程序,比如oraclize。
创建本地节点
如果想把数据放到公链上,可以使用geth或者parity搭建一个本地节点,通过这个节点与公网节点同步,将签名后的交易发送到这个节点,交易会通过这个节点广播到公共网络并验证。
离线签署交易
另一种方式是将交易离线签名,通过web3发送到其他开放的公网节点。 比如前面例子中提到的infura,就是先离线签署交易,然后再发送给API服务。 使用这种方式,注意对方(API服务)可能可以修改交易内容。
结合客户端、服务器端和区块链
上面分别介绍了客户端到区块链和服务端到区块链,接下来我们将看看如何将三者结合起来。
结合客户端和服务器
有时我们需要客户端和服务端都根据智能合约的状态变化做出相应的动作以太坊dapp,比如确认客户端是否交易了代币,或者客户端是否购买了商品。 这时候我们就需要客户端和服务端来观察智能合约,也就是监听智能合约的事件。 在设计合约事件时需要注意的是,一般写入的数据都会写在data中,但是如果在事件的变量中加入indexed,那么变量对应的值就会写在topics中,topcis中的值可以被用来作为监听器的过滤条件,具体可以参考这篇文章。
客户端可以将交易 id 发送到服务器,而不是让服务器监听事件作为交易的证明,这可能导致恶意攻击者向服务器发送不同的交易 id,假装交易是他的。 请记住确保客户端和服务器消息仅用作通知消息。
记得在回复客户端之前确认交易,因为即使交易存储在区块中并被矿工挖出,也可能发生链重组,使交易无效,通常在 12 个区块后(约 3 分钟)。
区块链 dapps 的开发是一个相对较新的领域。 我相信还有其他更好的架构没有在文章中提到。 欢迎大家一起讨论。
郑重声明:本文版权归原作者所有,转载文章仅出于传播更多信息之目的。 如作者信息标注有误,请第一时间联系我们修改或删除,谢谢。
以太坊创造者 Vitalik Buterin 希望转向比特币和莱特币
全球第二大加密货币以太坊(ETH)创始人Vitalik Buterin表示:在网络安全方面,权益证明(PoS)优于PoW(工作量证明)共识算法。 太好了,他说。 我们想切换到比特币 (BTC) 和莱特币 (