solibity常用语法

引言

很久没写合约了,今天一写很多语法都忘记了,整理一下把

函数

语法 描述
public 公有,任何人(拥有以太坊账户的)都可以调用 牢记
private 私有, 只有智能合约内部可以调用 牢记
external 仅合约外部可以调用,合约内部需使用this调用 先忽略
internal 仅合约内部和继承的合约可以调用 先忽略
view/constant 函数会读取但是不会修改任何contract的状态变量 牢记
pure(纯净的) 函数不使用任何智能合约的状态变量 牢记
payable 调用函数需要付钱,钱付给了智能合约的账户 牢记
returns 返回值函数声明中使用
  • 访问可见性
    public、private **
    修饰为public的状态变量会默认生成一个同名的public函数

状态变量默认是internal的(先理解为private即可)

csharp 复制代码
pragma solidity ^0.4.24;


contract  Test {
    //状态变量
    //类型不匹配时需要显示转换类型
    //返回值需要使用returns描述


    //public/private 可以修饰状态变量
    //状态变量默认是私有的
    uint256 public ui256 = 100;

    int8 private i10 = -10;


    //private 修饰的函数为私有的,只有合约内部可以调用
    function add() private view returns(uint256) {
        return ui256 + uint256(i10);
    }


    function isEqueal() public view returns(bool) {
        return ui256 == uint256(i10);
    }

    //Public修饰的函数为共有的,合约内外都可以调用
    function Add() public view returns(uint256){
        return add();
    }
}

view,constant,pure讲解

  • 如果一个函数里面,访问了状态变量,但是没有修改,我们使用view或者constant修饰。
  • 如果访问了状态变量,而且修改了,那么就不能constant和view,否则会报错,不修饰即可。
  • 如果没有使用过状态变量,我们要修饰为pure。
  • 如果你修饰为constant,但是你在函数中修改了,效果是:不会报错,正常执行,但是值不会改变。
csharp 复制代码
pragma solidity ^0.4.24;


contract test1 {

    int8 public i8 = 100; //成员变量就是状态变量
    int i256 = 256;

    //表示不会修改函数内的状态变量
    //为了明确语义,一般要加上constant(view两者完全相同)
    function add() private constant returns(int) {
        return i8 + i256;
    }

    //public 表示所有的人都可以看到的,而且可以调用
    //private表示所有人都可以看到,但是无法调用
    function mins() constant returns(uint256) {
        return  uint256(i256 - i8);
    }

   function isEqual(int a, int b) public pure returns(bool) {
       return a == b;
   }

    function setValue(int8 num) {
        i8 = num;
    }

    function setValue1(int8 num) constant {
        i8 = num;
    }
}

payable

  • 任何函数,只要修饰为payable,那么就可以在调用这个方法的时候,对value字段赋值,然后将价值value的钱转给合约。
  • 若这个函数没有指定payable,但是对value赋值了,那么本次调用会报错。
csharp 复制代码
pragma solidity ^0.4.24;


contract test1 {
    uint128 public num;

    //如果构造函数中未指定payable关键字,那么创建合约时不允许转账
    //如果指定了payable,则可以转账
    constructor() public  {

    }

    //任何函数,只要指定了payable关键字,这个合约就可以接受转账,调用时,也可以转0
    function giveMoney() public payable {

    }
}

构造函数

仅在部署合约时调用一次,完成对合约的初始化。可以在创建合约时转钱到合约

相当于go里面的init函数

  • 合约同名函数(已废弃)
  • constructor关键字修饰(推荐)

注意,所有在合约内的东西对外部的观察者来说都是可见,将某些东西标记为private仅仅阻止了其它合约来进行访问和修改,但并不能阻止其它人看到相关的信息。

- 匿名函数

用于转账

一个合约可以有且只有一个匿名函数,此函数不能有参数,也不能有任何返回值,当我们企图去执行一个合约上没有的函数时,那么合约就会执行这个匿名函数。

当合约在只收到以太币的时候,也会调用这个匿名函数,而且一般情况下会消耗很少的gas,所以当你接收到以太币后,想要执行一些操作的话,你尽可以把你想要的操作写到这个匿名函数里,因为这样做成本非常便宜。

csharp 复制代码
//如果想向合约转账,在合约中添加如下函数即可
function() payable {
    //函数体什么都不填
}
  • 用于处理不存在的函数
  • 合约之间调用,非js调用
csharp 复制代码
contract Test {
  function() { x = 1; }
  uint x;
}

contract Caller {
  function callTest(address testAddress) {
    Test(testAddress).call('0xabcdefgh'); // hash does not exist
    // results in Test(testAddress).x becoming == 1.
  }
}
相关推荐
CryptoPP8 小时前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
全干engineer12 小时前
Web3 借贷与清算机制全解析:链上金融的运行逻辑
金融·web3·去中心化·区块链·智能合约
禺垣16 小时前
区块链技术概述
大数据·人工智能·分布式·物联网·去中心化·区块链
区块链蓝海1 天前
Fluence推出“Pointless计划”:五种方式参与RWA算力资产新时代
web3·区块链
weixin_442316981 天前
北京大学肖臻老师《区块链技术与应用》公开课:12-BTC-比特币的匿名性
区块链
科技快报2 天前
微算法科技(NASDAQ:MLGO)基于信任的集成共识和灰狼优化(GWO)算法,搭建高信任水平的区块链网络
科技·区块链
电报号dapp1193 天前
加密货币钱包开发指南:多链资产管理与非托管安全范式
安全·web3·去中心化·区块链·智能合约
这儿有一堆花3 天前
比特币:固若金汤的数字堡垒与它的四道防线
算法·区块链·哈希算法
穗余3 天前
NodeJS全栈WEB3面试题——P2智能合约与 Solidity
web3·区块链·智能合约
选择不变3 天前
更新版【飞云翻倍系统】新增支撑压力多线参考技术,操盘技术图文解说
区块链·通达信指标公式·炒股技巧·短线指标·炒股指标