Solidity

【Solidity】Array 數組 增刪改查 範例

【Solidity】Array 數組 增刪改查 範例

Solidity 的陣列是可以存儲多個元素的資料結構。它可以存儲同類型的資料,並且可以通過索引來存取元素。陣列可以在合約中被宣告並使用。


文章目錄

  1. ArrayModifier.sol
  2. Array.sol
  3. 鏈上智能合約

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *