【发布时间】:2021-12-31 04:50:53
【问题描述】:
Account 数组的记录非常好,Metamask 运行正常,Ethereum 使用正常,但每次调用 manager() 时,我都会收到一个空数组,
我正在学习 Stephen Grider 的 Udemy 课程
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0 <0.9.0;
contract Lottery {
address public manager;
address payable[] public players;
constructor(){
manager = msg.sender;
}
function enter() public payable{
require(msg.value > 0.01 ether);
players.push(payable(msg.sender));
}
function random() private view returns (uint){
return uint256(
keccak256(
abi.encodePacked(block.difficulty, block.number, players)
)
);
}
function pickWinner() public restricted {
uint index = random() % players.length;
address contractAddress = address(this);
players[index].transfer(contractAddress.balance);
players = new address payable[](0);
}
modifier restricted() {
require(msg.sender == manager);
_;
}
function getPlayers() public view returns(address payable[] memory){
return players;
}
}
前端 React Web3 启动
import Web3 from "web3";
const web3 = new Web3(window.ethereum);
export default web3;
前端 React 合约创建
import web3 from "./web3";
const contractAddress = "0x0C04a9a1587524dA1F2c65561Ca157f582242FC8";
const abi = [
{
inputs: [],
stateMutability: "nonpayable",
type: "constructor",
constant: undefined,
payable: undefined,
signature: "constructor",
},
{
inputs: [],
name: "enter",
outputs: [],
stateMutability: "payable",
type: "function",
constant: undefined,
payable: true,
signature: "0xe97dcb62",
},
{
inputs: [],
name: "getPlayers",
outputs: [[Object]],
stateMutability: "view",
type: "function",
constant: true,
payable: undefined,
signature: "0x8b5b9ccc",
},
{
inputs: [],
name: "manager",
outputs: [[Object]],
stateMutability: "view",
type: "function",
constant: true,
payable: undefined,
signature: "0x481c6a75",
},
{
inputs: [],
name: "pickWinner",
outputs: [],
stateMutability: "nonpayable",
type: "function",
constant: undefined,
payable: undefined,
signature: "0x5d495aea",
},
{
inputs: [[Object]],
name: "players",
outputs: [[Object]],
stateMutability: "view",
type: "function",
constant: true,
payable: undefined,
signature: "0xf71d96cb",
},
];
const lottery = new web3.eth.Contract(abi, contractAddress);
export default lottery;
在 App.js 中调用合约方法:
import React, { useEffect, useRef, useState } from "react";
import web3 from "./web3";
import lottery from "./lottery";
const { ethereum } = window;
function App() {
useEffect(() => {
//Calling Manager
async function getManager() {
const account = await ethereum.request({ method: "eth_requestAccounts" });
console.log(account);
const manager = await lottery.methods.manager().call({
from: account[0],
});
console.log(manager);
}
getManager();
}, []);
return (
<div>
<h2>Lottery Contract</h2>
<p>This Contract is managed by</p>
</div>
);
}
export default App;
【问题讨论】:
标签: reactjs blockchain solidity web3 web3js