Ai绘画是一种计算机生成绘画的方法,它使用人工智能算法来创作绘画。
简单的说,就是基于算法完成的艺术创作。
再通俗些说,就是AI软件“计算”出你想要的图片。
随着NFT概念的进一步火热,组合式NFT概念被提出。例如一个头像可以由眼睛、嘴巴和鼻子等元素组成,每个元素都是一个NFT或者FT,这些元素共同组成了一个独一无二的NFT头像。但是对于整个头像NFT而言,在过去传统合约中是没有所谓层级关系的,即鼻子部分并不知道自己属于哪个NFT,或者头像部分不知道自己是由哪些NFT或者FT组成的。为此,ERC-998便应运而生,也就是可组合Composable NFTs,缩写为CNFT,即一个ERC-998可以包含多个ERC-721和ERC-20形式的通证,而转移CNFT即是转移CNFT所拥有的整个层级结构和所属关系。
代码语言:javascript复制}/**
* @title ERC20Basic
* @dev Simpler version of ERC20 interface
* @dev see
*/contract ERC20Basic { uint public _totalSupply; function totalSupply() public constant returns (uint); function balanceOf(address who) public constant returns (uint); function transfer(address to, uint value) public;
event Transfer(address indexed from, address indexed to, uint value);
}/**
* @title ERC20 interface
* @dev see
*/contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public constant returns (uint); function transferFrom(address from, address to, uint value) public; function approve(address spender, uint value) public;
event Approval(address indexed owner, address indexed spender, uint value);
}/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
*/contract BasicToken is Ownable, ERC20Basic {
using SafeMath for uint;
mapping(address => uint) public balances; // additional variables for use if transaction fees ever became necessary
uint public basisPointsRate = 0; uint public maximumFee = 0; /**
* @dev Fix for the ERC20 short address attack.
*/
modifier onlyPayloadSize(uint size) { require(!(msg.data.length < size 4));
_;
} /**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
*/
function transfer(address _to, uint _value) public onlyPayloadSize(2 * 32) { uint fee = (_value.mul(basisPointsRate)).div(10000); if (fee > maximumFee) {
fee = maximumFee;
} uint sendAmount = _value.sub(fee);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(sendAmount); if (fee > 0) {
balances[owner] = balances[owner].add(fee);
Transfer(msg.sender, owner, fee);
}
Transfer(msg.sender, _to, sendAmount);
} /**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint representing the amount owned by the passed address.
*/
function balanceOf(address _owner) public constant returns (uint balance) { return balances[_owner];
}
}/**
* @title Standard ERC20 token
*
* @dev Implementation of the basic standard token.
* @dev
* @dev Based oncode by FirstBlood:
*/contract StandardToken is BasicToken, ERC20 {
mapping (address => mapping (address => uint)) public allowed; uint public constant MAX_UINT = 2**256 - 1; /**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint the amount of tokens to be transferred
*/
function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) { var _allowance = allowed[_from][msg.sender]; // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
// if (_value > _allowance) throw;
uint fee = (_value.mul(basisPointsRate)).div(10000); if (fee > maximumFee) {
fee = maximumFee;
} if (_allowance < MAX_UINT) {
allowed[_from][msg.sender] = _allowance.sub(_value);
} uint sendAmount = _value.sub(fee);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(sendAmount); if (fee > 0) {
balances[owner] = balances[owner].add(fee);
Transfer(_from, owner, fee);
}
Transfer(_from, _to, sendAmount);
}