solidity智能合约开发简介
1、solodity简介
Solidity语言是一种以太坊智能合约高级编程语言,运行在以太坊(Ethereum)虚拟机(EVM)之上。
Solidity语言是一种语法类似JavaScript的高级编程语言。Solidity语言被设计成以编译的方式生成以太坊虚拟机代码。使用它很容易创建开发用于投票、众筹、封闭拍卖、多重签名钱包等以太坊智能合约。
但作为一种真正意义上运行在互联网上的去中心化智能合约,它又有很多的不同,所以Solidity编程语言也很不同:
- 以太坊底层是基于帐户,而非UTXO的,所以Solidity语言提供有一个特殊的Address类型。用于定位用户账号,定位智能合约,定位智能合约的代码(智能合约本身也是一个帐户)。
- 由于Solidity语言内嵌框架是支持支付的,并且提供了一些关键字,如payable,可以在Solidity语言层面直接支持支付,用起来十分简单。
- 数据存储是使用网络上的区块链,数据的每一个状态都可以永久存储,所以Solidity语言在开发时需要确定变量是使用内存,还是区块链。
- Solidity运行环境是在一个去中心化的网络上,特别强调以太坊智能合约或函数执行的调用方式。因为原来一个简单的函数调用变为了一个网络上的节点代码执行,完全是分布式的编程环境。
- Solidity语言的异常机制也很不一样,一旦出现异常,所有的执行都将会被回撤,这主要是为了保证以太坊智能合约执行的原子性,以避免中间状态出现的数据不一致。
2、HelloWorld
目前学习Solidity语言编程最好的方式是使用基于浏览器的编译器。
https://remix.ethereum.org/#optimize=false&version=soljson-v0.4.0+commit.acd334c9.js(需要翻墙)
pragma solidity >=0.4.22 <0.6.0;
contract HelloWorld{
string Myame = "kzhang";
function getName() public view returns(string){
return Myame;
}
function changeName(string newName) public{
Myame = newName;
}
3、数据类型
真假bool值
初始默认值为false。pragma solidity >=0.4.22 <0.6.0;
contract BooleanTest{
bool _a ;
int num1 = 100;
int num2 = 200;
function getBool() returns(bool){
return _a; //返回false
}
function getBool2() returns(bool){
return !_a; //返回true
}
}
整形特性与运算
uint
int
注:特别需要注意整数溢出- 底层位运算
& 与
| 或
~ 取反
^ 异或
<< 左移 >> 右移 整形字面量
solidity 中整形计算的时候,是只管计算的结果,只要结果满足是整形,就不会保存(但可能溢出)。//比如这种操作
function intergerTest() returns(uint){
uint num = 2/50 * 10000;
return num;
}
function intergerTest2() returns(uint){
uint num1 = 111111111112 - 111111111110;
return num2; //返回值是2
}
由于没有float型,遇到小数,需要 转成 整形处理,通过乘以 1000(可以有多个0)
- 固定长度字节数组
bytes1 ,bytes2 ,bytes3 ,bytes32。(以步长1递增)
(bytes1等价于uint8 ; bytes32 等价于 uint256)
1、bytes1长度是固定的,一旦定义,是不可以再修改的。
pragma solidity >=0.4.22 <0.6.0;
contract ByteArray{
bytes1 public num1 = 0x7a;
bytes2 public num2 = 0x7a7b;
bytes8 public num3 = 0x7a7b7c7d7e7f7c7d;
function getLength() public returns(uint){
return num3.length;//获取长度
}
}
2、说是字节数组,但是如果想要修改内部的数据,也是不能修改的,只能整体重新赋值
动态字节数组bytes
可以修改长度,也可以修改内存pragma solidity >=0.4.22 <0.6.0;
contract DynamicByte{bytes public name = new bytes(2);
function InitName(){
name[0] = 0x7a;
name[1] = 0x7b;
}
function getLength() view public returns(uint){
return name.length;
}
//修改内存
function changeName(){
name[0] = 0xaa;
}
//修改长度,是有数据右边填充0
function changeLength(){
name.length = 5;
}
}
//添加数据到数组尾部,同时修改数组长度
function pushTest(){
name.push(0x99);
}
4、节约gas的利器——pure与view
在Solidity中constant、view、pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了,因为不需要矿工来验证。在Solidity v4.17之前,只有constant,后续版本将constant拆成了view和pure。view的作用和constant一模一样,可以读取状态变量但是不能改;pure则更为严格,pure修饰的函数不能改也不能读状态变量,智能操作函数内部变量,否则编译通不过。
pragma solidity >=0.4.22 <0.6.0;
contract HelloWorld{
string Myname = "kzhang";
function getName() public view returns(string){
return Myname;
}
function changeName(string newName) public{
Myname = newName;
}
function pureTest1(string _name) pure public returns(string){
return _name;
}
function pureTest2(string _name) pure public returns(string){
//return Myname;//编译报错!pure比constant和view都要严格,pure完全禁止读写状态变量
return "123";
}
function viewTest() public view returns(string){
Myname = "123"; //view和constant效果一致,编译会报warning,但是可以通过
return Myname; // return 123,但是!状态变量age的值不会改变,仍然为"kzhang"!
}
}
还没有评论,来说两句吧...