Zhuang's Diary

言之有物,持之以恒

​ ERC721是比ERC20更复杂的标准,具有多个可选扩展名,并且分为多个合约。 OpenZeppelin合约提供了灵活的组合方式以及自定义有用的扩展。本文讲解以OpenZeppelin合约为目标对象。

构建ERC721代币合同

​ 我们将使用ERC721来跟踪游戏中的装备条目,每个条目都有各自独特的属性。 每当要奖励给玩家时,便会铸造(mint)并发送给他们。 玩家可以自由保留自己的代币,也可以与自己认为合适的其他人进行交易,就像区块链上的任何其他资产一样! 请注意,任何帐户都可以将awardItem称为铸造(mint)。 为了限制可以创建项目的帐户,我们可以添加访问控制

​ 合约如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// contracts/GameItem.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract GameItem is ERC721 {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;

constructor() public ERC721("GameItem", "ITM") {}

function awardItem(address player, string memory tokenURI)
public
returns (uint256)
{
_tokenIds.increment();

uint256 newItemId = _tokenIds.current();
_mint(player, newItemId);
_setTokenURI(newItemId, tokenURI);

return newItemId;
}
}

​ ERC721合约包括了标准扩展(IERC721MetadataIERC721Enumerable)。 这就是_setTokenURI方法的来源:我们使用它来存储项目的元数据。

​ 另请注意:与ERC20不同,ERC721缺少小数,因为每个令牌都是不同的,并且无法分区。

​ 新项目示例:

1
2
3
4
> gameItem.awardItem(playerAddress, "https://game.example/item-id-8u5h2m.json")
Transaction successful. Transaction hash: 0x...
Events emitted:
- Transfer(0x0000000000000000000000000000000000000000, playerAddress, 7)

​ 查询每个项目的所有者和元数据:

1
2
3
4
> gameItem.ownerOf(7)
playerAddress
> gameItem.tokenURI(7)
"https://game.example/item-id-8u5h2m.json"

​ 此tokenURI应该解析为一个类似于以下内容的JSON文档:

1
2
3
4
5
6
{
"name": "Thor's hammer",
"description": "Mjölnir, the legendary hammer of the Norse god of thunder.",
"image": "https://game.example/item-id-8u5h2m.png",
"strength": 20
}

​ 有关tokenURI元数据JSON架构的更多信息,请参考==>https://eips.ethereum.org/EIPS/eip-721

ERC721 合约的前置功能

​ ERC721可用的预设有ERC721PresetMinterPauserAutoId。它已预设为允许Token铸造(创建),停止所有令牌传输(暂停),并允许持有人焚毁(销毁)其Token。合同使用访问控制来控制对铸造和暂停功能的访问。部署合同的帐户将被授予minter 和pauser 角色,以及默认的admin角色。

​ 无需编写任何Solidity代码即可立即部署此合同。它可以原样用于快速原型制作和测试,但也适用于生产环境。

关联内容 ==> https://willzhuang.github.io/2019/07/04/ERC20-721Token的发行-冻结-多方签名功能

客户端

  1. Rust : https://github.com/openethereum/openethereum
  2. Go : https://github.com/ethereum/go-ethereumhttps://github.com/etclabscore/core-geth
  3. .Net : https://github.com/Nethereum/Nethereum
  4. C++ : https://github.com/ethereum/aleth
  5. ConsenSys & jp morganchase : https://github.com/ConsenSys/quorum
  6. burrow : https://github.com/hyperledger/burrow
  7. ethermint : https://github.com/ChainSafe/ethermint
  8. besu (Java) :https://github.com/hyperledger/besu
  9. Ionhttps://github.com/clearmatics/autonity

虚拟机

  1. JS : https://github.com/ethereumjs/ethereumjs-vm
  2. SSVM : https://github.com/second-state/SSVM
  3. WAVM : https://github.com/WAVM/WAVM
  4. evmone : https://github.com/ethereum/evmone
  5. Hera : https://github.com/ewasm/hera

大数据

  1. ethereum-etl : https://github.com/blockchain-etl/ethereum-etl
  2. GraphQL : https://github.com/ConsenSys/ethql
  3. Graph Node : https://github.com/graphprotocol/graph-node

安全

  1. mythril : https://github.com/ConsenSys/mythril
  2. truffle-security : https://github.com/ConsenSys/truffle-security
  3. sm : https://github.com/tjfoc/gmsm

