艺术品区块链溯源防伪平台(连载二)数字资产的投资与数字资产的份额化

简介: 传统艺术品投资门槛非常高,一是用户不知道从哪些渠道可以投资,二是艺术品价值过高,三是艺术品简单难。这导致了投资艺术品门槛过高。 Token 能实现份额化,实现人人参与,人人持有,P2P交易。 例如某机构上链一件艺术品,用户可以投资该艺术品的一定份额,可以转让他持有的权益。


《Netkiller Blockchain 手札》

作者正在找工作,联系方式 13113668890
Mr. Neo Chan, 陈景峯(BG7NYT)
中国广东省深圳市望海路半岛城邦三期 518067 +86 13113668890 <netkiller@msn.com>
版权 © 2018 Netkiller(Neo Chan). All rights reserved.
版权声明
转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明


2.10.5. 资产投资与份额持有

传统艺术品投资门槛非常高,一是用户不知道从哪些渠道可以投资,二是艺术品价值过高,三是艺术品简单难。这导致了投资艺术品门槛过高。 Token 能实现份额化,实现人人参与,人人持有,P2P交易。

例如某机构上链一件艺术品,用户可以投资该艺术品的一定份额,可以转让他持有的权益。且交易去中心化,不受任何机构,管理者的制约。

下面的合约可以展示如何分割艺术品份额,最终达到链上资产的份额分割和持有与交易。

		
pragma solidity ^0.4.25;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, reverts on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b > 0); // Solidity only automatically asserts when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a);
    uint256 c = a - b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}        

contract Ownable {
    
    address public owner;
    
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    constructor() public {
        owner = msg.sender;
    }
    
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }
    
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0));
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

}

contract NetkillerAssetsToken is Ownable {
    using SafeMath for uint256;
    
    string public name;
    string public symbol;
    uint public decimals;
    uint256 public totalSupply;
    
    mapping(address => mapping(string => uint256)) internal balances;
    mapping(string => address) internal tokens;
    
    event Transfer(address indexed _from, address indexed _to, string indexed _tokenId);
    event Burn(address indexed from, string _tokenId);
    
    constructor(
        string tokenName,
        string tokenSymbol,
        uint decimalUnits
    ) public {
        owner = msg.sender;
        name = tokenName;
        symbol = tokenSymbol; 
        decimals = decimalUnits;
        totalSupply = 0; 
    }
    
    function add(address _owner, string _tokenId) onlyOwner returns(bool status){
        balances[_owner][_tokenId] = 100 * 10 ** uint256(decimals);
        tokens[_tokenId] = _owner;
        totalSupply = totalSupply.add(1);
        return true;
    }
    
    function balanceOf(address _owner, string _tokenId) constant returns(uint balance){ 
        return balances[_owner][_tokenId];
    }

    function ownerOf(string _tokenId) constant returns (address owner) {
        return tokens[_tokenId];
    }
    
    function transfer(address _to, string _tokenId){
        
        address _from = msg.sender;
        uint256 amount = balances[_from][_tokenId];
        transfer(_to, amount, _tokenId);
    }
    function transfer(address _to, uint256 _value, string _tokenId){
        require(msg.sender == ownerOf(_tokenId));
        require(msg.sender != _to);
        require(_to != address(0));
        
        address _from = msg.sender;
        uint256 amount = balances[_from][_tokenId];
        require(amount >= _value);
        
        balances[_from][_tokenId] = balances[_from][_tokenId].sub(_value);
        balances[_to][_tokenId] = balances[_to][_tokenId].add(_value);
        tokens[_tokenId] = _to;

        emit Transfer(_from, _to, _tokenId);
    }
    
    function burn(address _owner, string _tokenId) onlyOwner public returns (bool success) {
        require(balances[_owner][_tokenId] > 0 && balances[_owner][_tokenId] == 100 * 10 ** uint256(decimals));

        balances[_owner][_tokenId] = 0;
        tokens[_tokenId] = address(0);

        totalSupply = totalSupply.sub(1);
        emit Burn(msg.sender, _tokenId);
        return true;
    }
    
}		
		
		

由于 ERC721 不太符合我的需求,所以我结合 ERC20 和 ERC721 写出了我的合约。合约尽量保持了ERC20的使用习惯,函数定义尽量兼容 ERC20。

我们来看下面的构造方法,每个种类的物品一个合约,例如字画,陶瓷,青铜器。

		
    constructor(
        string tokenName,
        string tokenSymbol,
        uint decimalUnits
    ) public {
        owner = msg.sender;
        name = tokenName;
        symbol = tokenSymbol; 
        decimals = decimalUnits;
        totalSupply = 0; 
    }
		
		

通过下面函数,添加资产到 Token,使链上资产与Token绑定。

		
    function add(address _owner, string _tokenId) onlyOwner returns(bool status){
        balances[_owner][_tokenId] = 100 * 10 ** uint256(decimals);
        tokens[_tokenId] = _owner;
        totalSupply = totalSupply.add(1);
        return true;
    }		
		
		

balances[_owner][_tokenId] = 100 * 10 ** uint256(decimals); 初始化份额是 100 表示 100%

totalSupply = totalSupply.add(1); 物品件数加一。可以用于统计链上资产的数量。

下面函数是查询资产的持有人

		
function ownerOf(string _tokenId) constant returns (address owner) {
        return tokens[_tokenId];
    }		
		
		

