以最简单的智能合约来说明
pragma solidity 0.4.9; contract DemoTypes { function f(uint a) returns (uint b) { uint result = a * 8; return result; }
}
第一行代码来告诉编译器使用什么版本
pragma是关键词代表程序开始,solidity是代表使用solidity语言来撰写智能合约
第二行contract DemoTypers{} solidity中的contract和面对对象语言中的类很相像。
有带持久数据的变量,以及能改变这些变量的function。因此有构造函数,有继承,有变量,有function,也有抽象。
有solidity所写的智能合约,经过编译后就可以在EVM来部署执行。
Solidity语言是一种类似js的语言,因此许多编码的规则与JS很相似。
第三行function f(uint a)returns (uint b){}
上面说过。contract中包含了变量&方法(function)。
function f(uint a)returns (uint b)代表定义了一个名为f的函数,输入变量为unit a 输出 unit b
uint代表无状态的整形数字,即大于0的整数
带负数的整形类型为int
pragma solidity 0.4.22;
contract demo{
string[] strarr ;
function add(string str){
strarr.push(str);
}
function getStrAt(uint n) returns (string s){
string tmp = strarr[n];
return tmp;
}
function update(uint a,string str){
strarr[a] = str;
}
function deletestr(uint a){
uint len = strarr.length;
if(a>len) return;
for(uint i=a;i<len;i--){
strarr[i]=strarr[i+1];
}
delete strarr[len-1];
strarr.length--;
}
}
//增删改查的智能合约
2018/07/16 21.33
pragma solidity 0.4.24;
contract Token3{
mapping (address=>uint)public balancesof;
function Token3(){
balancesof[msg.sender]=10000;
}
}
这里的address简单的来说就是geth中账户的地址(公钥)
因此此处的代码mapping (address=>uint)balancesof 代表定义了一个key为address类型,value为uint类型的hashtable,名字为balancesof。所以在任何区块链私链上的账户都可以通过balancesof[address]来查询他们的代币。相当于定义
msg的定义:msg就是指谁调用智能合约时候发来的信息,之前说过智能合约也是一个账户。因此在以太坊中调用智能合约从底层上来看就是一个账户给智能合约账户发送一个transaction,里面包含了谁发送的,发送了多少以太币,发送了多少gas。
因此balancesof[msg.sender] = 10000;代表个msg.sender也就是创建该合约的地址赋予了一个初始值10000
pragma solidity 0.4.9;
contract Token {
mapping (address => uint) public balancesOf;
address public owner;
function Token() {
owner = msg.sender;
balancesOf[msg.sender] = 10000;
}
function transfer(address _to, uint _value) {
if (balancesOf[msg.sender] < _value) throw; //避免转移出去的代币超过当前的存货
if (balancesOf[_to] + _value < balancesOf[_to]) throw; //避免自己调用自己,或者递归调用
balancesOf[msg.sender] -= _value;
balancesOf[_to] += _value;
}
function mint(uint _amount) {
balancesOf[owner] += _amount;
}
}
在上面的代码中,我们设置一个public owner 保存创建合约的msg.sender,记录下创建者的地址。
在function transfer(),我们设置了两个条件,避免转移出去的代币超过存货的情况,以及自己转移给自己的问题
在function mint()中,我们结合约的owner增加我们的代币,让而其简单的分享给别人。