【Solidity】Array 數組 增刪改查 範例
Solidity 的陣列是可以存儲多個元素的資料結構。它可以存儲同類型的資料,並且可以通過索引來存取元素。陣列可以在合約中被宣告並使用。
文章目錄
- ArrayModifier.sol
- Array.sol
- 鏈上智能合約
1.ArrayModifier.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
library ArrayModifier {
function push(uint256[] memory _nums, uint256 _num) internal pure {
assembly {
mstore(add(_nums, mul(add(mload(_nums), 1), 0x20)), _num)
mstore(_nums, add(mload(_nums), 1))
mstore(0x40, add(mload(0x40), 0x20))
}
}
function pop(uint256[] memory _nums) internal pure returns (uint256 num_) {
assembly {
num_ := mload(add(_nums, mul(mload(_nums), 0x20)))
mstore(_nums, sub(mload(_nums), 1))
}
}
function del(uint256[] memory _nums, uint256 _index) internal pure {
assembly {
if lt(_index, mload(_nums)) {
mstore(
add(_nums, mul(add(_index, 1), 0x20)),
mload(add(_nums, mul(mload(_nums), 0x20)))
)
mstore(_nums, sub(mload(_nums), 1))
}
}
}
function update(uint256[] memory _nums, uint256 _index, uint256 _num) internal pure {
_nums[_index] = _num;
}
function get(uint256[] memory _nums, uint256 _index) internal pure returns (uint256) {
return _nums[_index];
}
}
2.Array.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "./ArrayModifier.sol";
contract Array {
using ArrayModifier for uint256[];
//新增資料
function push(uint256[] memory _nums, uint256 num) external pure returns (uint256[] memory) {
_nums.push(num);
return _nums;
}
//刪除最後一個資料
function pop(uint256[] memory _nums) external pure returns (uint256[] memory, uint256) {
uint256 num_ = _nums.pop();
return (_nums, num_);
}
//刪除特定資料(會亂掉)
function del(uint256[] memory _nums, uint256 _index) external pure returns (uint256[] memory) {
_nums.del(_index);
return _nums;
}
//更新資料
function update(uint256[] memory _nums, uint256 _index, uint256 _num) external pure returns (uint256[] memory) {
_nums.update(_index, _num);
return _nums;
}
//取得資料
function get(uint256[] memory _nums, uint256 _index) external pure returns (uint256) {
return _nums.get(_index);
}
}
3.鏈上智能合約
BSC Testnet Array