web3.js的工作方式
let web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546');
快速浏览API
使用web3.js构建您的Dapp
1.构建合同并将其部署到网络
> mkdir greeting
> cd greeting
> truffle init
npminstall-gtruffle
> npm install -g solc
// check the installed version
> solc --version
> truffle create contract Greeting
复制并粘贴以下代码:
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.8.0;
contract Greeting {
string public greeting = "hello";
function sayHello() external view returns (string memory) {
return greeting;
}
function updateGreeting(string calldata _greeting) external {
greeting = _greeting;
}
}
我们只需要2_deploy_greeting.js在migrations文件夹下添加一个迁移文件:
const Greeting = artifacts.require("Greeting");
module.exports = function (deployer) {
deployer.deploy(Greeting);
};
> truffle compile
> truffle migrate
2.将前端与智能合约连接
> mkdir client
> cd client
> npm init -y
> touch index.html
安装web3.js和lite-server依赖项:
> npm i web3 --save
> npm i lite-server --save-dev //for running a development server
<script type="text/javascript" src="node_modules/web3/dist/web3.min.js"></script>
<script type="text/javascript" src="src/utils.js"></script>
<script type="text/javascript" src="src/index.js"></script>
获取一个web3实例
一旦将web3.js作为项目中的依赖项,您所需要做的就是使用提供者的实例实例化web3对象,以便享受web3所提供的一切。
我们将使用window.ethereum注入到浏览器中的MetaMask提供程序,并按照MetaMask文档window.ethereum.request中的说明,请求用户使用来访问其帐户。
打开utils.js文件并添加以下功能:
const getWeb3 = () => {
return new Promise((resolve, reject) => {
window.addEventListener("load", async () => {
if (window.ethereum) {
const web3 = new Web3(window.ethereum);
try {
// ask user permission to access his accounts
await window.ethereum.request({ method: "eth_requestAccounts" });
resolve(web3);
} catch (error) {
reject(error);
}
} else {
reject("Must install MetaMask");
}
});
});
};
> npm i jquery
首先,我们需要使用来获取与MetaMask连接的网络的ID web3.eth.net.getId()。
注意:假设您已经配置了MetaMask以使用Ganache。如果不确定如何操作,可以按照本指南进行操作。
接下来,我们将使用返回的ID从Greeting.json文件中获取合同的地址,该文件还将为我们提供合同ABI并使用以下命令创建合同的实例web3.eth.Contract:
3.与智能合约互动
创建合同实例后,就可以开始使用调用文档的方法myContract.methods.myMethod([arguments]),如docs中所述。
如果要调用的函数是纯函数或只读函数,则需要使用:
myContract.methods.myMethod([arguments]).call()
如果要调用的函数要修改状态(又称事务),则需要使用:
myContract.methods.myMethod([arguments]).send()
const displayGreeting = async (greeting, contract) => {
greeting = await contract.methods.sayHello().call();
$("h2").html(greeting);
};
const updateGreeting = (greeting, contract, accounts) => {
let input;
$("#input").on("change", (e) => {
input = e.target.value;
});
$("#form").on("submit", async (e) => {
e.preventDefault();
await contract.methods
.updateGreeting(input)
.send({ from: accounts[0], gas: 40000 });
displayGreeting(greeting, contract);
});
};
async function greetingApp() {
const web3 = await getWeb3();
const accounts = await web3.eth.getAccounts();
const contract = await getContract(web3);
let greeting;
displayGreeting(greeting, contract);
updateGreeting(greeting, contract, accounts);
}
greetingApp();
作者:链三丰,来源:区块链研究实验室
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。