solidity学习过程+函数构造器constructor()+智能合约实例化关于使⽤constructor() —⽬前
学习其他语⾔时,感觉构造函数总是先执⾏,然后才能获取这个类。但是在智能合约中,先产⽣智能合约,然后在⾛构造函数。~~删除线格式~~ 涉及到this能否在构造函数中使⽤问题
因为智能合约的先产⽣,那我们可以在构造器中实现⼀些功能:如下所⽰
(1)获取智能合约地址 --参与地址的计算
address(this)
(2) 在构造函数中触发事件 (涉及到不同合约之间调⽤,Eg:取合约地址的问题)
(3)通过构造函数可以对常量赋值,
contract A {
uint x;
constructor(uint a) public {
x = a ;
}
}智能合约
实例化智能合约时,传⼊参数赋值
A newA = new A(5);
(4) 实现智能合约的⾃我销毁 (通过设置 creator,限制合约拥有者才能销毁函数) ----析构函数
析构函数(selfdestruct)是销毁数据,销毁合约;
Demo实例
pragma solidity ^0.5.0;
contract Ademo {
uint number ;
//  声明⼀个地址类型的状态变量owner;
address  owner;
constructor() internal {
// 构造函数,给状态变量owner赋值
owner = msg.sender;
number += 10;
}
function increment(uint addNum) public {
if (owner == msg.sender) {
number = number + addNum;
}
}
function getCurrentNum() public view returns (uint) {
return number;
}
function kill() private {
if (owner == msg.sender) {
// 析构函数,销毁合约,只有合约持有者调⽤这个⽅法才会进内部逻辑
selfdestruct(address(uint(owner)));
}
}
}
solidity5.0 Address分为 address 与address payable
地址类型 Address
地址类型有两种形式,他们⼤致相同:
- address:保存⼀个20字节的值(以太坊地址的⼤⼩)。
- address payable :可⽀付地址,与 address 相同,不过有成员函数 transfer 和 send 。
这种区别背后的思想是 address payable 可以接受以太币的地址,⽽⼀个普通的 address 则不能。
类型转换:
允许从 address payable 到 address 的隐式转换,⽽从 address 到 address payable 的转换是不可以的(执⾏这种转换的唯⼀⽅法是使⽤中间类型,先转换为 uint160 ),如:
address payable ap = address(uint160(addr));
智能合约的实例化–不同智能合约的调⽤
1. 不同在同⼀⽂件下的智能合约之间的调⽤可以通过继承或者"import"实现(待补充)
2. 同⼀⽂件下不同智能合约的调⽤ ------- 直接上demo
pragma solidity >=0.5.0 <0.7.0;
contract Person{
uint age = 10;
event getMessages(uint);
//构造器会⾃动修改age的值
constructor(uint a) public {
age += a;
emit getMessages(age);
}
function increaseAge(uint num)  public  returns (uint){
return age += num;
}
function getAge() public view returns (uint){
return age;
}
}
contract CallTestPerson{
uint a = 10;
//⾸先声明⼀个Person变量
Person person;
event GetInstance(Person);
constructor() public {
/
/Person合约中的构造器来产⽣新的对象;并且newPerson对应的age将是 20+10      Person newPerson = new Person(20);
//事件可以获取newPerson对象,根据⽇志可知,就是对应的智能合约地址
emit GetInstance(newPerson);
}
/*
@param personAddr --智能合约地址
@return  返回当前Person对象中age的值
*/
function CallTestdemo(address personAddr) public returns (uint) {
/* emit GetInstance(newPerson); */
solidityperson = Person(personAddr);
person.increaseAge(21);
Age();
}
function callIncreaseAge(uint num) public  returns (uint){
return person.increaseAge(num);
}
}
通常情况下,通过合约地址获取实例化对象实例化智能合约对象
Person person;
funtion TestGetperson(address _contractAddress) public view returns (uint) {
person = new Person(_contractAddress);
Age();
}
但是⾯对demo中如果需要⼀个设置指定age的Person对象,在部署测试合约时,初始化了newPerson(age=20)对象,可以通过⽇志获取到newPerson其实就是合约地址。如果再调⽤TestDemo函数测试这个newPerson
1. person  =  new Person(newPerson);
2. person  =  new Person(_contractAddress); //_contractAddress 可以在⽇志中获取到 --- newPerosn的⽇志输出

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。