- 第 1 章 区块链
- 第 2 章 以太坊
- 第 3 章 以太坊私链入门
- 第 4 章 以太坊网络
- 第 5 章 geth v1.8.16 命令详解
- 第 6 章 Wallet
- 第 7 章 Token
- 第 8 章 智能合约语言 Solidity v0.5.0
- 第 9 章 Truffle v4.1.8 开发框架
- 第 10 章 web3.js - 1.0.0
- 第 11 章 web3j v3.4.0 - Jave Client
- 11.2. 启动以太坊
- 11.3. Maven pom.xml 文件
- 11.4. Java 与 Solidity 数据类型映射关系
- 11.5. 常量
- 11.6. 连接到服务器获取版本号
- 11.7. 获得以太坊状态信息
- 11.8. 单位转换
- 11.9. 账号管理
- 11.10. Credentials
- 11.11. 交易
- 11.12. 钱包
- 11.13. 智能合约
- 11.14. ERC20合约
- 11.15. Infura
- 11.16. 助记词
- 11.17. 过滤器 (Filter)
- 11.18. Subscription
- 11.19. 解锁账号
- 11.20. IBAN (International Bank Account Number)
- 11.21. Springboot with Ethereum (web3j)
- 第 12 章 web3.py - A python interface for interacting with the Ethereum blockchain and ecosystem.
- 第 14 章 Ethereum Developer APIs
- 第 15 章 infura
- 第 16 章 以太坊案例
- 第 17 章 FAQ
- 17.3. Error: authentication needed: password or unlock
- 17.4. 新增节点后不生效
- 17.5. Unhandled rejection Error: Returned error: The method personal_unlockAccount does not exist/is not available
- 17.6. Error: exceeds block gas limit
- 17.7. Migrations.sol:11:3: Warning: Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(…) { … }" instead.
- 17.8. Exception in thread "main" rx.exceptions.OnErrorNotImplementedException: Invalid response received: okhttp3.internal.http.RealResponseBody@6c25e6c4
- 17.9. 旧版本 Remix(browser-solidity) 本地安装
- 第 18 章 Hyperledger Fabric v2.0.0
- 第 19 章 Hyperledger Fabric 运维
- 第 20 章 Chaincode 链码(智能合约)
- 第 21 章 Hyperledger Fabric Client SDK for Node.js
- 第 22 章 fabric-sdk-java
- 第 24 章 已知 Hyperledger 落地案例
- 第 25 章 Fabric Command
- 第 26 章 Fabric FAQ
- 第 27 章 IPFS(InterPlanetary File System,星际文件系统)
- 第 28 章 IPFS 命令
- 第 29 章 IPFS WebUI
- 第 30 章 IPFS 集群配置
- 第 31 章 IPFS API
- 第 32 章 IPFS Faq
- 第 33 章 EOS
- 第 34 章 EOS 安装
- 第 35 章 CLEOS
- 第 36 章 智能合约开发
- 第 37 章 EOS Dapp 开发
- 第 38 章 FAQ
- 第 39 章 BaaS (Blockchain as a Service) 平台
- 第 40 章 BitCoin
- 第 41 章 其他区块链相关
- 附录 1. 附录
8.5. 数据类型
8.5. 数据类型
8.5.1. 数值型
int/uint:变长的有符号或无符号整型。变量支持的步长以8递增,支持从uint8到uint256,以及int8到int256。需要注意的是,uint和int默认代表的是uint256和int256。
有符号整型能够表示负数的代价是其能够存储正数的范围的缩小,因为其约一半的数值范围要用来表示负数。如:uint8的存储范围为0 ~ 255,而int8的范围为-127 ~ 127
支持的运算符:
比较:<=,<,==,!=,>=,>,返回值为bool类型。
位运算符:&,|,(^异或),(~非)。
数学运算:+,-,一元运算+,*,/,(%求余),(**次方),(<<左移),(>>右移)。
小数由"."组成,在他的左边或右边至少要包含一个数字。如"1.",".1","1.3"均是有效的小数。
8.5.1.1. 加 +,减 -,乘 *,除 / 运算演示
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Math { function mul(int a, int b) public pure returns (int) { int c = a * b; return c; } function div(int a, int b) public pure returns (int) { int c = a / b; return c; } function sub(int a, int b) public pure returns (int) { return a - b; } function add(int a, int b) public pure returns (int) { int c = a + b; return c; } }
8.5.1.2. 求余 % 运算演示
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Math { function m(int a, int b) public pure returns (int) { int c = a % b; return c; } }
8.5.1.3. 幂运算演示
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Math { function m(uint a, uint b) public pure returns (uint) { uint c = a**b; return c; } }
8.5.1.4. 与 &,| 或,非 ~,异或 ^ 演示
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Math { function yu() public pure returns (uint) { uint a = 3; // 0b0011 uint b = 4; // 0b0100 uint c = a & b; // 0b0000 return c; // 0 } function huo() public pure returns (uint) { uint a = 3; // 0b0011 uint b = 4; // 0b0100 uint c = a | b; // 0b0111 return c; // 7 } function fei() public pure returns (uint8) { uint8 a = 3; // 0b00000011 uint8 c = ~a; // 0b11111100 return c; // 0 } function yihuo() public pure returns (uint) { uint a = 3; // 0b0011 uint b = 4; // 0b0100 uint c = a ^ b; // 0b0111 return c; // 252 } }
8.5.1.5. 位移演示
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Math { function leftShift() public pure returns (uint8) { uint8 a = 8; // 0b00001000 uint8 c = a << 2; // 0b00100000 return c; // 32 } function rightShift() public pure returns (uint8) { uint8 a = 8; // 0b00001000 uint8 c = a >> 2; // 0b00000010 return c; // 2 } }
a << n 表示a的二进制位向左移动n位,在保证位数没有溢出的情况下等价于 a乘以2的n次方。
a >> n 表示a的二进制位向右移动n位,在保证位数没有溢出的情况下等价于 a除以2的n次方。
8.5.2. 字符串
string 字符串类型,字符串可以通过""或者''来定义字符串的值
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract StringTest { string name; function StringTest() public{ name = "default"; } function setName(string _name) public{ name = _name; } function getName() public view returns(string){ return name; } }
8.5.2.1. 获取字符串长度
在 Solidity 中想获得字符串长度必须转成 bytes 类型然后使用 length 属性获得。bytes(string).length
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract StringTest { string public name = "http://www.netkiller.cn"; function nameBytes() public constant returns (bytes) { return bytes(name); } function nameLength() public constant returns (uint) { return bytes(name).length; } function length(string _name) public pure returns (uint) { return bytes(_name).length; } }
提示 | |
---|---|
注意:汉字采用UTF8编码,一个汉字等于3个字节,当你使用 length("景峯") 测试时会返回长度 6。 |
8.5.3. 布尔(Booleans)
bool: 可能的取值为常量值true和false。支持的运算符:
! 逻辑非 && 逻辑与 || 逻辑或 == 等于 != 不等于 bool a = true; bool b = !a; // a == b -> false // a != b -> true // a || b -> true // a && b -> false
8.5.4. 字节类型
bytes names = "netkiller" bytes9 _names = "netkiller"; bytes(name)[0] = 0xFF; bytes memory _tmp = new bytes(3); _tmp[0] = 0x4e; _tmp[1] = 0x65; _tmp[2] = 0x6f;
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract BytesTest { bytes names = "netkiller"; function get() public view returns (bytes) { return names; } function getBytes2() public pure returns (bytes2) { bytes9 _names = "netkiller"; return bytes2(_names); } function bytesToString() public constant returns (string) { return string(names); } function copyBytes(bytes b) public pure returns (bytes) { bytes memory tmp = new bytes(b.length); for(uint i = 0; i < b.length; i++) { tmp[i] = b[i]; } return tmp; } function bytesToString2() public pure returns (string) { bytes memory _tmp = new bytes(3); _tmp[0] = 0x4e; _tmp[1] = 0x65; _tmp[2] = 0x6f; return string(_tmp); } }
.length可以动态修改字节数组的长度
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract BytesTest2 { // 初始化一个两个字节空间的字节数组 bytes public array = new bytes(2); // 设置修改字节数组的长度 function setLength(uint _len) public { array.length = _len; } // 返回字节数组的长度 function getLength() constant public returns (uint) { return array.length; } // 往字节数组中添加字节 function pushArray(byte _tmp) public{ array.push(_tmp); } }
8.5.5. 数组
//创建一个memory的数组 uint[] memory a = new uint[](7); uint[] x = [uint(1), 3, 4]; bytes memory b = new bytes(10);
二维数组
uint [2][3] T = [[1,2],[3,4],[5,6]];
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract ArrayTest { uint [] array = [1,2,3,4,5]; // 通过for循环计算数组内部的值的总和 function sum() constant public returns (uint) { uint num = 0; for(uint i = 0; i < array.length; i++) { num = num + array[i]; } return num; } function sumNumbers(uint[] _numbers) public pure returns (uint) { uint num = 0; for(uint i = 0; i < _numbers.length; i++) { num = num + _numbers[i]; } return num; } }
8.5.5.1. length
.length 属性是活动数组的尺寸
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract ArrayLength { uint [] array = [1,2,3,4,5]; function getLength() public constant returns (uint) { return array.length; } }
8.5.5.2. push() 方法
通过 push 可以向数组中添加数据
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract ArrayLength { uint [] array = [1,2,3,4,5]; function pushArray() public { array.push(6); } function getLength() public constant returns (uint) { return array.length; } }
8.5.6. 枚举类型
State 就是一个自定义的整型,当枚举数不够多时,它默认的类型为uint8,当枚举数足够多时,它会自动变成uint16,枚举下标定义从左至右从零开始。
New=0, Pending=1, Done=2, Deleted=3
访问枚举方式 State.New 实际等于数字 0
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract EnumTest { enum State { New, Pending, Done, Deleted } State state = State.New; function set(State _state) public { state = _state; } function get() constant public returns (State) { return state; } }
枚举用来定义状态
pragma solidity ^0.4.0; contract Purchase { enum State { Created, Locked, Inactive } // Enum }
8.5.7. 结构体
定义结构体
struct Voter { uint weight; // weight is accumulated by delegation bool voted; // if true, that person already voted address delegate; // person delegated to uint vote; // index of the voted proposal } // This is a type for a single proposal. struct Proposal { bytes32 name; // short name (up to 32 bytes) uint voteCount; // number of accumulated votes }
演示例子
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Students { struct Person { string name; uint age; uint class; } Person person = Person("Neo",18,1); function getPerson() public view returns(string){ return person.name; } }
8.5.7.1. 函数返回Struct
Struct 不知直接返回,解决方法如下
pragma solidity ^0.4.19; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract Netkiller { struct JobStruct { uint a; uint b; uint c; } function getValues () public pure returns (uint, uint, uint) { JobStruct memory js = JobStruct(1, 2, 3); return (js.a, js.b, js.c); } }
8.5.8. address
address public minter;
下面是一个获得账号余额的例子。
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract AddressTest{ function getBalance(address _addr) public constant returns (uint){ return _addr.balance; } }
8.5.8.1. payable
8.5.8.2. .value()
8.5.8.3. .gas()
8.5.9. mapping
mapping 就是图数据结构,由 key 和 value 组成。
pragma solidity ^0.4.25; //Author: netkiller <netkiller@msn.com> //Home: http://www.netkiller.cn contract MappingExample { mapping(uint => string) map; function put(uint key, string value) public { map[key] = value; } function get(uint key) constant public returns (string) { return map[key]; } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论