基于区块链的在线分布式应用在不同机器上表现出同步行为

Online distributed application based on the blockchain shows simultaneous behaviour on different machines

我是区块链和 DAPP 世界的新手。我一直在玩 truffle website(使用 web3js)上的玩具示例,并创建了我自己的 DAPP,它与演示令牌(在 ropsten 上)、流入数据库(通过 GET 请求)和etherscan API.

我把它放在网上并试了一下,效果很好,但如果我在我的网络浏览器中打开它,而其他人在他们的浏览器中打开它,当点击按钮时,例如,加载我的余额并显示它,我看到它是正确的,但打开 DAPP 的其他人也看到加载的余额。这怎么可能,我该如何解决?

我正在使用固定地址读取余额,并通过 etherscan 检查交易并通过 D3 显示它们。

谢谢!

如评论中所述,您看到的问题确实是由 BrowserSync 引起的。如果你想下车lite-server,你可以切换到一个简单的Node HTTP服务器:

使用提供的答案 here:

  1. connectserve-static 包添加到项目
  2. 添加server.js到src目录(下面复制)。
var connect = require('connect');
var serveStatic = require('serve-static');
connect().use(serveStatic(__dirname)).listen(8080, function(){
    console.log('Server running on 8080...');
});
  1. 将 package.json 的 "dev" 部分修改为 node src/server.js

除了这些步骤之外,我还必须将 build/contracts/Adoption.json 复制到 src 目录。有更好的方法来做到这一点,但我只是为了速度而这样做。

运行 npm run dev 并重新加载浏览器(注意,链接的答案将服务器设置在端口 8080 而不是教程中的 3000)。

目前还不是 100% 完美(即,成功采用后,您必须重新加载页面才能看到它变为 "Success")。可以改进代码以更好地处理这些情况。

请注意,即使在多个 tabs/windows 中,您仍然共享同一个 MetaMask 插件。除非您在浏览器 windows 之间切换时手动切换帐户,否则带有合同的 activity 仍然是共享的。另一个(更好的)选项是 运行 两个不同的浏览器(我使用一个 Chrome 和一个 Firefox)并设置 MetaMask 以在每个浏览器中使用不同的帐户。

如@Adam Kipnis 所示,将 index.html 作为静态文件提供解决了该问题。直接从文件系统打开 index.html 会阻止 metamask 注入 web3,因此唯一要做的就是创建一个静态服务于文件的后端。 Adam 的解决方案创造了奇迹,我创建了另一个解决方案,无需将合同复制到 src/,只需将该文件夹设置为 Express 应该从中获取文件的静态文件夹即可。

const express = require('express')
const app = express()
app.use(express.static(__dirname + '/src'));


app.get('/', function(req, res) {
  res.sendFile(__dirname+'/src/index.html');
});

app.listen(3000, () => console.log('Up!'))