返回介绍

PRC-20

发布于 2023-07-01 15:28:54 字数 6899 浏览 0 评论 0 收藏 0

PRC-20合约

PRC-20是在PlatON上通过智能合约实现代币API的一套标准,它提供的功能包括代币转账、查询代币余额以及网络上可用的代币总供应量等接口,与ERC-20完全兼容。

协议标准

PRC-20协议是对可兑换同质代币(Fungible Tokens)定义的标准,同质代币每个Token与另外Token具有完全相同的类型和价值,该合约标准中规定了合约定义的函数、事件等,所有遵守这一标准编写的合约都被认为是一个PRC-20合约。


contract PRC20 {


    //required
    function totalSupply() constant returns (uint theTotalSupply);
    function balanceOf(address _owner) constant returns (uint balance);
    function transfer(address _to, uint _value) returns (bool success);
    function transferFrom(address _from, address _to, uint _value) returns (bool success);
    function approve(address _spender, uint _value) returns (bool success);
    function allowance(address _owner, address _spender) constant returns (uint remaining);
    
    //optional
    function name() public view returns (string);
    function symbol() public view returns (string);
    function decimals() public view returns (uint8);
    
    //events
    event Transfer(address indexed _from, address indexed _to, uint _value);
    event Approval(address indexed _owner, address indexed _spender, uint _value);
}

必须实现的接口

  • totalSupply

该方法返回令牌总的发行量。

  • balanceOf

该方法返回查询账户的令牌余额。

  • transfer

该方法用来从智能合约地址里转账令牌到指定账户。

  • approve

该方法用来授权第三方(例如Dapp)从令牌拥有者账户转账令牌。

  • transferFrom

该方法可供第三方从令牌拥有者账户转账令牌。需要配合approve()方法使用。

  • allowance

该方法用来查询可供第三方转账的查询账户的令牌余额。

可选实现的接口

  • name

返回令牌名称

  • symbol

返回令牌符号

  • decimals

返回令牌精度

事件

  • Transfer

当通证被成功转账后,会触发Transfer转账事件,在链上记录转账信息日志。

  • Approval

当approve()方法被成功调用后,会触发Approval事件,在链上记录授权信息日志。

示例

PRC-20标准与ERC-20完全兼容,示例可参考这里

查看

可以通过PlatON浏览器查看,也可以通过ATON查看PRC-20合约交易。

合约发行

请参考Solidity合约入门手册

调用方法

以python为例:

安装依赖

使用下列命令,安装PlatON python library,建议 Python 版本3.7.5+:


pip install client-sdk-python

在安装过程中,部分依赖包会需要c++14 编译,请在看到相关提示后,下载cppbuildtools,使用默认值安装后,重新执行pip安装命令即可。

实例化合约

以下为python代码示例:


from client_sdk_python import Web3, HTTPProvider


rpc, chain_id, hrp = 'http://127.0.0.1:6789', 210425, 'lat'
w3 = Web3(HTTPProvider(rpc), chain_id=chain_id, hrp_type=hrp)
abi = [
  {
    "inputs":[
      {"internalType":"uint256", "name":"initialSupply", "type":"uint256"},
      {"internalType":"string", "name":"tokenName", "type":"string"},
      {"internalType":"string", "name":"tokenSymbol", "type":"string"}
    ],
    "stateMutability":"nonpayable",
    "type":"constructor"
  },
  {
    "inputs":[],
    "name":"totalSupply",
    "outputs":[{"internalType":"uint256", "name":"", "type":"uint256"}],
    "stateMutability":"view",
    "type":"function"
  },
  {
    "inputs":[{"internalType":"address", "name":"", "type":"address"}],
    "name":"balanceOf",
    "outputs":[{"internalType":"uint256", "name":"", "type":"uint256"}],
    "stateMutability":"view",
    "type":"function"
  },
  {
    "inputs":[
      {"internalType":"address", "name":"_to", "type":"address"},
      {"internalType":"uint256", "name":"_value", "type":"uint256"}
    ],
    "name":"transfer",
    "outputs":[{"internalType":"bool", "name":"success", "type":"bool"}],
    "stateMutability":"nonpayable",
    "type":"function"
  },
  {
    "anonymous":false,
    "inputs":[
      {"indexed":true, "internalType":"address", "name":"from", "type":"address"},
      {"indexed":true, "internalType":"address", "name":"to", "type":"address"},
      {"indexed":false, "internalType":"uint256", "name":"value", "type":"uint256"}
    ],
    "name":"Transfer",
    "type":"event"
  }
]                               # 合约abi内容
prc20 = w3.eth.contract(address='contract address', abi=abi)
# 查看合约所有的function 和 event
print([func for func in prc20.functions])
print([event for event in prc20.events])

查询合约信息

以totalSupply、balanceOf示例,其他查询方法与此类似:


# 查询令牌的总发行量
prc20.functions.totalSupply().call()
# 查询账户的令牌余额
prc20.functions.balanceOf('your address').call()

发送合约交易

以transfer示例,其他交易方法与此类似:


# 转账令牌到指定账户
tx = {
    'chainId': w3.chain_id,
    'nonce': w3.eth.getTransactionCount('your address'),
    'gas': 4012388,
    'value': 0,
    'gasPrice': 1000000000,
}
txn = prc20.functions.transfer(to='to address', value=1 * 10 ** 18).buildTransaction(tx)
signed_txn = w3.eth.account.signTransaction(txn, private_key='your private key')
tx_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction).hex()
receipt = w3.eth.waitForTransactionReceipt(tx_hash)

获取合约事件

以transfer交易事件示例,其他事件获取方法与此类似:


events = prc20.events.Transfer().processReceipt(receipt)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文