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); */
        person = Person(personAddr);
        person.increaseAge(21);
        return person.getAge();
    }
    
    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);
  return person.getAge();
}

但是面对demo中如果需要一个设置指定age的Person对象,在部署测试合约时,初始化了newPerson(age=20)对象,可以通过日志获取到newPerson其实就是合约地址。如果再调用TestDemo函数测试这个newPerson


 1. person   =  new Person(newPerson);
 2. person  =  new Person(_contractAddress); //_contractAddress 可以在日志中获取到 --- newPerosn的日志输出 

发布了6 篇原创文章 · 获赞 1 · 访问量 178

猜你喜欢

转载自blog.csdn.net/qq_35434814/article/details/104470097