函數(shù)重載
定義兩個(gè)函數(shù)不同的是參數(shù)不同。再經(jīng)過(guò)編譯器編譯后,編程了不同的選擇器(selector)
function saySomething() public pure returns(string memory){
return("Nothing");
}
function saySomething(string memory something) public pure returns(string memory) {
return something;
}
實(shí)參匹配
注意??:如下的情況會(huì)報(bào)錯(cuò),因?yàn)?0既能轉(zhuǎn)成uint8,也能轉(zhuǎn)成uint256,編譯器不能確定調(diào)用那個(gè)重載版本
function f(uint8 _in). public pure returns(uint8 out) {
out = _in;
}
function f(uint256 _in). public pure returns(uint256 out) {
out = _in;
}
庫(kù)合約
一種特殊的合約,目的提升Solidity代碼重用性,以及減少合約運(yùn)行的gas消耗。
庫(kù)合約和普通合約有幾個(gè)不同點(diǎn):
(1)庫(kù)合約不能存在狀態(tài)變量。
(2)庫(kù)合約不能繼承別的合約,也不能被繼承。
(3)庫(kù)合約不能接受ETH
(4)庫(kù)合約不能被銷毀
簡(jiǎn)單了解一個(gè)區(qū)塊鏈應(yīng)用程序標(biāo)準(zhǔn)化組織OpenZeppelin 為solidity合約開(kāi)發(fā)的方便性和安全性開(kāi)發(fā)了一些列庫(kù)合約。關(guān)鍵字library
一個(gè)例子:實(shí)現(xiàn)一個(gè)簡(jiǎn)單版本Strings庫(kù)合約:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
library Strings{
bytes16 private constant _HEX_SYMBOLS = "0123456abcdef";
/**
* 將一個(gè)uint256 轉(zhuǎn)換為十進(jìn)制類型表示的ASCII字符串
*/
function toString(uint256 value) public pure returns(string memory) {
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* 將一個(gè)uint256 轉(zhuǎn)換為16進(jìn)制類型表示的ASCII字符串
*/
function toHexString(uint256 value) public pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length ++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* 將一個(gè)uint256 轉(zhuǎn)換為16進(jìn)制類型表示定長(zhǎng)的ASCII字符串
*/
function toHexString(uint256 value, uint256 length)
public pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0,"Strings:hex length insuficient");
return string(buffer);
}
}
使用庫(kù)合約的方法
- 使用using for 指令:using A for B
A 是庫(kù)合約名稱,B 時(shí)Solidity中的數(shù)據(jù)類型名稱。作用將庫(kù)合約A中的函數(shù)自動(dòng)添加為B類型的成員函數(shù),可以直接調(diào)用。
注意??:以變量成員函數(shù)調(diào)用庫(kù)合約的中的函數(shù)時(shí),變量本身會(huì)被當(dāng)作函數(shù)的第一個(gè)參數(shù)傳遞。因此書寫的參數(shù)少一個(gè)
pragma solidity ^0.8.30;
import "./demo_lib.sol";
contract uselib {
using Strings for uint256;
function getString1(uint256 _number) public pure returns(string memory){
return _number.toHexString();
}
}
- 通過(guò)庫(kù)合約名稱調(diào)用庫(kù)函數(shù)
類似其他編程語(yǔ)言的“靜態(tài)方法”或者“類方法”
導(dǎo)入其他合約。import 關(guān)鍵字
-
導(dǎo)入文件位置
import './Yeye.sol'
通過(guò)源文件網(wǎng)址導(dǎo)入網(wǎng)上的合約的全局符號(hào)
通過(guò)npm 包管理器的目錄導(dǎo)入
image.png 導(dǎo)入一個(gè)或多個(gè)指定的符號(hào)
import {Yeye} from '../Yeye.sol'
前面有涉及不再舉例子
