您的位置:首页 > 其它

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

2018-01-04 16:41 141 查看
我们依然打开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
;
return tmp;
}

function updateStrAt(uint n, string str) {
strArr
= 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;
}
}


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  以太坊