隐私

  1. ZoKrates : https://github.com/Zokrates/ZoKrates
  2. AZTEC : https://github.com/AztecProtocol/AZTEC
  3. privacy-enabled-erc721 : https://github.com/centrifuge/privacy-enabled-erc721
  4. nightlite(JS) : https://github.com/EYBlockchain/nightlite

浏览器

  1. blockscout : https://github.com/poanetwork/blockscout
  2. MyEtherWallet : https://github.com/EthVM/EthVM
  3. dashboard : https://github.com/Alethio/ethstats-network-dashboardhttps://ethstats.io/
  4. lite : https://github.com/Alethio/ethereum-lite-explorerhttps://explorer.aleth.io/
  5. ERC721 token list : https://github.com/Alethio/explorer-plugin-opensea
  6. data scrap : https://github.com/Alethio/memento
  7. hyperledger : https://github.com/hyperledger/blockchain-explorer

客户端

  1. MyEtherWallet : https://github.com/MyEtherWallet/MyEtherWallet
  2. wallet-core (C++) : https://github.com/trustwallet/wallet-core
  3. MultiSigWallet : https://github.com/ConsenSys/MultiSigWallet
  4. ethsigner : https://github.com/PegaSysEng/ethsigner/

DApp Framework

  1. embark : https://github.com/embarklabs/embark
  2. openzeppelin-contracts : https://github.com/OpenZeppelin/openzeppelin-contracts
  3. TRUFFLE : https://github.com/trufflesuite
  4. ethereumjs-util : https://github.com/ethereumjs/ethereumjs-util
  5. aragonOS : https://github.com/aragon/aragonOS
  6. eth-crypto : https://github.com/pubkey/eth-crypto
  7. voting_dapp : https://github.com/maheshmurthy/ethereum_voting_dapp

事件

  1. eventeum : https://github.com/ConsenSys/eventeum

SDK

  1. web3.js : https://github.com/ethereum/web3.js
  2. java : https://github.com/web3j/web3j
  3. react : https://github.com/NoahZinsmeister/web3-react
  4. go : https://github.com/Alethio/web3-go, https://github.com/umbracle/go-web3

连接

  1. 雷电网络 : https://github.com/raiden-network/raiden
  2. 离线支付 : https://github.com/perun-network/go-perun
  3. Hyperledger (Ethereum & Quorum & fabric) : https://github.com/hyperledger/cactus

Token

  1. E-Money : https://github.com/IoBuilders/em-token
  2. 可仲裁Token : https://github.com/kleros/erc-792

Ethereum 2.0

  1. lighthouse : https://github.com/sigp/lighthouse
  2. explorer : https://github.com/Alethio/eth2stats-client

《数字货币与数字金融》读书心得III。

区块链的优势

一是不可篡改,更加安全。传统技术通过宣布财产所有权,并以法律做背书,比如房产。区块链技术通过分享记录交易的数据库,辅以密码学和共识算法,实现了数据库历史记录的不可篡改。实践证明,这样一个数据库可以确保市值达到百亿美元的比特币在全球黑客的攻击下,运转稳定。

二是异构多活,可用性强。从区块链的系统机构看,每个系统参与方都是一个异地多活节点,远远超过两地三中心这样的冗余度,是天生的多活系统。如果某个节点遇到网络问题、硬件故障、软件错误或者黑客控制,均不会影响系统以及其他参与节点。问题节点在排除故障后并完成数据同步后,便可以随时再加入到系统中继续工作。此外区块链中的节点通过点对点的通信协议进行交互,在保证通信协议一致的情况下不同节点可由不同开发语言、基于不同的架构、实现不同版本的全节点来处理交易。由此构成的软件异构环境确保了即便某个版本的软件出现问题,区块链的整体网络不会受到影响,这也是其高可用的基石所在。

三是新型协作机制,效率更高。对于公司之间的大规模多变协作,在区块链应用之前,通常只有两种解决方法。其一,在多个主题之间向上寻找共同的“上级”机构,实现对整个组织进行协调。它局限于某些场景很难找到一个所有市场参与方共同认可的信任中心,并且对于中心而言,由于优先级的存在,不一定能够及时、有效地满足所有协作需求。其二,参与方让渡部分权利,共同组建第三方机构完成协作。它局限于若制度不能满足第三方机构的盈利和管理需要,其往往能够成为各参与方的实际权利中心。区块链提供了另一种方法:以对等的方式把参与方连接起来,实现更有弹性的协作方式。因为参与方职责明确,不用向第三方机构让渡权力,无须维护第三方信任机构的成本,有利于各方更好地开展协作。作为信任机器,区块链有望成为低成本、高效率的一种全新的协作模式,形成更大范围、更低成本的新协同机制。

