solidity智能合约开发简介

快来打我* 2021-07-28 12:28 865阅读 0赞

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(需要翻墙)

format_png

format_png 1

  1. pragma solidity >=0.4.22 <0.6.0;
  2. contract HelloWorld{
  3. string Myame = "kzhang";
  4. function getName() public view returns(string){
  5. return Myame;
  6. }
  7. function changeName(string newName) public{
  8. Myame = newName;
  9. }

3、数据类型

  • 真假bool值
    初始默认值为false。

    pragma solidity >=0.4.22 <0.6.0;

    contract BooleanTest{

    1. bool _a ;
    2. int num1 = 100;
    3. int num2 = 200;
    4. function getBool() returns(bool){
    5. return _a; //返回false
    6. }
    7. function getBool2() returns(bool){
    8. return !_a; //返回true
    9. }

    }

  • 整形特性与运算
    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)

format_png 2

1、bytes1长度是固定的,一旦定义,是不可以再修改的。

  1. pragma solidity >=0.4.22 <0.6.0;
  2. contract ByteArray{
  3. bytes1 public num1 = 0x7a;
  4. bytes2 public num2 = 0x7a7b;
  5. bytes8 public num3 = 0x7a7b7c7d7e7f7c7d;
  6. function getLength() public returns(uint){
  7. return num3.length;//获取长度
  8. }
  9. }

2、说是字节数组,但是如果想要修改内部的数据,也是不能修改的,只能整体重新赋值

  • 动态字节数组bytes
    可以修改长度,也可以修改内存

    pragma solidity >=0.4.22 <0.6.0;
    contract DynamicByte{

    1. bytes public name = new bytes(2);
    2. function InitName(){
    3. name[0] = 0x7a;
    4. name[1] = 0x7b;
    5. }
    6. function getLength() view public returns(uint){
    7. return name.length;
    8. }
    9. //修改内存
    10. function changeName(){
    11. name[0] = 0xaa;
    12. }
    13. //修改长度,是有数据右边填充0
    14. function changeLength(){
    15. name.length = 5;
    16. }

    }

    1. //添加数据到数组尾部,同时修改数组长度
    2. function pushTest(){
    3. name.push(0x99);
    4. }

format_png 3

4、节约gas的利器——pure与view

在Solidity中constant、view、pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了,因为不需要矿工来验证。在Solidity v4.17之前,只有constant,后续版本将constant拆成了view和pure。view的作用和constant一模一样,可以读取状态变量但是不能改;pure则更为严格,pure修饰的函数不能改也不能读状态变量,智能操作函数内部变量,否则编译通不过。

  1. pragma solidity >=0.4.22 <0.6.0;
  2. contract HelloWorld{
  3. string Myname = "kzhang";
  4. function getName() public view returns(string){
  5. return Myname;
  6. }
  7. function changeName(string newName) public{
  8. Myname = newName;
  9. }
  10. function pureTest1(string _name) pure public returns(string){
  11. return _name;
  12. }
  13. function pureTest2(string _name) pure public returns(string){
  14. //return Myname;//编译报错!pure比constant和view都要严格,pure完全禁止读写状态变量
  15. return "123";
  16. }
  17. function viewTest() public view returns(string){
  18. Myname = "123"; //view和constant效果一致,编译会报warning,但是可以通过
  19. return Myname; // return 123,但是!状态变量age的值不会改变,仍然为"kzhang"!
  20. }
  21. }

format_png 4

发表评论

表情:
评论列表 (有 0 条评论,865人围观)

还没有评论,来说两句吧...

相关阅读