简介
在本文中,我将为数字资产实现一个简单有效的标记化智能合约。如果你觉得代码有用,请随意重用。
本文的第二个目的是说明为什么一些用于区块链开发的用例是有用的,而另一些用例则更值得怀疑。通常关键在于权力下放是否合理。
区块链允许我们构建不同于传统解决方案的软件。使用区块链,您可以构建可信任的分布式应用程序,以存储未被篡改的数据。分布式是一个必要的要求,你可以开发许多不同的区块链解决方案,但要想让任何一个区块链解决方案达到盈利规模,你必须接受你不会控制它。这是个棘手的问题。
分布式工作的用例的一个例子是比特币。它作为一个可信的区块链应用程序的实现使得比特币在没有任何集中控制或策略的情况下得以有机增长。比特币成为某种货币或资产,并使一些人非常富有,因为有足够多的人认为它有价值。
现在,在以太坊(ethereum)或超账本(hyperledger)等平台上轻松构建区块链应用程序成为可能,试图利用区块链机会的想法数量激增。
区块链应用的一种常见模式是某些市场的实施。世界上许多市场的效率都非常低,市场制造商在诉讼程序中占很大比例。区块链本质上需要移除中间商,将中介成本返还给用户。
使用区块链,您可以构建可信任的分布式应用程序,以存储未被篡改的数据。
在讨论标记化方案时,我喜欢对物理资产和数字资产进行非常明确的区分。当标记化物理资产时,与物理世界有复杂的关系。像谁实际持有资产这样的问题很重要。考虑到您可以对资产执行的主要操作之一是转移它,您需要将令牌转移与资产转移同步,这不是一项容易的任务。
标记化数字资产要简单得多。您可以使用您的数字资产的令牌表示,并很容易地将令牌与资产相锚对。我们可以轻松地自动化整个业务流程。让我们看一个例子。
商业案例
在我们的业务案例中,我们将在区块链平台中管理软件许可证。这些许可证将使用按使用付费模式。就这样,简单。
按次使用付费是一个有效的货币化过程,但在管理许可证时相当麻烦。离线许可证通常很容易破解,要拥有在线许可证,您需要维护服务器。至少会有点头痛。
使用区块链,我们可以实施有效的许可证系统。我们将要包括的其他功能是收集付款以充值许可证的工具,以及用户如果愿意交易许可证的机会。除此之外,维护许可证系统将由用户以非常低的费率支付。
案例实施
ERC721合同生成唯一可识别的令牌,这些令牌不能合并或分解为分数。这些是用于标记化资产的非常有用的功能,这通常使ERC721合同成为此类方案的理想起点。
著名的erc721令牌示例是cryptokitties。这些都是数字宠物,本身是相同的,除了一些审美特征编码在他们的标识符。你可以很容易地看到任何两个密码猫是不同的,你不能分割或合并密码猫。
我们的许可证管理合同将使用ERC721标准。我建议你看一下代码,即使你是一个商人。即使您不知道如何编写代码,也应该通过阅读方法名和注释了解可以做什么。
我们的许可证管理合同将使用ERC721标准。我建议你看一下代码,即使你是一个商人。即使您不知道如何编写代码,也应该通过阅读方法名和注释了解可以做什么。
许可证将在一段时间后到期,必须加满才能保持有效。为此,我们将在许可证和到期日期之间创建一个额外的映射。我们将有一种方法可以接受ether并将许可证的到期日期推到将来。
在那之后,我们只需要一个更简单的方法来检查到期日期。完整合同如下:
pragma solidity ^0.5.0;
import “openzeppelin-solidity/contracts/token/ERC721/ERC721.sol”;
import “openzeppelin-solidity/contracts/ownership/Ownable.sol”;
import “openzeppelin-solidity/contracts/math/Math.sol”;
/**
* @title License Token
* @author Alberto Cuesta Canada
* @notice Implements an ERC721 license token with validity by top up.
*/
contract LicenseToken is ERC721, Ownable {
event TopUp(uint256 licenseId, uint256 expire);
/**
* @notice mapping from token id to expire date (in unix time)
*/
mapping(uint256 => uint256) internal expire;
/**
* @notice Delay the expiration of a license by a second per wei.
* @param _licenseId The license id.
*/
function topUp(uint256 _licenseId)
external
payable
{
uint256 timeToAdd = msg.value;
expire[_licenseId] =
Math.max(now, expire[_licenseId]) + timeToAdd;
emit TopUp(_licenseId, expire[_licenseId]);
}
/**
* @notice Mint new licenses, only owner.
* @param _to The address to receive the license.
* @param _licenseId The unique license id.
*/
function mint(address _to, uint256 _licenseId)
public
onlyOwner()
{
_mint(_to, _licenseId);
}
/**
* @notice Retrieve an expire date for a license
* @param _licenseId The license id.
*/
function getExpire(uint256 _licenseId)
public
view
returns(uint256)
{
return expire[_licenseId];
}
}
结论
区块链中资产的标记化是一种流行的概念,但并非所有用例都适用于它。 数字资产的标记化是一种完美的契合,可以生成简单而有效的实现。 自动化经常被视为区块链的优势之一,但自动化对于数字资产来说是很自然的。
ERC721合同为我们提供了非常有用的功能,可以在各种方案中使用,条件是资产必须是真正唯一、不可分割和易于交易的。