四是智能合约更加先进。智能合约具有透明可信、自动执行、强制履约的优点。首先,对于用户来讲,只要能够接入到区块链中,用户就可以看到编译后的智能合约,可以对代码进行检查和审计。其次,可信还来源于智能合约的运行环境,一个程序的运行结果除了与程序代码有关,还和技工给程序处理的数据有关。因此,智能合约一旦被部署到区块链上,程序的代码和数据就是公开透明的,无法被篡改,并且一定会按照预先定义的逻辑去执行,产生预期中的结果。如果基于代码的智能合约能够被法律体系所认可,那么依托程序的自动化优势,通过组合串联不同的智能合约,达到不同的目的,能够是我们加速走向更为高效的商业社会。

区块链的问题

一是性能问题有待突破。区块链的性能问题主要体现为吞吐量和存储带宽的矛盾。

二是隐私保护有待加强。身份隐私与交易信息隐私。

三是区块链升级修复机制有待探索。在具体实践中,公有链社区摸索出“硬分叉”与“软分叉”等升级机制,但遗留问题还有待观察。对于常规代码升级,通过分离代码与数据,结合多层智能合约结构,实现可控的智能合约更替。

四是跨链技术成为难题。目前三种跨链技术:公证人机制、中继链、哈希锁定技术。

理解区块链

1.从系统架构看,与目前的互联网相比较,区块链使得C端客户的自主掌控能力及其在系统中的话语权得到极大的增强,信息网络由中心化架构进入以C端为主的平权时代。

2.从会计学角度看,区块链是一种全新的分布式账本技术,采用了全新的记账方法:每个人都可以参加,只要按照要求,达到选举规则的设定目标,就可以获得记账权,成为新区块的记账人,所有参与者共有、共享账本信息,都能检测、验证账本信息。与传统账本技术相比较,DLT账本技术的优势在于:不易伪造,难以篡改,效率高,且可追溯,容易审计;通过交易签名、共识算法和跨链技术保障分布式账本的一致性,自动实时完成账证相符、账账相符、账实相符;从技术可行性看,瞬时的资产负债表编制或将成为可能。

3.从账户角度看,区块链私钥本地生成,非常隐秘,从中导出公钥,再变换出钱包地址,自己给自己开户,不需要中介,这在金融史上市一个非常重大的变化:一是用户可通过数字身份运用安全技术对金融资产进行自主控制;二是用户之间点对点进行金融资产交易,可以独立于任何第三方服务机构;三是用户对数字身份的保管,直接承担交易责任,自金融模式由此应运而生。

4.从资产交易角度看,它是一种全新的价值交换技术,既可采用UTXO模式,完成“为花费交易输出”的转移,也可以采用传统的Account模式。UTXO模式和Account模式可相互转化,通过聚合归纳(Reduce),UTXO可转化为账户余额,而对账户余额进行拆分则可得到UTXO的结果。基于这一价值交换技术,我们可以创造一种全新的金融市场模式:去中心化资产交易。

5.从组织行为学角度看,区块链是一种新型的去组织化的分布式协同生产活动,它通过激励相容的算法规则和契约安排,明确了各方的经济利益,充分调动了各方的积极性,使有效的分布式协同生产成为可能,出现了新型的组织形态—自治去中心化组织(DAO):没有董事会,没有公司章程,没有森严的上下级制度,没有中心化的管理者……去中心化、去权威、点对点平权等,完全颠覆了人们通常脑海里的企业形象。这是经济活动组织形式的变革。

6.从经济学角度看,它开创了一种新型的算法经济模式。以去中心化、开放为特征,强调和尊重市场交易的自愿原则,发挥市场价格的统筹协调机制,在经济自由度上,兼具计划和市场两种机制的优点,是一种更加接近自由市场的经济模型。

《数字货币与数字金融》读书心得II。

我国法定数字货币展望

在传统分布式数据库技术基础上,引入最新的分布式账本技术,形成央行数字货币的“双账本”功能结构:

一是交易账本:采用传统的(分布式)数据库技术,利用现有金融核心系统成熟经验,满足当前交易性能要求。

二是结果账本:用于记录最终交易结果,可采用最新的分布式账本技术,中央银行和各运营机构共同参与,各节点维护相同的账本数据,通过共识机制,保证各节点账本数据的全局一致性,并且难以篡改。通过异步方式提交结果账本,从而不影响交易账本的处理时效。结果账本数据一经写入,便具有高可靠、高安全、高可信等特点,并可为社会提供基于可信数据的确权服务,从而充分发挥分布式账本技术的优势。

