我们依然打开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;
}
}