solidity学习笔记(一)

认识solidity的基本组成

关于搭建的第一个solidity ----Hello World

pragma solidity ^0.5.0; // 当前使用的solidity 的版本号

contract Hello {
    string public name; // 定义一个变量 name
    function sayhello() public returns (string memory){ //定义一个方法
        name = 'hello world';
        return name;
    }
}

在remix编译器上运行这个代码
solidity学习笔记(一)_第1张图片
通过点击deploy来部署智能合约,部署成功后会出现下面绿色框的内容,里面展示的是你的智能合约中 public 出来的函数和变量名字;可以通过点击他们进行数据的展示和函数方法的调用。当点击sayhello的时候,会调用合约中的函数,控制台也会打印出调用成功的日志,然后再点击name查看调用之后的name的值,会发现变成了hello world

pragma solidity ^0.5.0;

contract Calculate {
    uint public a = 20;
    uint public b = 30;
    uint public c;
    function add() public{
        c = a + b;
    }
    function sub() public {
        c = b - a;
    }
    function mul() public {
        c = a * b;
    }
    function div() public {
        c = b / a;
    }
}

上面的例子中a 和 b 已经定义并且给了固定的值,如果想要通过从外界传值的话需要改变一下代码的结构;

pragma solidity ^0.5.0;

contract Calculate {
    // uint public a = 20;
    // uint public b = 30;
    uint public c;
    function add(uint a, uint b) public{
        c = a + b;
    }
    function sub(uint a, uint b) public {
        c = a - b;
    }
    function mul(uint a, uint b) public {
        c = a * b;
    }
    function div(uint a, uint b) public {
        c = a / b;
    }
}

solidity学习笔记(一)_第2张图片
点击部署之后可以传入你的参数,用逗号隔开,写入参数之后点击调用函数方法,就可以运行方法;
看起来这一切和以往的编程语言差不多~确实差不多,现在在来看看判断语句;if 的应用:

pragma solidity ^0.5.0;

contract Judge {
   uint public c = 0;
   function judgement(uint a, uint b) public returns(uint){
       if(a > b){
           return a + b;
       } else if( a == b) {
           return a * b;
       } else {
           return c;
       }
   }
}

solidity的循环(数组)

pragma solidity ^0.5.0;

contract Judge {
   uint[5] a = [1,2,3,4,5];
   uint[] b;
   function getList() public returns(uint){
       for(uint i = 0; i < a.length; i++){
           b.push( a[i]);
       }
       return b[2]; // 3
   }
}

说道循环不得不说一下solidity的数组这个概念,目前对于solidity定义一个数组是有两种方式,一个是规定了数组的长度的,一个是不确定数组长度的;
uint[5] 表示定义的数组的长度是5位
uint[] 表示的是不确定数组的长度的情况下,一般这种数组是memory类型,

  • T[k]:元素类型为T,固定长度为k的数组;
  • T[]:元素类型为T,长度为动态的数组;
  • bytes string: 是一种特殊的数组;
  • string 可以转换为bytes,bytes类似于byte[];
    数组的成员有:length和push()
    通过bytes()可以将字符串转换成一个字节数组

memory表示你的数据变量是临时的,这是一个标记,与他相对的是storage,就是我们常说的内存,他不是永久存在的,比如函数的参数和函数的返回值都默认的存在内存中,memory是一个临时的空间,在函数调用的时候出现,在函数调用之后被释放;
storage修饰的变量是永久存在的,比如一些复杂变量,状态变量就是存在区块链中,storage对gas的消耗是远远大于memory的;

solidity的public 和 private

public:
公开函数是合约接口的一部分,可以通过内部或者消息来进行调用。对于public类型的状态变量,会自动创建一个访问器。 函数默认的可见性是public
private:
私有函数和状态变量仅在当前合约中可以访问,在继承的合约内,不可访问,外部也是无法访问的。
internal:
这种状态变量可供外部和子合约调用,这种类型的函数和private类型的函数一样,智能合约自己内部调用,不过和private不一样的是,他可以在继承的合约里面调用,它和其他语言中的protected不完全一样。
external:
外部函数是合约接口的一部分,只能使用消息调用。

pragma solidity ^0.4.20;

contract Test {
    
  uint public data;
  
  function f(uint a) private returns (uint b) {
    return a + 1;
  }
  function setData(uint a) internal {
    data = a;
  }
  function exSetData(uint a) external {
    data = a;
  }
  function testsetData(uint a) public {
    setData(1);
    this.exSetData(1);
  }
}
contract D {
  function readData() {
    Test test = new Test();
    // test.setData(1); 这样写会报错
    test.exSetData(1);
    test.testsetData(1);
  }
}

你可能感兴趣的:(DAPP)