2016年,中国央行的数字货币原型系统就采用了“双账本”技术路线,随着分布式账本技术的不断优化,性能不断提升,交易账本向结果账本异步写入交易结果,其延时会逐渐缩短。有理由相信:同步写入之日,就是分布式账本取代传统分布式数据库之时。

数字资产各种属性深度融合,益于创新

数字资产:股票是股东权益的证券化,债券是债券的证券化,电子黄金是黄金的证券化,抵押贷款证券(MBS)是银行信贷的证券化,证券的意义在于为资产创造了流动性,但有了资产数字化,传统证券的含义可能就会有新的变化。

真正意义的数字资产应该是原生的、包含全信息的、以数字形式展现和流转的资产。数字化后的订货合同、物流单据、发票、保理合同等资产,才是真正的数字资产。数字资产模糊了证券属性。

资产数字化的关键是如何为实体经济赋能

程序 = 算法 + 结构,获得图灵奖的Pascal之父——Nicklaus Wirth提出的著名公式

金融科技 = 算法 + 数据。

数字资产产生、流通、确权都依靠全新的价值交换技术,可采用基于真随机数的加密技术,也可以采用基于区块链技术、DAG技术或者公证人机制的分布式账本技术,在未来甚至可采用量子叠加态和量子计算实现的量子技术。

可以说区块链承载了太多的理想,获得了资本和产业的热捧。溢美之词,掩盖了该技术在比特币、以太坊之外少有重大应用的尴尬。技术人员应该沉静下来,认真分析并探索改进区块链系统交互,如何解决区块链上的数据隐私问题,如何将智能合约与现行法规相结合,如何设计适合区块链的治理机制和标准,等等。

我国是互联网大国,也是数据大国。但是就数据质量来说,却不是这样。怎样在数量优势上提升质量,把数据资源转化为价值资产,从而产生信用并为实体经济服务,最终促进社会经济发展,无疑是我国金融科技领域的难题和挑战。而这恰恰是资产数字化的关键所在。

区块链作为一项可信技术,由多方认可,多方背书,是新一代金融基础设施的技术雏形,可以为现有金融机构未能触及的底层实体“加持”信用,增进相互协作,降低交易成本,有可能创造一个全新局面。

资产自金融,普惠共享

自金融的典型特征:1)用户自主掌控数字身份;2)用户自主掌控数字资产;3)用户之间点对点交易,可以独立于第三方中介机构。

如何才能让中小企业获得平等的信息话语权和自主融资的能力?一个行之有效的解决方案是利用DLT与分布式文件系统技术,将底层资产的全量原生信息同步上链,利用公私钥技术实现权利人持有并转移资产,通过核心企业的信息服务商接入,持续有效地披露底层真实贸易背景,从而形成数字资产。数字资产赋予传统资产高度自主流动性,极大地提高了供应链金融业务的效率和真实性,为投资人建立了一个动态、完整、真实、可信的信息披露机制,从根本上解决了中小企业底层资产多层级流转的信息穿透问题,荣中小企业获得对等话语权,无须用以来核心企业信用,独立开展融资活动,同时金融机构可以不依赖核心企业,直接通过可信的DLT账本,获取融资所需的中小企业底层资产信息。让传统金融中的弱势群体不再弱势,不再融资难、融资贵,金融将变得更加贴近实体,更加普惠共享,同时在现代科技的支持下,其安全性与监管的便利性,同传统金融资产相比,已不可同日而已,可以灵活地补充现有金融服务的空白地带。

资产数字化将催生金融的零售革命

数字金融的发展将模糊场内与场外之间的边界。某种意义上,目前导致市场出现场内、场外分层的主因之一,是(技术)可信程度不到位。传统技术无法很好解决金融交易的信任问题,因此许多交易需要在有组织的场内市场开展(当然也有规模经济的因素),国家认可的法理保障解决了可信问题。随着区块链、物联网等现代数字金融科技的发展,技术可信成为法律增信的补充手段。通过可信技术的赋能,原来分处“两张皮”的数据与价值,真正聚合成为物理与逻辑一体的数字资产。数字是价值,价值是数字,数字的流转就是价值的流转。任何资产均可利用可信技术开展数字化,流转盘活起来,而不完全依赖法律增信,此时,什么是场内,什么是场外,也就不再泾渭分明。

