我有一个服务器-客户端 DApp,我已经在以太坊测试网络上测试过它可以正常工作。但是由于gas费用,我想使用L2,在这种情况下我选择了Polygon(MATIC)。基本应用程序正在读取和写入网站的文本帖子,智能合约存储它们。
我已经使用 remix.ethereum.org 成功部署在 MATIC 上,并且从 Remix 我可以将交易写入合约。在我的本地主机网络应用程序上,我可以读取交易,但我的写作无法从客户端工作。
这里是server.js
const WEB3_PROVIDER = "https://polygon-rpc.com"
// https://blog.polygon.technology/polygon-rpc-gateway-will-provide-a-free-high-performance-connection-to-the-polygon-pos-blockchain/
//"https://cloudflare-eth.com"; //"HTTP://127.0.0.1:7545"
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
console.log("web3 already initialized.");
} else {
// set the provider you want from Web3.providers
web3 = new Web3(new Web3.providers.HttpProvider(WEB3_PROVIDER));
console.log("New web3 object initialized.");
}
app.post('/add-post', async (req, res) => {
const post = req.body;
try {
console.log(post);
MyContract.methods.addNewPost(post['name'], post['post'], post['date']).send({from: post['addr'], gas:3000000}).then(function(result) {
const output_response = "add-post successful :: ";//+String(result);
res.send(output_response);
}).catch(function(err) {
const output_response = "add-post failed :: "+String(err);
res.send(output_response);
});
} catch (e) { throw e; }
});
这是client.js
我添加帖子的片段,通过抓取 html 输入表单然后传递给以下内容:
const web3 = new Web3(window.ethereum);
async function addPost(post_input) {
stringify_post_input = JSON.stringify(post_input);
const post_response = await fetch('/add-post', {method: 'POST', body: stringify_post_input, headers: { "content-type": "application/json" } });
var post_response_text = await post_response.text();
console.log(post_response_text);
}
现在这通常可以在以太坊测试网络上完美运行,我所做的只是web3
在server.js
. 但是现在在 MATIC 网络上,在我的客户端浏览器中,
add-post failed :: Error: Returned error: unknown account
这真的让我很困惑,因为
- 我可以在 remix.ethereum.org 中手动添加帖子,在那里我部署了完全相同
MyContract
- 我有其他服务器端调用可以读取
MyContract
并正常工作(即我可以读取我从 Remix 添加的现有帖子)。
所以我的客户能读不能写,即没有MetaMask弹窗要求我确认支付gas费。
这是我第一次尝试使用 L2,所以我不知道所有web3
代码是否应该相同。我一直认为我只需要交换网络并登录到我的 MetaMask 就可以了。但是我对 web3 的理解不是很深,所以我不确定。
非常感谢 - 理想情况下,当我尝试使用 编写时MyContract.methods...()
,我应该在客户端浏览器中弹出 MetaMask,要求我确认支付汽油费。