智能合约开发从0到100(3)- 值类型(下)

222 阅读4分钟

地址类型 Address

地址类型有两种形式,他们大致相同:

  • address`:保存一个20字节的值(以太坊地址的大小)。

  • address payable :可支付地址,与 address 相同,不过有成员函数 transfersend

可以向address payable发送以太币,而不能向一个普通的 address 发送以太币

允许从 address payableaddress 的隐式转换,而从 addressaddress payable 必须显示的转换, 通过 payable(<address>) 进行转换。

address 允许和 uint160、 整型字面常量、bytes20 及合约类型相互转换。

只能通过 payable(...) 表达式把 address 类型和合约类型转换为 address payable。 只有能接收以太币的合约类型,才能够进行此转换。例如合约要么有receive或可支付的回退函数。

地址类型成员变量

balance

可以使用 balance 属性来查询一个地址的余额,

transfer

可以使用 transfer 函数向一个可支付地址(payable address)发送 以太币Ether (以 wei 为单位)

address x = 0x123;
address myAddress = this;
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);
send

sendtransfer 的低级版本。如果执行失败,当前的合约不会因为异常而终止,但 send 会返回 false

calldelegatecallstaticcall

为了与不符合应用二进制接口Application Binary Interface(ABI) 的合约交互,或者要更直接地控制编码,提供了函数 calldelegatecallstaticcall ,有点像js的call,这里不深入讲,一是比较难理解,二是这些函数都是低级函数,应谨慎使用,它们破坏了 Solidity 的类型安全性。

codecodehash 成员

你可以查询任何智能合约的部署代码。使用 .code 来获取EVM的字节码。值可能是空。 使用 .codehash 获得该代码的 Keccak-256哈希值

合约类型

每一个合约都有他自己的类型。

您可以隐式地将合约转换为从他们继承的合约。 合约可以显式转换为 address 类型。

如果声明一个合约类型的局部变量( MyContract c ),则可以调用该合约的函数。

您还可以实例化合约(即新创建一个合约对象),参考 ‘使用new创建合约’

定长字节数组

关键字有:bytes1bytes2bytes3, …, bytes32

function bytesfn() public view{
        bytes1 a = 0xff;
        bytes2 b = 0x1234;
        console.logBytes1(a[0]);
        console.logBytes2(b[0]);
        console.logBytes2(b[1]);
    }

image-20221202181939965

成员变量:

  • .length 表示这个字节数组的长度(只读).

枚举类型

enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }

枚举是在Solidity中创建用户定义类型的一种方法。 它们是显示所有整型相互转换,但不允许隐式转换。 从整型显式转换枚举,会在运行时检查整数时候在枚举范围内,否则会导致异常( Panic异常 )。 枚举需要至少一个成员,默认值是第一个成员,枚举不能多于 256 个成员。

用户定义的值类型

用户定义值类型使用 type C is V 来定义,其中 C 是新引入的类型的名称, V 必须是内置的值类型(”底层类型”)。 函数 C.wrap 被用来从底层类型转换到自定义类型。同样地,函数函数 C.unwrap 用于从自定义类型转换到底层类型。

类型 C 没有任何运算符或绑定成员函数。特别是,即使是操作符 == 也没有定义。也不允许与其他类型进行显式和隐式转换。

比较少用到

函数类型

函数类型是一种表示函数的类型。

函数类型表示成如下的形式:

function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]

与参数类型相反,返回类型不能为空 —— 如果函数类型不需要返回,则需要删除整个 returns (<return types>) 部分。

更加详细等讲到函数再说

常量

地址字面常量

比如像 0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF 这样的通过了地址校验和测试的十六进制字面常量会作为 address 类型。

有理数和整数字面常量

整数字面常量由范围在 0-9 的一串数字组成,表现成十进制

十进制小数字面常量带有一个 .,至少在后边有一个数字。 比如: .1, 和 1.3

2e10 形式的科学符号也是支持的,尽管指数必须是整数,但底数可以是小数,比如:, -2e102e-102.5e1

可以在数字之间加上下划线,十进制 123_000,十六进制 0x2eff_abde,科学十进制表示 1_2e345_678都是有效的。 下划线仅允许在两位数之间,并且不允许下划线连续出现。

字符串字面常量

字符串字面常量是指由双引号或单引号引起来的字符串( "foo" 或者 'bar'

Unicode 字面常量

unicode"Hello 😃";

十六进制字面常量

hex"001122FF"