solidity函数重载以及调用

这篇具有很好参考价值的文章主要介绍了solidity函数重载以及调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何调用重载方法

web3.js调用

call调用重载方法查数据

const web3 = new Web3('https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161')
const contract = new web3.eth.Contract(ContractAbi,ContractAddress)
const rewardsBalance = await contract.methods['f(uint256,address)'](1,"0x0000000000000000000000000000000000000000").call()
console.log('rewardsBalance', rewardsBalance)

send调用重载方法写数据

const web3 = new Web3(library?.provider || 'https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161')
const contract = new web3.eth.Contract(ContractAbi,ContractAddress)
const rewardsBalance = await contract.methods['claimRewards(uint256)'](1).send({from: account})

ethers.js调用

const {library, account, chainId} = useWeb3React()
const staticJsonRpcProvider = new ethers.providers.StaticJsonRpcProvider('https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161')

let contract = new ethers.Contract(
  ContractAddress,
  ContractAbi,
  library?.getSigner() ?? staticJsonRpcProvider
);
console.log(contract)
const rewardsBalance = await contract['f(uint256,address)'](1,"0x0000000000000000000000000000000000000000")
console.log('rewardsBalance', rewardsBalance.toString())

@chainstarter/multicall-client.js调用

  • 这款是自主研发的支持高并发multicall库

查数据

import {config, Contract as ClientContract, multicallClientSend, multicallClient, ChainId, getWeb3} from "@chainstarter/multicall-client.js";
const contract = new ClientContract(ContractAbi, ContractAddress, ChainId.ETH)
    const call = contract.getRewardsBalance('0x0000000000000000000000000000000000000000')
    const call2 = contract['getRewardsBalance(address,uint256)']('0x0000000000000000000000000000000000000000', 1)
    multicallClient([
      call,
      call2,
      contract.governor()
    ]).then(res => {
      console.log('res', res)
    })

写数据

import {config, Contract as ClientContract, multicallClientSend, multicallClient, ChainId, getWeb3} from "@chainstarter/multicall-client.js";
const contract = new ClientContract(ContractAbi, ContractAddress, ChainId.ETH)
const send1 = contract['claimRewards(uint256)'](1)
    multicallClientSend([
      send1
    ], window.ethereum).send({
      from: account
    }).on('transactionHash', (hash) => {
 
		}).on('receipt', (rec) => {
		    
		}).on('error', (err) => {
		    
		  })

关于solidity函数重载

一个合约可以有多个同名但参数类型不同的函数。这个过程称为“重载”,也适用于继承的函数。下面的例子展示 f了合约范围内函数的重载A

pragma solidity >=0.4.16 <0.9.0;

contract A {
    function f(uint value) public pure returns (uint out) {
        out = value;
    }

    function f(uint value, bool really) public pure returns (uint out) {
        if (really)
            out = value;
    }
}

外部接口中也存在重载函数。如果两个外部可见函数的不同在于它们的 Solidity 类型而不是它们的外部类型,这是一个错误。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;

// This will not compile
contract A {
    function f(B value) public pure returns (B out) {
        out = value;
    }

    function f(address value) public pure returns (address out) {
        out = value;
    }
}

contract B {
}

上面的两个f函数重载最终都接受了 ABI 的地址类型,尽管它们在 Solidity 中被认为是不同的。

重载解析和参数匹配

通过将当前作用域中的函数声明与函数调用中提供的参数匹配来选择重载函数。如果所有参数都可以隐式转换为预期类型,则选择函数作为重载候选者。如果不完全是一个候选人,则决议失败。

  • 重载解析不考虑返回参数。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;

contract A {
    function f(uint8 val) public pure returns (uint8 out) {
        out = val;
    }

    function f(uint256 val) public pure returns (uint256 out) {
        out = val;
    }
}

调用f(50)会产生类型错误,因为50可以隐式转换为uint8uint256类型。另一方面f(256)将解决f(uint256)重载,因为256不能隐式转换为uint8.

在 solidity 的 0.6.0 版本之后:

  • 重写函数或修饰符时,必须使用新关键字 override
    • 接口会自动作为 virtual,在接口外部没有实现的函数必须标记为 virtual 。
  • 仅当函数被标记为 virtual 或在接口中定义时,才可以重写。
  • private 的函数是不可以标记为 virtual 的。
  • 对于单继承,请在每个重写函数中添加 override 。
  • 对于多继承,添加 override(A, B, …),在括号中列出所有覆盖函数的合约。

