地址类型 Address
地址类型有两种形式,他们大致相同:
-
address`:保存一个20字节的值(以太坊地址的大小)。
-
address payable :可支付地址,与 address 相同,不过有成员函数
transfer和send。
可以向address payable发送以太币,而不能向一个普通的 address 发送以太币
允许从 address payable 到 address 的隐式转换,而从 address 到 address 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
send 是 transfer 的低级版本。如果执行失败,当前的合约不会因为异常而终止,但 send 会返回 false。
call, delegatecall 和 staticcall
为了与不符合应用二进制接口Application Binary Interface(ABI) 的合约交互,或者要更直接地控制编码,提供了函数 call,delegatecall 和 staticcall ,有点像js的call,这里不深入讲,一是比较难理解,二是这些函数都是低级函数,应谨慎使用,它们破坏了 Solidity 的类型安全性。
code 和 codehash 成员
你可以查询任何智能合约的部署代码。使用 .code 来获取EVM的字节码。值可能是空。 使用 .codehash 获得该代码的 Keccak-256哈希值
合约类型
每一个合约都有他自己的类型。
您可以隐式地将合约转换为从他们继承的合约。 合约可以显式转换为 address 类型。
如果声明一个合约类型的局部变量( MyContract c ),则可以调用该合约的函数。
您还可以实例化合约(即新创建一个合约对象),参考 ‘使用new创建合约’。
定长字节数组
关键字有:bytes1, bytes2, bytes3, …, bytes32。
function bytesfn() public view{
bytes1 a = 0xff;
bytes2 b = 0x1234;
console.logBytes1(a[0]);
console.logBytes2(b[0]);
console.logBytes2(b[1]);
}

成员变量:
.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 形式的科学符号也是支持的,尽管指数必须是整数,但底数可以是小数,比如:, -2e10, 2e-10, 2.5e1。
可以在数字之间加上下划线,十进制 123_000,十六进制 0x2eff_abde,科学十进制表示 1_2e345_678都是有效的。 下划线仅允许在两位数之间,并且不允许下划线连续出现。
字符串字面常量
字符串字面常量是指由双引号或单引号引起来的字符串( "foo" 或者 'bar')
Unicode 字面常量
unicode"Hello 😃";
十六进制字面常量
hex"001122FF"