//创建合约
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
//定义Person类型的数组
Person[] public people;`
//定义Person类型的数组
Person[] public people;`
完整代码: (僵尸工厂第一课)
pragma solidity ^0.4.25;
contract ZombieFactory {
event NewZombie(uint zombieId, string name, uint dna);
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
function _createZombie(string _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
emit NewZombie(id, _name, _dna);
}
function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(abi.encodePacked(_str)));
return rand % dnaModulus;
}
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}
映射(Mapping)和地址(Address):
Address:每个账户都有一个地址,这是账户唯一的标识符。如:
0x0cE446255506E92DF41614C46F1d6df9Cc969183
Mapping:映射本质上是存储和查找数据所用的键值对。例如:
mapping (address => uint) public accountBalance;
此处,address是键,uint是值。
msg.sender指的是当前调用者(或者智能合约)的address。在solidaty中,功能执行需要从外部开始,有人调用合约里的函数才会起作用,所以msg.sender总是存在的。msg.sender很安全,因为它具有以太坊区块链的安全保障————除非窃取与以太坊地址相关的私钥,否则无法修改其他人的数据。
1. 以太坊中有三个可以存储项目的区域:
- 存储Storage:
是指永远存储在区块链中的变量。
- Memory:
当外部函数对某合约调用完成时,内存型变量即被移除。
internal和external:
两个修饰词军事用于描述函数可见性。
- internal:如果被修饰的函数继承自其父合约,那么父合约里面的函数也可以被此函数调用。
- external:被修饰的函数只能在合约之外被调用,它不能被合约内的函数调用。
view与pure的理解:
Others:在Solidity v4.17之前,只有constant,后来有人嫌constant这个词本身代表变量中的常量,不适合用来修饰函数,所以将constant拆成了view和pure。view的作用和constant一模一样,可以读取状态变量但是不能改;pure则更为严格,pure修饰的函数不能改也不能读状态变量,否则编译通不过。
1. solidaty支持单继承和多继承;
2. 在solidity 0.6.x 版本之后,接口类似于抽象合约,可以使用interface关键字创建
interface Calculator {
function getResult() external view returns(uint);
}
基本数据类型:
uintbooladdressint
常量:
常量是无法修改的变量。
address public constant MY_ADDRESS = 0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc;
Immutable:
不可变变量的值可以在构造函数中修改,但不能随后修改。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Immutable {
// coding convention to uppercase constant variables
address public immutable MY_ADDRESS;
uint public immutable MY_UINT;
constructor(uint _myUint) {
MY_ADDRESS = msg.sender;
MY_UINT = _myUint;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)