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"!
    } 
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值