数字金融或将重构金融运行方式、服务模式乃至整个生态体系。在科技驱动下,它不用依赖传统的金融中介作用,即可让资产在保留原生全量信息的条件下流通起来。原先在场外大规模“沉寂”的非标准化资产,如仓单、知识产权、合同等各类资产,将焕发全新的金融“生命力”,低成本、高效率流转起来,经济前景和意义不可估量。

再做一步思考,数字资产化将催生金融的零售革命,就像互联网的出现催生了阿里巴巴等零售巨头一样,零售金融市场的觉醒将会带来更具深远影响的金融变革。

数字货币将超越美元,升级换代

数字资产互换数字货币!在数字资产的世界里,数字法币的缺失是问题的根本。对此,私人部门和公共部门均在发力。

从比特币缺乏基础资产支撑,到各类稳定代币的探索,或基于法币抵押,或基于算法,再到监管部门的介入,基于法币抵押的稳定代币因对法币的价值锚定得到增信,再到近期 JPM Coin、Facebook Libra的出现,虚拟货币价值不稳定和不合规的问题有望得到解决。因此,加密货币不再一定就是虚拟货币。

加密货币已经有可能成为真正意义上的货币,它不一定是数字M0,也有可能是比银行存款货币更高层次的货币:Mn。与数字M0相比,M1、M2……Mn等高层次货币的数字化或更具有想想空间。

中央银行一向被认为不适合承担数字货币供给的角色。主要担忧当数字货币向C端发行流通时,中央银行可能面临极大的服务压力和成本。比如,加拿大央行Jasper项目、新加坡金管局Ubin项目、欧洲中央银行和日本中央银行Stella项目等,正在试验加密货币技术,但还停留在B端应用场景。

按照IMF经济学家的观点,支付宝和微信支付本质上就是央行数字货币。支付宝和微信支付是100%备付准备金存缴,Libra白皮书提到100%资产储备,前者是将所有资金存缴中央银行,后者将资金交由第三方托管。事实上,100%准备金存缴之后,如何激励商业机构的行为,既要马儿跑,又要马儿不吃草,这有可能是一个新的命题。

技术上,100%准备经存缴意味着数字货币的发行、流通、收回、销毁等全生命周期均要依附于传统账户体系,这增大了中央银行中心系统的压力和复杂性,而且,难以实现“账户松耦合”的要求,自金融创新不容易展开,跨境支付的想象空间亦大打折扣。相比较,央行加密货币(Central Bank Crypto-Currencie,CBCC)可以让客户真正自主管理自己的货币,而不是托付给第三方,赋予客户自主掌控的能力,也可以超越Swift,开辟跨境支付的全新战场。

英格兰银行行长Carney认为类似Libra的数字货币将是全球储备货币的更好选择。数字货币不仅仅是法币的数字化,就像数字资产不仅仅是资产数字化那么简单,未来的数字货币需要修补现有货币体系的弊端,超越美元,升级换代。

重新审视传统监管范式

传统上以牌照管理为关键、以金融机构为抓手、以开立在金融机构的账户为核心的监管范式,需要重新审视。

一是机构准入的牌照管理,应转变为用户转入的权限管理。在自金融模式下,中介机构不再是抓手,用户才是关键。用户入场须经过相关认证机构的身份认证和核验,业务过程须与身份认证隔离,并采用密码学原语与方案来实现交易身份以及内容隐私保护,管理部门则有权开展穿透式监管。在此基础上,各国监管部门根据客户的数字身份归集本国居民,划定数字司法辖区,对本国居民设置各类业务参与权限。本国居民与非本国居民的金融业务和资金往来,由各国监管部门按照各自的资本账户开放和跨国金融监管政策进行规制。以Facebook受监管的金融子公司Calibra为例,其首个产品就是Libra数字钱包,Facebook通过Calibra钱包将社交用户的身份信息与Libra用户的区块链地址进行连接,钱包代替了持牌金融机构成为自金融环境下被监管的主体,这样可以按照司法辖区的具体要求落实监管策略,兼顾了用户隐私保护与监管合规的要求。

二是业务核准,应增加智能合约审核。智能合约在上链之前必须经过相关部门的验证,判断程序是否能按照监管部门的政策预期运行,必要时,监管部门可阻止不合规的智能合约上链或者关闭本国居民执行该智能合约,同时还可建立允许代码暂停或终止执行的监管干预机制。此外,智能合约的参数设置也是一种监管手段,监管部门亦可通过调整或干预智能合约参数,来管控自金融业务规模和风险。