下面函数是,权益转让和权益份额转让。

		
    function transfer(address _to, string _tokenId){
        
        address _from = msg.sender;
        uint256 amount = balances[_from][_tokenId];
        transfer(_to, amount, _tokenId);
    }
    function transfer(address _to, uint256 _value, string _tokenId){
        require(msg.sender == ownerOf(_tokenId));
        require(msg.sender != _to);
        require(_to != address(0));
        
        address _from = msg.sender;
        uint256 amount = balances[_from][_tokenId];
        require(amount >= _value);
        
        balances[_from][_tokenId] = balances[_from][_tokenId].sub(_value);
        balances[_to][_tokenId] = balances[_to][_tokenId].add(_value);
        tokens[_tokenId] = _to;

        emit Transfer(_from, _to, _tokenId);
    }		
		
		

接下来,我们就是可以开发 Dapp 钱包了,在钱包中实现资产的转移交易。

这个合约可以一直到 EOS 上,Hyperledger Fabric 不可以,因为 Fabric 没有锁的机制,会导致计算出错。




目录
相关文章
|
8月前
|
存储 安全 区块链
区块链游戏系统开发(开发详细)/案例开发/设计功能/逻辑方案/源码平台
  区块链游戏系统开发是一个复杂而精密的过程。首先,需要进行需求分析和规划,确定游戏系统的功能和特性。然后,进行技术选型和架构设计,选择适合的区块链平台和开发工具。接下来,进行系统的搭建和编码,实现游戏逻辑和用户交互功能。最后,进行测试和优化,确保系统的稳定性和性能。
|
8月前
|
存储 前端开发 JavaScript
区块链交易所系统开发(海外版)丨交易所系统开发详细规则/方案介绍/项目逻辑/源码平台
  区块链是一种基于分布式账本技术的去中心化数据库系统。它通过一系列的区块(blocks)来记录和存储交易和数据,形成一个连续的、不可篡改的链式结构。
|
9月前
|
开发框架 安全 前端开发
区块链财务管理平台如何开发?区块链财务管理平台开发源码规则解析
开发一个区块链财务管理平台需要多个方面的技术和知识,以下是一些可能的步骤和考虑因素:
|
11月前
|
NoSQL 区块链 Redis
区块链聚合交易所平台开发源码实例分析
区块链聚合交易所平台开发源码实例分析
|
11月前
|
存储 供应链 安全
区块链供应链溯源系统开发优点介绍 | 区块链供应链溯源系统开发(源码示例)
在区块链供应链溯源系统中,每个食品包括从生产到销售的全过程都被记录在区块链上,包括生产者、加工者、运输者、销售者等。这些信息都被数字化并存储在区块链中,使得每个环节的信息都是公开可查的。这样一来,消费者可以通过区块链查询到食品的全程信息,包括生产者的信息、原料来源、生产加工过程、运输过程、销售流通等各个环节的信息。
|
安全 算法 区块链
区块链金融交易借贷平台开发技术实现去中心化
传统的金融交易清算周期长和成本高昂,引入区块链技术,能够加快传统金融交易中心化的交易缓慢和低效的后端运作,并且重塑交易和结算流程。一个共享的数字公开账本能够持续被维护,确认所有参与链上的交易,防止欺诈,对全球金融交易、清算和结算带来了一个重大的改观机会。
|
存储 测试技术 区块链
区块链交易所搭建开发_平台_测试_系统智能合约ATOM代示例
Cosmos(ATOM)没有传统意义上的原生智能合约,因为它没有自己的图灵完备编程语言。 相反,Cosmos 使用区块链间通信 (IBC) 协议来允许不同区块链之间的通信和价值转移。 这允许开发人员构建跨越多个区块链的去中心化应用程序。
|
2天前
|
存储 供应链 物联网
未来技术纵横谈:区块链、物联网与虚拟现实的融合革新
【4月更文挑战第21天】 随着科技不断进步,新兴技术正在重塑我们的世界。本文将深入探讨三种引人注目的技术——区块链、物联网(IoT)和虚拟现实(VR)——它们各自的发展趋势及其在不同领域的应用前景。区块链技术以其不可篡改的数据记录特性,在金融安全、供应链管理等领域展现出巨大潜力;物联网通过智能设备互联,推动智能家居、智慧城市的发展;而虚拟现实则以其沉浸式体验,改变教育、娱乐等多个行业的面貌。这些技术的交叉融合预示着一个更加智能、互联和虚拟的未来。
16 5
|
23天前
|
存储 传感器 监控
未来智能城市中的区块链技术应用
随着城市化进程不断加速,智能城市成为了未来城市发展的主要趋势之一。区块链技术作为一种去中心化、安全可靠的数据传输和存储方式,将在智能城市建设中发挥关键作用。本文将探讨区块链技术在智能城市中的应用场景,并分析其对城市管理、信息共享和安全保障等方面的积极影响。
14 2
|
14小时前
|
监控 物联网 区块链
未来技术纵横谈:区块链、物联网与虚拟现实的融合与创新
【4月更文挑战第23天】随着科技的不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)等正在重塑我们的世界。本文将深入探讨这些技术的最新发展趋势及其在不同领域的应用案例,揭示它们如何相互交织,共同推动着数字化转型的浪潮。

热门文章

最新文章