带宽
每天每个账号5000带宽 抵扣手续费
在波场,除查询之外的任何交易都需要消耗带宽,系统每天给每个激活账户赠送1500带宽,用户可以通过质押trx获得带宽
能量
可以自动恢复
在波场,智能合约的创建和调用都需要消耗能量,用户可以通过质押trx获得能量。
pkgsign
用于签名和验证 npm 和 yarn 包的 CLI 工具。
pkgsign 是一个用于向 npm 和 yarn 包添加签名以及使用已知签名验证这些包的工具。为简单起见,它允许使用 PGP 私钥或keybase.io对包进行签名。
git clone https://github.com/RedpointGames/pkgsign .
yarn # install dependencies
yarn verify # build pkgsign and verify the signature.json provided in this repository
# (should be signed by hachque at keybase.io)
yarn pack --filename=pkgsign.tgz
# make an unsigned package for local use
npm install -g ./pkgsign.tgz
# install pkgsign globally
验证包
要验证当前包目录的签名状态,以及已安装的所有包依赖项,您可以使用:
pkgsign verify . --full
如果要验证包 tarball 的签名,可以使用:
pkgsign verify mypackage-v1.0.0.tgz --package-name mypackage
签署包
您可以使用keybase.io或 PGP 密钥对对包进行签名,其中公钥可在公共 HTTPS URL 上获得。
如果您已安装密钥库并在 PATH 中,则可以使用以下命令对当前包目录进行签名:
pkgsign sign .
或者,如果您想使用 keybase 对 tarball 进行签名,您可以使用以下命令进行签名:
pkgsign sign mypackage-v1.0.0.tgz
如果你想用 PGP 密钥对签署一个包,你可以使用:
pkgsign sign --signer pgp --pgp-private-key-path ./privkey.key --pgp-private-key-passphrase mypassphrase --pgp-public-key-https-url https://example.com/mykey.asc .
要使用 PGP 密钥对签署 tarball,请传递 tarball 路径而不是包目录。
应该注意的是,公钥 HTTPS URL 被用作身份 - 如果 URL 发生变化,这与其他人签署您的包是一样的,并且 pkgsign 会认为具有不同 URL 的包已被盗用。
tronide
tronbox
tronlink
TRC-721合约标准
TRC-721是在波场公链上发行非同质化代币(non-fungible token, NFT)一套标准接口,与ERC-721完全兼容。由于 TRC-721 中的每个代币都是唯一的,因此 TRC-20 标准不足以处理 NFT。
必须实现的接口
每个符合TRC-721标准的智能合约都必须实现TRC721与TRC165接口。
Solidity
pragmasolidity^0.4.20;interfaceTRC721{eventTransfer(addressindexed_from,addressindexed_to,uint256indexed_tokenId);eventApproval(addressindexed_owner,addressindexed_approved,uint256indexed_tokenId);eventApprovalForAll(addressindexed_owner,addressindexed_operator,bool_approved);functionbalanceOf(address_owner)externalviewreturns(uint256);functionownerOf(uint256_tokenId)externalviewreturns(address);functionsafeTransferFrom(address_from,address_to,uint256_tokenId,bytesdata)externalpayable;functionsafeTransferFrom(address_from,address_to,uint256_tokenId)externalpayable;functiontransferFrom(address_from,address_to,uint256_tokenId)externalpayable;functionapprove(address_approved,uint256_tokenId)externalpayable;functionsetApprovalForAll(address_operator,bool_approved)external;functiongetApproved(uint256_tokenId)externalviewreturns(address);functionisApprovedForAll(address_owner,address_operator)externalviewreturns(bool); }interfaceTRC165{functionsupportsInterface(bytes4interfaceID)externalviewreturns(bool); }
balanceOf(address _owner)
返回指定账户拥有的 NFT 数量
ownerOf(uint256 _tokenId)
返回指定 NFT 的所有者
safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data)
转让 NFT 的所有权
safeTransferFrom(address _from, address _to, uint256 _tokenId)
转让 NFT 的所有权
transferFrom(address _from, address _to, uint256 _tokenId)
转让一个NFT的所有权(调用者必须确认_to地址是否可以正常接收NFT,否则NFT会丢失)
approve(address _approved, uint256 _tokenId)
授予其他人 NFT 的控制权
setApprovalForAll(address _operator, bool _approved)
由第三方 (_operator) 授予/恢复对所有 NFT 的控制权
getApproved(uint256 _tokenId)
查询某个 NFT 的授权
isApprovedForAll(address _owner, address _operator)
查询operator是否为业主授权地址
supportsInterface(bytes4 interfaceID)
查询是否支持某个接口(interfaceID)
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId)
Approve 成功后会触发 Approval 事件
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId)
成功的 transferFrom 和 safeTransferFrom 将触发 Transfer 事件
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved)
setApprovalForAll 成功后会触发 ApprovalForAll 事件
合约如果需要接受安全转账,必须实现TRC721TokenReceiver接口:
Solidity
interfaceTRC721TokenReceiver{//This method will be triggered when the ‘_to’ is the contract address during the ‘safeTransferFrom’ execution, and the return value must be checked, If the return value is not bytes4(keccak256("onTRC721Received(address,address,uint256,bytes)")) throws an exception. The smart contract which can receive NFT must implement the TRC721TokenReceiver interface.functiononTRC721Received(address_operator,address_from,uint256_tokenId,bytes_data)externalreturns(bytes4); }
onTRC721Received(address _operator, address _from, uint256 _tokenId, bytes _data)
与safeTransferFrom方法配合使用,当_to为合约地址时,需要调用该方法并检查返回值。 如果返回值不是 bytes4(keccak256("onTRC721Received(address,address,uint256,bytes)")) 将抛出异常。 可以接收 NFT 的智能合约必须实现 TRC721TokenReceiver 接口。
📘
注意
bytes4(keccak256("onTRC721Received(address,address,uint256,bytes))) 的哈希值与以太坊版本 bytes4(keccak256("onERC721Received(address,address,uint256,bytes))) 不同。 对于函数onTRC721Received的返回值,请使用0x5175f878而不是0x150b7a02。
metadata extension接口(可选)
metadata extension接口对于TRC-721智能合约来说是可选的,用户可以查询智能合约的名称以及NFT代表的资产的详细信息。
Solidity
interfaceTRC721Metadata{functionname()externalviewreturns(string_name);functionsymbol()externalviewreturns(string_symbol);functiontokenURI(uint256_tokenId)externalviewreturns(string); }
name()
返回合约名称
symbol()
返回合约代码
tokenURI(uint256 _tokenId)
返回 _tokenId 对应的外部文件的 URI。 外部资源文件需要包括名称、描述和图片。
enumeration extension接口(可选)
enumeration extension对于TRC-721智能合约是可选的,允许用户的智能合约发布其NFT的完整列表并使其可见。
Solidity
interfaceTRC721Enumerable{functiontotalSupply()externalviewreturns(uint256);functiontokenByIndex(uint256_index)externalviewreturns(uint256);functiontokenOfOwnerByIndex(address_owner,uint256_index)externalviewreturns(uint256); }
totalSupply()
返回 NFT 的总量
tokenByIndex(uint256 _index)
通过_index返回对应的tokenId
tokenOfOwnerByIndex(address _owner, uint256 _index)
返回所有者拥有的 NFT 列表中索引对应的 tokenId