在Solidity中,new关键字用于创建一个新的智能合约实例。当你使用new关键字创建一个新的合约实例时,Solidity会在区块链上部署一个新的合约,并返回新合约的地址。自0.8.0版本开始,new关键字通过指定salt选项支持create2特性。

以下是使用new关键字创建新的合约实例的基本语法:

ContractName variableName = new ContractName(arguments);

在这里,ContractName是你要创建的合约的名称,variableName是你要给新创建的合约实例的变量名,arguments是传递给新合约构造函数的参数(如果有的话)。

例如,假设你有一个名为MyContract的合约,它有一个接受一个uint类型参数的构造函数,你可以使用以下代码创建一个新的MyContract实例:

MyContract myContract = new MyContract(123);

在这个例子中,new MyContract(123)会在区块链上部署一个新的MyContract合约,并将构造函数的参数设置为123。然后,它会返回新合约的地址,并将这个地址赋值给myContract变量。

需要注意的是,使用new关键字创建新的合约实例会消耗gas,因为它涉及到在区块链上部署新的合约。因此,你需要确保你有足够的gas来完成这个操作。此外,新创建的合约的代码和数据将被永久存储在区块链上,因此,你需要谨慎地管理你的合约代码和数据,以避免浪费存储空间。

示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

contract Car {
    address public owner;
    string public color;

    constructor(address _owner, string memory _color) {
        owner = _owner;
        color = _color;
    }

    function getOwner() public view returns (address) {
        return owner;
    }

    function getColor() public view returns (string memory) {
        return color;
    }
}

contract CarStore {
    Car[] public cars;

    function create(address _owner, string memory _color) public {
        Car car = new Car(_owner, _color);
        cars.push(car);
    }

    function createWithSalt(
        address _owner,
        string memory _color,
        bytes32 _salt
    ) public {
        Car car = (new Car){salt: _salt}(_owner, _color);
        cars.push(car);
    }

    function getCar(uint256 index)
        public
        view
        returns (address, string memory)
    {
        Car car = cars[index];
        // 即使变量被声明为public,我们也不能在合约外部直接访问它们。只能通过调用自动生成的getter函数来访问这些变量。
        // return (car.owner,car.color);    // 会报错
        // return (car.owner(),car.color());
        return (car.getOwner(), car.getColor());
    }
}

上面的示例中包含两个合约:CarCarStore

  • Car合约代表一辆汽车,它有两个状态变量:ownercolor,分别表示汽车的所有者和颜色。这两个状态变量都被声明为public,因此Solidity会自动为它们生成getter函数。此外,Car合约还有两个自定义的getter函数:getOwnergetColor,它们分别返回汽车的所有者和颜色。
  • CarStore合约代表一个汽车商店,它有一个状态变量cars,用于存储商店中的所有汽车。cars变量是一个Car合约的数组,每个元素都是一个Car合约的实例。
    • create函数:创建一个新的Car合约实例,并将其添加到cars数组中。这个函数接受两个参数:汽车的所有者和颜色。
    • createWithSalt函数:与create函数类似,但它使用create2特性创建新的Car合约实例。create2特性允许你使用一个salt值来影响新合约的地址。这个函数接受三个参数:汽车的所有者、颜色和salt值。
    • getCar函数:返回cars数组中指定索引的汽车的所有者和颜色。这个函数接受一个参数:汽车的索引。

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意

腾讯云开发者社区:孟斯特