【一】solidity基本数据类型使用、主要关键字学习、address使用、 view,constant,pure讲解、public、private

solidity数据类型

0. 状态变量vs局部变量

定义在合约之内,但是在函数之外的变量,我们叫做状态变量,这些变量是会上传到区块链上保存的。

下面这个合约中的message就是状态变量。

solidity语言没有main函数,只要合约部署到区块链上,就会永不停歇的执行。

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;
contract Inbox{
    //状态变量
    string public message; 

    function setMessage(string memory newMessage) public {
        //局部变量
        string memory tmp = "hello";
        message = newMessage;
    }

    function getMessage() public view returns(string memory){
        return message;
    }
}

1. 布尔

go语言: var flag bool , flag = true

bool flag1 ;
bool flag2 = false;

2. 整型

  • int(有符号整型,有正有负)
  • uint(无符号整型,无负数)
  • 以8位为区间,支持int8,int16,int24 至 int256,uint同理。 int默认为int256,uint默认为uint256

3. 函数类型

函数类型也就是我们所说的函数,本身也是一个特殊的变量,它可以当做变量赋值当做函数参数传递当做返回值

- 函数声明

函数名,函数签名(返回值,参数类型,修饰符)

- 几个非常非常非常重要的关键字

修饰符说明
public公有,任何人(拥有以太坊账户的)都可以调用
private私有, 只有智能合约内部才可以调用
external仅合约外部可以调用,合约内部需使用this调用
internal仅合约内部和继承的合约可以调用
view/constant函数会读取但是不会修改任何contract的状态变量
pure(纯净的)函数不使用任何智能合约的状态变量
payable调用函数需要付钱,钱付给了智能合约的账户
returns返回值函数声明中使用

- 访问可见性

- public、private

修饰为public的状态变量会默认生成一个同名的public函数

- view,constant,pure讲解

  1. 如果一个函数里面,访问了状态变量,但是没有修改,我们使用view或者constant修饰。
  2. 如果访问了状态变量,而且修改了,那么就不能constant和view,否则会报错,不修饰即可。
  3. 如果没有使用过状态变量,我们要修饰为pure。
  4. 如果你修饰为constant,但是你在函数中修改了,效果是:不会报错,正常执行,但是值不会改变。

- payable

  1. 任何函数,只要修饰为payable,那么就可以在调用这个方法的时候,对value字段赋值,然后将价值value的钱转给合约。
  2. 若这个函数没有指定payable,但是对value赋值了,那么本次调用会报错。

- 匿名函数

  • 用于转账

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

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

//如果想向合约转账,在合约中添加如下函数即可
function() payable {
    //函数体什么都不填
}
  • 用于处理不存在的函数
  • 合约之间调用,非js调用
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.
  }
}

4. 地址(Address)

- 概述

以太坊地址的长度,大小为20个字节,20 * 8 = 160位,所以可以用一个uint160编码。地址是所有合约的基础,所有的合约都会继承地址对象,通过合约的地址串,调用合约内的函数。

- 余额(balance)

返回指定地址的余额

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;


contract Test {
    address public addr1 = 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db;
    address public addr2 = 0x617F2E2fD72FD9D5503197092aC168c91465E7f2;

    receive() external payable {}
    // 向合约账户转账 
    function transderToContract() payable public {
        payable(address(this)).transfer(msg.value);
    }

    // 获取当前合约的余额 
    function getBalance1()public view returns(uint256){
        return address(this).balance;
    }

    // 获取指定地址的余额
    function getbalance(address addr) public view returns(uint256){
        return addr.balance;
    }

    // 由合约向addr1地址转10 eth
    function transfer() public {
        payable(addr1).transfer(10*10**18);
    }
}

5. 枚举类型(Enums)

  • 枚举类型是在Solidity中的一种用户自定义类型。
  • 枚举可以将显示的与整数进行转换,但不能进行隐式转换。显示的转换会在运行时检查数值范围,如果不匹配,将会引起异常。
  • 枚举类型应至少有一名成员,枚举元素默认为uint8,当元素数量足够多时,会自动变为uint16,第一个元素默认为0,使用超出范围的数值时会报错。
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract test {

    enum WeekDays {
        Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
    }

    WeekDays currentDay;
    WeekDays defaultday = WeekDays.Sunday;

    function setDay(WeekDays _day) public {
        currentDay = _day;
    }

    function getDay() public view returns(uint256) {
        return uint256(currentDay);
    }

    function getDefaultDay() public view returns(uint256) {
        return uint256(defaultday);   
    }
}

6. 字节数组

[]byte go -> bytes

- 定长的字节数组

solidity内置了一些数组的数据类型:(和go语言做一下对比, var b8 [8]byte),完全只读

  • bytes1, … ,bytes32,允许值以步长1递增。
  • byte默认表示bytes1,byte是类型,bytes是类型,bytes1是内置数组
  • bytes1只能存储1个字节,即8位的内容,bytes2最多只能存储2个字节,即16位的内容。以此类推…
  • 长度可以读取 length(返回bytes5类型的长度,而不是赋值的长度)
  • 长度不可以修改
  • 可以通过下标访问
  • 内容不可修改

内置成员:length,返回数组长度

**存储方式:**16进制ascii码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yida&yueda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值