Web3js 05: 调用函数

前言

求其区块链团队出品

旗下网站


调用函数

在以太坊中,智能合约对象的 methods 属性包含了智能合约中所有可供调用的函数。

为了调用智能合约中的某个函数,比如叫做 myFunction(),我们可以使用 contract.methods.myFunction() 的方式调用。

这个方法会返回一个对象,可以通过 send() 方法向智能合约发送交易,同时我们可以设置函数参数和其他选项来进行智能合约交互,并按照智能合约的逻辑执行相应的操作。


在Web3.js中,函数调用可以分为以下几类:

读取智能合约状态的函数调用:这些函数不会改变智能合约的状态,它们仅仅是读取智能合约状态的值并返回。例如,使用 get() 函数获取智能合约里的某个变量值。

写入智能合约状态的函数调用:这些函数将会改变智能合约中的状态,它们可能会导致智能合约状态发生变化。例如,使用 set() 函数将某个值写入到智能合约中。

发送交易的函数调用:这些函数将会调用智能合约中的某个函数,并向区块链广播交易。当交易被打包并验证后,智能合约的状态将会发生变化。例如,使用 send() 函数发送一笔交易。

部署智能合约的函数调用:这些函数将会将智能合约的字节码部署到区块链上以创建一个新的智能合约实例。例如,使用 deploy() 函数部署一个新的智能合约。

::: tip
本章仅介绍读和写函数调用,其他的请读者继续学习
:::

1. 读取智能合约状态的函数调用

let Web3 = require("web3")
let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))

var abi = [/* 这里省略掉 abi */]

var contractAddress = '0x4E4861f95f4cB129Dae9E739458f1583E1100Dd1'
var myContract = new web3.eth.Contract(abi, contractAddress)

myContract.methods.getNumber().call(function(error, result) {
    console.log(result)
})

2. 写入智能合约状态的函数调用

调用写函数,相当于发送了交易

myContract.methods.setNumber(1234)
    .send({ from: '0x956188a6bD41694BdB13AA5CE168543a03B74770' })
    .on('receipt', function(receipt) {
        console.log(receipt)
})

3. 执行事件查询

合约部分

pragma solidity >= 0.7.0 <0.9.0;

contract DemoSimple {
    uint number;

    event myEvent(uint name);

    function setNumber(uint _number) public {
        emit myEvent(_number);
        number = _number;
    }

    function getNumber() public view returns(uint) {
        return number;
    }
}

js 部分

let Web3 = require("web3")
let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:7545"))

var abi = [/* 这里省略掉 abi */]

var contractAddress = '0x9af62672FA2a5f749Df1e3EdCE2A4825Adb73dF2'
var myContract = new web3.eth.Contract(abi, contractAddress)

myContract.getPastEvents(
    'AllEvents', {
        fromBlock: 0,
        toBlock: 'latest'
    },
    (error, result) => { console.log(result) }
)

4. 手工部署合约

let Web3 = require("web3")
let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:7545"))

var abi = [/* 这里省略掉 abi */]
var myContract = new web3.eth.Contract(abi)

// deplay 的 字节码
var data = /* 字节码 */

var candidateNames = ['0x416c696365', '0x4265747479', '0x5365615361']
myContract.deploy({
    data: data,
    arguments: [candidateNames]
}).send({
    from: '0x88F3f579A8f1A84376884286Bd4A7927593834D7',
    gas: 1500000,
    gasPrice: '1000000'
}, function(error, result) {
    console.log(result)
})
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值