区块链学堂(12):Browser-solidity 3–数组增删改查的合约

我们依然打开Browser-solidity的地址:
https://ethereum.github.io/browser-solidity

一个简单的实现对数组增删改查的智能合约

pragma solidity 0.4.9;
/*数组类型Demo*/
contract DemoTypes303 {
  /*String数组例子*/
  string[] strArr;
  function add(string str){
    strArr.push(str);
  }

  function getStrAt(uint n) constant returns (string s){
    string tmp = strArr[n];
    return tmp;
  }

  function updateStrAt(uint n, string str) {
    strArr[n] = str;
  }

  function deleteStrAt(uint index) {
    uint len = strArr.length;
    if (index >= len) return;
    for (uint i = index; i<len-1; i++) {
      strArr[i] = strArr[i+1];
    }

    delete strArr[len-1];
    strArr.length--;
  }
}

代码分析

  • string[] strArr; 定义了一个字符串的数组变量strArr, 且该变量没有public因此不可见
  • strArr.push(str); 其中的push是数组类型的两个member之一,另一个是length. 这里的push就是给该数组增加一个元素。//这里实现了对数组的新增功能
    function add(string str){
      strArr.push(str);
    }
    
  • getStrAt(uint n) 是一个简单的读取字符串的函数,//这里实现对数组的读取功能
  • updateStrAt(uint n, string str) // 实现对数组的更新功能
  • deleteStrAt(uint index) 这个值得一说,因为solidity默认的数组类型中没有删除功能,因此此处自己写了一个删除代码,核心方法就是保证删除某项后,后面的元素依次向前,同时删除数据,同时保证数组的member length正确。

Browser solidity 部署和调用

将上面的代码复制黏贴到Browser-solidity上面,可以看到编译成功,并生成了可部署的web3 deploy代码。
这里我们在内存中试试看该智能合约的4个基本方法 增删改查

1. add function

  • 输入hello 01, 然后点击add按钮,我们可以看到在经过一部分gas的消耗后,该数据被执行成功!
  • PS:需要注意的是这里的getStrAt和add,update,delete等方法颜色不同,按上方的分类,一个是transaction,一个则是call,因此在geth上的调用方法也是不同的。
2. getStrAt function

既然已经增加了一个元素,我们就可以查看数组strArr的数值了,根据数组常识,我们只增加了一个元素,因此getStrAt[0] 应该为hello 01. 而getStrAt[1] 则应该为错误。

实际结果如下:getStrAt[0]

getStrAt[1]:

3. updateStrAt functoin

4. deleteStrAt function

要测试这个方法,稍微麻烦点,最好是

  • step 1需要先add(“hello 01”), add(“hello 02”),add(“hello 03”)
  • step 2然后调用deleteStrAt(0);
  • step 3 检查是否第一项被删除,而getStrAt(0)应该等于”hello 02″, getStrAt(1)应该等于”hello 03″
  • 然后重复step1-3,作用于deleteStrAt(1),删除中间项目,或者deleteStrAt(2)删除最后一项,还有deleteStrAt(3)/deleteStrAt(100)/deleteStrAt(-100) 等检查是否做了边界检查。

这里时间有限,就不试验了,有兴趣的同学可以自己在browser solidity上面尝试。

作为礼物,这里有另外的几个简单的智能合约,有兴趣的同学都可以多用browser-solidity来尝试
pragma solidity ^0.4.4;

contract DemoTypes {
  /*uint public resultOfF;*/
  event LogUint(uint value);
  event LogInt (int value);


  function f(uint a) returns (uint b)
  {
    uint result = a * 8;
    /*resultOfF = result; //debug used only;*/
    LogUint(result);
    return result;
  }

  /*输入长度宽度,返回面积*/
  function f2(int width, int height) returns (int square) {
    if (width < 0 || height < 0) throw;
    int result = width * height;
    LogInt(result);
    return result;
  }

  /*输入N,计算N的阶乘,循环实现*/
  function f3(uint n) returns (uint jiecheng) {
    if (n == 0) throw; uint result = 1;
    for (uint i=1; i<=n; i++) {
      result *= i;
    }
    return result;
  }

  /*计算从1到N的求和*/
  function f4(uint n) returns (uint sum) {
    if (n == 0) throw; uint result = 0;
    for (uint i=0; i<=n; i++) {
      result +=i;
    }
    return result;
  }
}

下一章我们将介绍一个简化版的代币合约,敬请期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值