如何从智能合约中删除数据

  • 以太坊智能合约允许创建有状态系统,支持对存储数据的添加和删除操作,但需支付矿工费用
  • 示例合约使用Solidity 0.4.18编写,核心功能包括:
    • add()函数通过push()方法向数组myArray添加字符串(如"Edinburgh"、"Glasgow")
    • del()函数通过遍历数组匹配目标字符串(如"London"),并用delete指令删除数据
    • 字符串匹配采用keccak256(abi.encodePacked())进行哈希值比对
  • 删除操作需消耗Gas,执行后数据状态可通过合约的show()函数验证
  • 实际演示显示删除"London"后,数组成功更新,剩余元素保留
总结

有了以太坊,我们可以创建一个有状态的系统,我们可以从存储在智能联系人中的数据中添加和删除数据。这是一个有状态的系统,我们可以改变智能联系人的状态,但这需要向矿工支付一些费用。但是我们如何删除数据呢?

这里有一个智能合约,用于向myArray中添加和移除字符串:

pragma solidity ^0.4.18;contract ExampleApp { string[] myArray; function add(string x) public { myArray.push(x); } function del(string x) public { for (uint j = 0; j < myArray.length; j++) { if (keccak256(abi.encodePacked(myArray[j])) == keccak256(abi.encodePacked(x))) { delete myArray[j]; } } } function show() public view returns (uint256, string) { string memory str; for (uint j = 0; j < myArray.length; j++) { str = string(abi.encodePacked(str, myArray[j])); } return(myArray.length,str); }}

add()函数相当简单,我们基本上只使用了push()方法。有了这个联系,我们可以加上““Edinburgh”、“Glasgow”和“London”:

现在我们将使用以下方法删除“London”:

function del(string x) public { for (uint j = 0; j < myArray.length; j++) { if (keccak256(abi.encodePacked(myArray[j])) == keccak256(abi.encodePacked(x))) { delete myArray[j]; } }

为此,keccak256()方法用于比较两个字符串,并将myArray中的字符串与用户在智能合约(x)中输入的字符串进行匹配:

if (keccak256(abi.encodePacked(myArray[j])) == keccak256(abi.encodePacked(x)))

一旦找到匹配,我们可以用删除数据元素:

delete myArray[j];

现在,我们可以通过选择智能联系人中的删除功能来尝试一下:

这将花费我们一些gas,然后它将进入一个未决状态:

完成后,我们得到:

现在,我们可以回到智能合约,看看数据是否已经被删除:

已经成功删除了!

Source:https://medium.com/asecuritysite-when-bob-met-alice/deleting-data-from-a-smart-contract-182b0e9e09fe


分享至:

作者:去中心化金融社区

本文为PANews入驻专栏作者的观点,不代表PANews立场,不承担法律责任。

文章及观点也不构成投资意见

图片来源:去中心化金融社区如有侵权,请联系作者删除。

关注PANews官方账号,一起穿越牛熊
推荐阅读
2022-04-09 17:01
2022-04-09 16:11
2022-04-09 15:29
2022-04-09 15:20
2022-04-09 14:45
2022-04-09 14:29

热门文章

行业要闻
市场热点
精选读物

精选专题

App内阅读