前言
随着区块链技术的普及,智能合约成为了区块链应用中不可或缺的部分。而在使用智能合约时,与其在区块链上直接编写,更为便捷的方法是使用 Node.js 中的 web3.js 库。在本文中,我们将详细介绍在 Node.js 中使用 web3.js 部署及调用智能合约的完整教程。
准备工作
在开始部署及调用智能合约前,需要对项目进行一些基本的准备工作。
安装 Node.js
Node.js 是一款基于 Chrome V8 JavaScript 引擎的 JavaScript 运行时。在使用 web3.js 进行部署及调用智能合约时,需要在计算机中安装 Node.js。在安装完成后,我们可以在终端中输入以下代码,查看 Node.js 是否安装成功:
node -v
如果终端上返回了 Node.js 的版本号,则安装成功。
安装 web3.js
web3.js 是以太坊官方的 JavaScript 库,用于与以太坊区块链进行交互。在使用 web3.js 进行部署及调用智能合约时,需要在 Node.js 项目中安装 web3.js。可以使用以下命令进行安装:
npm install web3
创建智能合约
在使用 web3.js 部署及调用智能合约前,需要创建智能合约,并将其编译为以太坊虚拟机(EVM)可读的字节码。在本文中,我们将使用一个简单的示例智能合约,代码如下:
// www.javascriptcn.com code example
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 storedData;
function set(uint256 x) public {
storedData = x;
}
function get() public view returns (uint256) {
return storedData;
}
}该示例智能合约为一个简单的存储器,可通过 set() 函数存储数据,通过 get() 函数获取数据。
创建智能合约后,可以使用 Solidity 编译器将其编译为字节码。可以在 Solidity 官方网站上找到 Solidity 编译器,并上传智能合约代码进行编译。
部署智能合约
在创建智能合约并编译为字节码后,需要将其部署到以太坊区块链上。在 Node.js 中,可以使用 web3.js 库实现智能合约的部署。
连接以太坊节点
在使用 web3.js 连接到以太坊网络前,需要先获取网络的 RPC 地址。可以在以太坊客户端软件中找到 RPC 地址。
在 Node.js 中,可以使用以下代码连接到以太坊网络:
const Web3 = require('web3');
const web3 = new Web3('https://mainnet.infura.io/v3/your-project-id');其中,https://mainnet.infura.io/v3/your-project-id 是以太坊网络的 RPC 地址。
创建智能合约对象
在连接到以太坊网络后,需要创建智能合约对象。可以使用以下代码创建智能合约对象:
const SimpleStorage = new web3.eth.Contract(abi);
其中,abi 是智能合约的 ABI(Application Binary Interface),也就是智能合约接口的定义,可在 Solidity 编译器中找到。
部署智能合约
创建智能合约对象后,可以使用以下代码部署智能合约:
// www.javascriptcn.com code example
const deploy = SimpleStorage.deploy({
data: bytecode,
arguments: []
});
deploy.send({
from: '0x123456789...',
gas: 1500000,
gasPrice: '30000000000000'
}, function(error, transactionHash){})
.on('error', function(error){
console.log(error)
})
.on('transactionHash', function(transactionHash){
console.log(transactionHash)
})
.on('receipt', function(receipt){
console.log(receipt.contractAddress)
})
.on('confirmation', function(confirmationNumber, receipt){
console.log(confirmationNumber)
})
.then(function(newContractInstance){
console.log(newContractInstance.options.address)
});其中,bytecode 是智能合约的字节码,也可在 Solidity 编译器中找到。from 是智能合约的部署账户地址,需要在以太坊网络中存在。gas 和 gasPrice 是调用智能合约时需要消耗的 GAS 和 GAS 价格,需要提供足够的 GAS 和 GAS 价格,否则智能合约部署将失败。
获取智能合约地址
部署智能合约后,可以使用以下代码获取智能合约的地址:
console.log(newContractInstance.options.address);
调用智能合约
在部署智能合约后,可以使用 web3.js 库调用智能合约的函数。
创建智能合约对象
在连接到以太坊网络后,需要创建智能合约对象。可以使用以下代码创建智能合约对象:
const SimpleStorage = new web3.eth.Contract(abi, address);
其中,abi 是智能合约的 ABI,address 是智能合约的地址。
调用智能合约函数
创建智能合约对象后,可以使用以下代码调用智能合约的函数:
// www.javascriptcn.com code example
SimpleStorage.methods.set(value).send({
from: '0x123456789...',
gas: 1500000,
gasPrice: '30000000000000'
}, function(error, transactionHash){})
.on('error', function(error){
console.log(error)
})
.on('transactionHash', function(transactionHash){
console.log(transactionHash)
})
.on('receipt', function(receipt){
console.log(receipt)
})
.on('confirmation', function(confirmationNumber, receipt){
console.log(confirmationNumber)
})
.then(function(newContractInstance){
console.log(newContractInstance)
});其中,set(value) 是智能合约的 set() 函数,value 是需要设置的值。from 是调用智能合约的账户地址,需要在以太坊网络中存在。gas 和 gasPrice 是调用智能合约时需要消耗的 GAS 和 GAS 价格,需要提供足够的 GAS 和 GAS 价格,否则调用智能合约函数将失败。
获取智能合约数据
调用智能合约函数后,可以使用以下代码获取智能合约存储的数据:
SimpleStorage.methods.get().call({
from: '0x123456789...'
}, function(error, result){
console.log(result);
});其中,get() 是智能合约的 get() 函数。call() 表示调用智能合约函数,但不会产生交易。from 是调用智能合约的账户地址,需要在以太坊网络中存在。
结语
本文详细介绍了在 Node.js 中使用 web3.js 部署及调用智能合约的完整教程。通过以上步骤,可以在 Node.js 中方便地部署和调用智能合约,为区块链应用的开发提供了便利。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cfc8cfe46428fe9ebc34fd