从智能合约中删除数据的详细方法(含代码)

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

本文就来总结一下从智能合约中删除数据的方法,同时附上相应代码。

这里有一个智能合约,用于向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,然后它将进入一个未决状态:

完成后,我们得到:

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

如上图,已经成功从智能合约中删除了该项数据。