Web3 智能合约通过数组方式存储更多学生数据

之前的文章 Web3 在Truffle项目中编写出自己的第一个solidity智能合约带大家写了一个相对捡漏的智能合约
Web3 智能合约通过数组方式存储更多学生数据_第1张图片
这样 每次 我们set 后 都会将原来的数据覆盖掉了

那么 有些人可能会想 那我们弄个数组 将新的数据全部加到数组里不就行了吗?
这个想法其实就很不错 我们可以基于这个想法 对我们的智能合约进行改造

我们将 StudentStorage.sol 代码整个更改如下

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

contract StudentStorage{
    //struct是一个结构体
    struct userData {
        uint id;
        string name;
        uint age;
    }
    //基于结构体创建一个动态数组
    userData[] public userList;
    
    function addtList(string memory name,uint age) public returns (uint) {
        uint cont = userList.length;
        uint index = cont+1;
        userList.push(userData(index,name,age));
        return userList.length;
    }

    function queryList() public view returns (userData[] memory) {
        return userList;
    }
}

我们先定义了一个struct结构体 其中 是一个对象 对象中有三个字段 数字类型id 字符串类型name 数字类型age
然后呢 我们定义了一个数组 userList 它的类型被限制为userData
就是 之后 你给他添加的每一个下标都必须是这个格式的 id name age 的一个对象
这里 我们定义了他是一个动态数组 就是没有限制它的长度
你也可以这样

下标类型[10] public 数组名称;

这样 他就成一个静态的里 固定为十条数据

然后 我们addtList 接收两个参数 字符串类型的name 和 数字类型的age
然后 我们 就还少一个id
那么 我们这里 做一个自增的逻辑 通过 数组.length 获取到我们userList的长度 然后 将它加一 作为index 传给userData
这样我们三个参数齐全了 就调用push 将数据插入到数组最后面
处理完之后 我们返回数组的长度
然后 我们的queryList只是单纯的把处理好的userList数组返回

然后 我们就可以来试试成功了 先终端执行

truffle migrate

将我们写的合约部署到区块链上

然后 我们在 项目根目录下创建一个文件夹 叫 scripts 下面创建一个test.js
参考内容如下

const Contacts = artifacts.require("StudentStorage.sol")

module.exports = async function(callback) {
    const studentStorage = await Contacts.deployed();
    await studentStorage.addtList("天山派掌门",11);
    await studentStorage.addtList("小猫猫",15);
    await studentStorage.addtList("大猫猫",25);
    const list = await studentStorage.queryList();
    console.log(list);
    callback()
}

我们导入了StudentStorage
这里 不用特意指定contracts
他会自动在contracts 帮你找这个文件
然后 我们Contacts.deployed 初始化这个合约的对象
然后 我们通过这个对象 调用了addtList 连续加了三条数据
然后 调用queryList获取这个数组
然后输出上去

然后 我们终端执行

truffle exec .\scripts\test.js

测试代码
Web3 智能合约通过数组方式存储更多学生数据_第2张图片
显然 我们的运行就成功了 数据都被加了进去

然后 我们最神奇的操作在这里
我们再次运行

truffle exec .\scripts\test.js

Web3 智能合约通过数组方式存储更多学生数据_第3张图片
他就变成六条了 因为 你第一次运行 他加了三条 第二次运行 他又加了三条

因为我们区块链本身也有存储能力 当然 我们智能合约每次执行操作 包括这个添加数据 他都会消耗燃料

然后 我们在 根目录下的scripts 下 的 test.js中添加一行代码

console.log(await studentStorage.userList(1))

Web3 智能合约通过数组方式存储更多学生数据_第4张图片
寻找id为 1 的数据
再次执行

truffle exec .\scripts\test.js

结果就被输出了
Web3 智能合约通过数组方式存储更多学生数据_第5张图片

你可能感兴趣的:(web3,智能合约)