关于函数重载,详见官方文档:https://docs.soliditylang.org/en/v0.8.14/contracts.html#function-overloading文章来源地址https://www.toymoban.com/news/detail-709068.html

到了这里,关于solidity函数重载以及调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 以太坊智能合约开发:Solidity语言中的构造函数

    Solidity语言中关于构造函数的定义: 构造函数是使用 constructor 声明的一个可选函数; 构造函数只在合约部署时调用一次,并用于初始化合约的状态变量; 如果没有显式定义的构造函数,则由编译器创建默认构造函数。 构造函数声明语法如下: 其中: ** constructor :

    2024年02月01日
    浏览(51)
  • 玩以太坊链上项目的必备技能(错误处理以及异常-Solidity之旅十四)

    错误处理 作为开发者的我们知道,我们所编写出来的程序难免会出现 bug ,而要做的是捕获异常,给用户抛出一个友好地错误提示。 而在 Solidity 中,根据 状态恢复 异常来处理错误,该异常将撤销在当前调用中对状态所做的所有修改,与此同时,还向调用者标记错误。 它有

    2024年02月01日
    浏览(43)
  • 【C++初阶(二)】缺省参数以及函数重载

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习排序知识   🔝🔝 写C语言代码的时候 特别是在写数据结构时: 经常忘记传函数的参数 或者当前不需要什么参数 C++增加了缺省参数来解决这个问题 而为了

    2024年02月12日
    浏览(35)
  • 新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)以及验签操作

    区块链去中心化思想无处不在,比如最近使用个体抗原自检替代大规模的中心化核酸检测,就是去中心化思想的落地实践,避免了大规模聚集导致的交叉感染,提高了检测效率,本次我们使用Ethereum最新的ethersV5.0以上版本链接去中心化区块链钱包,并且通过后端Golang1.18服务进

    2024年02月02日
    浏览(60)
  • 以太坊智能合约语言Solidity - 3 数组

    1字节(Byte) = 8位 (bit), bytes32 = 256位,bytes1 实质上就等于 int8 固定长度的数组一旦被定义就无法再更改,并且长度在一开始就会被显式定义 我们再来创建一个新的文件用来编写代码 字节数组无法进行基本运算,但是可以比较 字节数组还支持其他一些逻辑运算,具体计算结果

    2023年04月08日
    浏览(59)
  • 自定义的搭建solidity开发环境(以太坊)

    环境地址    github: GitHub - yinzhiqing/templete-sol: solidity platform(hardhat)    gitlab: zqy / templete-sol · GitLab 本项目利用openzapplin solc web3js hardhat nodejs 在ubuntu下搭建solidity合约开发环境.大多数功能实现了自动化(脚本)执行. 特点: 1.开发环境可充分使用 2.合约可升级 3.记

    2024年02月01日
    浏览(36)
  • 以太坊智能合约开发:Solidity 语言快速入门

    在本文中,我们从一个简单的智能合约样例出发,通过对智能合约源文件结构的剖析与介绍,使大家对Solidity语言有一个初步的认识。最后,我们将该智能合约样例在 Remix 合约编译器中编译、部署,观察其执行结果。 在开始之前,我们先对Solidity有个初步的了解,即Solidity是

    2023年04月09日
    浏览(51)
  • 第四章 以太坊智能合约solidity介绍

    Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言,设计的目的是能在以太坊虚拟机上运行。 本章大概介绍合约的基本信息,合约的组成,语法方面不做过多的介绍,个人建议多阅读官方文档效果更佳,后续的章节会开发ERC20代币合约案例以便于更好的学习智

    2024年02月06日
    浏览(51)
  • 以太坊智能合约开发:Solidity语言中的映射

    本文我们介绍Solidity语言中的映射,包括映射的基本定义、语法、映射的变量声明和基本读写操作。并且通过两个智能合约例子演示了映射的定义与基本操作。 Solidity中关于映射的一些定义: 映射以键-值对(key = value)的形式存储数据; 键可以是任何内置数据类型,包括字节

    2024年02月05日
    浏览(54)
  • 基于以太坊的智能合约开发Solidity(基础篇)

    参考教程:基于以太坊的智能合约开发教程【Solidity】_哔哩哔哩_bilibili (1)程序编译完成后,需要在虚拟机上运行,将合约部署好后便可执行刚刚编写的函数。(注意, 合约一旦部署,就会永久存在于区块链上,且不可篡改 ,不过可以销毁) (2)执行完成后,可以得到以

    2024年02月04日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包