始于同名同姓的日本电影《情书》与以太坊NFT技术原理分析

电影《情书》的故事梗概

《情书》是一部上映于1995年的日本经典爱情电影,1999年引进中国内地发行,又于2021年5月20日在中国内地重映,这部经典爱情电影改编自日本同名小说《情书》。



影片讲述的故事是:
日本神户某个飘雪的冬日,渡边博子在前未婚夫藤井树的两周年祭日上又一次悲痛到不能自已。正因为无法抑制住对已逝恋人的思念,渡边博子在其中学同学录里发现“藤井树” 在小樽市读书时的地址时,依循着寄发了一封本以为是发往天国的情书。

不想不久渡边博子竟然收到署名为“藤井树”的回信,经过进一步了解,她知晓此藤井树是一个同她年纪相仿的女孩,且还是男友藤井树少年时代的同班同学。为了多了解一些昔日恋人在中学时代的情况,渡边博子开始与女性藤井树书信往来。而藤井树在不断的回忆中,渐渐发现少年时代与她同名同姓的那个藤井树曾对自己藏了一腔柔情。


比起同名同姓带给两人的尴尬和误会,更多的其实是一种暧昧的懵懂

最治愈,最温暖,最感人的大概就是两位“藤井树”之间隐藏在心里的对男主单纯的喜欢。

身份信息的唯一性

影片故事毕竟只是影片故事,在现实生活中,会存在一些同名同姓甚至同性别的人,但不可能存在身份信息完全一样的两个人,比如身份证号码、手机号码、出生年月日时分秒等。

也许从数学集合的角度来看,只要往人这个集合里塞入的基数足够多(无穷大),必定存在完全相同的两个人。用公式表示即是,任意给定,则,其中表示人的属性元素,表示人。

然而,世间万物皆有穷尽之时,人的数量怎么可能无穷多?而人的属性却是无穷的,如果说人是由原子和分子组成,不同原子、分子之间的的个数、相对位置、状态也是无穷多,每个原子表面的电子所处能级均可能不同。从物理学的角度来看,原子和分子并不是最小的物质单位,比原子更小的物质单位是基本粒子。当今理论物理学领域认为物质的基本粒子共有64种,这64种基本粒子形成了宇宙万物。和组成物质的原子与分子相比,基本粒子的尺寸要小得多,以至于即便使用放大倍数最高的电子显微镜也无法观察到。其中质子和中子只有原子体积的十万分之一,轻子和夸克则更小,只有质子的万分之一。然而,物理学家们也已经意识到,基本粒子也可能并不是单一的粒子,基本粒子的结构也很复杂,以至于科学的研究总是永无止尽,所以人的属性个数总是无法定量,因为你永远不知道人在更细微层次上的属性有多少个。

而且,人的这些属性时时发生着变化,赫拉克利特曾经说过:“不能两次踏进同一条河流,因为新而又新的河水不断地往前流动。”赫拉克利特是站在动态的视角,因为变化无处不在,没有什么事物是永恒不变的,他推崇变化、推崇运动,认为运动比静止更符合客观规律。换言之,人在不同时空中的属性也是不同的,这更加增多了人的属性的多样性,因为我们还得给人的许多属性加上时间这一个维度。

17世纪末,在普鲁士王宫里,大哲学家莱布尼茨在向王室成员和众多贵族宣传他的宇宙观时提出:“天地间没有两个彼此完全相同的东西”。

听者哗然,不少人摇头不信。于是,好事者就请宫女到王宫花园中去找两片完全相同的叶子,想以此推翻这位哲学家的论断。

结果,令他们大失所望,谁也没有找到这样的叶子。因为粗粗看来,树上的叶子好像完全一样,可是仔细比较,却是大小不等、厚薄不一、色调不一、形态各异。

基于此,后世人们口口相传,将这段小故事引申为,德国大哲学家莱布尼茨说过:“世上没有两片完全相同的树叶。”这句话已然被人们奉为真理。仔细思考,每棵树都有数以万记的叶子,而且世界上同种类的树木非常多,但树叶的每一个纹理每一个构造结构都是不一样的。

尘世中的人类也如同树叶,不存在完全相同的两个人,那么也可认为世上不存在完全相同的两个身份,这就是身份的唯一性。

NFT的唯一性和不可分割性

NFT,全称为Non-Fungible Token,指非同质化通证,实质是区块链网络里具有唯一性特点的可信数字权益凭证,是一种可在区块链上记录和处理多维、复杂属性的数据对象。

目前的NFT,应用场景有数字艺术,门票,域名(ENS),游戏物品,Poap等等各个方面,甚至Uni V3的LP本身就是一个NFT……但当前唯一能拿出来说道的基本就是头像。而做头像,唯一的出路就是像猴子那样把它做成一个品牌或是IP,然后后面二创,元宇宙之类的叙事才能跟上。在我看来,元宇宙只是个概念,本身并不是某一种技术。元宇宙不是本文索要讨论的关键。数字艺术品(诸如头像)也不是本文所述NFT所应用的场景,但用于信息认证的真人头像可以作为身份信息的一部分。

NFT最鲜明的两个特点就是:唯一性和不可分割性。

我认为,人的身份信息和NFT最鲜明的两个特点是契合的,因为人的身份信息就是唯一的、不可分割的,因为世界上不存在半个人,也不存在完全相同的两个人。只是人的身份信息不具备交易特征,而NFT具备交易(或转增)的特征,这是身份信息和NFT之间的区别。

每个NFT都映射着特定区块链上的唯一序列号,不可篡改、不可分割,也不能互相替代。正是这些特质使NFT可以成为身份信息的绝佳载体,每一个NFT都代表特定身份,记录着其不可篡改的链上权利。

以太坊NFT的几种协议

真正的NFT应当是存在公有链上的,而非联盟链或者私有链。

而公有链中,最受认可的是以太坊。在国际公链有3个比较流行的NFT协议,分别是ERC-721、ERC-1155、ERC- 998。

ERC-721是一种有区别于ERC-20这种同质化代币的协议,其代表了所有者对数据的所有权。

ERC-1155是从交易角度来提高ERC-721的效率,比如A和B想交易100个NFT物品,如果采用ERC-721则需要进行100次交易,但采用ERC-1155协议的话,可以将100个NFT物品的Token进行打包,只进行一次交易后,再进行解包,从而提升交易效率和体验。但是本文主要讨论的是基于身份信息的NFT,不考虑交易情况,所以本文不分析ERC-1155。

ERC-998也是从交易角度来增加ERC-721的功能丰富度,ERC-998协议认为一笔交易中,可能存在NFT类的物品,也可能存在FT类的物品,这个协议是让任何一个NFT可以拥有其他NFT或FT,所以ERC-998也被认为是可组合的非同质化通证(Composable NFTs,缩写为CNFT)。ERC-998也是从交易角度提升NFT的协议产物,因此不再本文的讨论范围内。

ERC-721协议分析

该节大部分内容来源于以太坊EIP官网的提议:EIP-721: Non-Fungible Token Standard (ethereum.org)
每个符合ERC-721标准的合合约都必须实现ERC721和ERC165接口(受以下“警告”的约束):
pragma solidity ^0.4.20;

///  @title ERC-721非同质化通证标准
///  @dev 参见https://eips.ethereum.org/EIPS/eip-721
///  备注:该接口的ERC-165标识符是0x80ac58cd。
interface ERC721 /* is ERC165 */ {
    ///  @dev当任何NFT的所有权被任何机制更改时触发。
    ///  当nft被创建('from' == 0)和销毁('to' == 0)时触发此事件。
    ///  在任何转移时,该NFT(如果有)的批准地址被重置为none
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    ///  @dev当批准的NFT地址发生更改或重申时触发。零地址表示没有批准的地址。
    ///  当传输事件触发时,这也表明该NFT(如果有)的批准地址被重置为none。
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    ///  @dev当为所有者启用或禁用操作符时触发。
    ///  操作员可以管理所有者的所有nft。
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice统计分配给所有者的所有nft
    /// @dev分配给零地址的nft被认为是无效的,这个函数在查询零地址时会抛出异常。
    /// @param _owner查询余额的地址
    /// @返回`_owner`拥有的nft数量,可能为0
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice找到NFT的所有者
    /// @dev分配给0地址的nft被认为是无效的,查询它们会抛出异常。
    /// @param _tokenId NFT的标识符
    /// @返回NFT所有者的地址
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice将NFT的所有权从一个地址转移到另一个地址
    /// @dev抛出异常,除非`msg. js `"寄件人"是本NFT的当前所有者、授权运营商或批准地址。
    /// 如果`_from`不是当前所有者,则抛出。如果`_to`是零地址,则抛出。
    /// 如果`_tokenId`不是一个有效的NFT,则抛出。
    /// 当传输完成时,该函数检查`_to`是否是一个智能合约(代码大小>0),
    /// 如果是,它在`_to`上调用`onERC721Received`,
    /// 如果返回值不是`bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`,则抛出。
    /// @param _from NFT的当前所有者
    /// @param _to 新的所有者
    /// @param _tokenId 要传输的NFT
    /// @param data 没有指定格式的额外数据,通过调用`_to`发送
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;

    /// @notice 将NFT的所有权从一个地址转移到另一个地址
    /// @dev 这个函数的工作原理与另一个带有额外data参数的函数相同,
    /// 只是这个函数只是将data设置为""。
    /// @param _from NFT的当前所有者
    /// @param _to 新的所有者
    /// @param _tokenId 要传输的NFT
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice 转移NFT的所有权——调用者有责任确认`_to`有能力接收NFT,
    /// 否则它们可能会永久丢失
    /// @dev 抛出异常,除非`msg.js`"寄件人"是本NFT的当前所有者、授权运营商或批准地址。
    /// 如果`_from`不是当前所有者,则抛出。
    /// 如果`_to`是零地址,则抛出。
    /// 如果`_tokenId`不是一个有效的NFT,则抛出。
    /// @param _from NFT的当前所有者
    /// @param _to 新的所有者
    /// @param _tokenId 要传输的NFT
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice 更改或重申批准的NFT地址
    /// @dev 零地址表示没有批准的地址。抛出,除非"msg"。
    /// "发送方"是当前NFT所有者,或当前所有者的授权操作员。
    /// @param _approved 新批准的NFT控制者
    /// @param _tokenId 要批准的NFT
    function approve(address _approved, uint256 _tokenId) external payable;

    /// @notice 启用或禁用第三方("操作员")管理所有`msg.sender`的资产的批准
    /// @dev 触发ApprovalForAll事件。合约必须允许每个业主拥有多个运营商。
    /// @param _operator 地址要添加到授权操作员集
    /// @param _approved True表示批准,false表示撤销批准
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice 找出一个NFT的批准地址
    /// @dev 如果`_tokenId`不是一个有效的NFT,则抛出。
    /// @param _tokenId NFT来查找批准的地址
    /// @return 这个NFT的批准地址,如果没有,则为0地址
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice 查询一个地址是否是另一个地址的授权操作符
    /// @param _owner 拥有NFTs的地址
    /// @param _operator 代表业主的地址
    /// @return 如果`_operator`是`_owner`批准的运算符,返回True,否则返回false
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

interface ERC165 {
    /// @notice 查询合约是否实现了接口
    /// @param interfaceID 接口标识符,由ERC-165指定
    /// @dev ERC-165规定了接口标识。该函数使用少于30000个gas。
    /// @return 如果合约实现了`interfaceID`并且`interfaceID`不是0xffffffff,
    /// 则为`true`,否则为`false`
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
制作NFT的步骤中最关键的一步在于制作id。
一段文字、一张图片、一件衣服等,都可以被通证化。
  1. 制作id是把物质制作成 NFT 的第一步,获取id可以采用哈希函数,但又不局限于采用哈希的方法。
  2. 获取了物质的id,现在要把它们通证化,通证化的流程为,在所选的公链上开发智能合约;所开发的智能合约需要遵循一些基础约定,要保证物质的id能达到验证去重(如果 A 在今天上传了 id=1 到链上,明天 B 也上传同个 id=1 到链上,合约要能告诉 B,你不能上传了,id 已经存在)。如果选择 ERC-721 标准开发 NFT 智能合约,在元数据存储部分,就有 tokenUrl 这项,它相当于物质的唯一id。
  3. 更新:更新是一项 NFT 智能合约的拓展功能,可有可无,具体是怎样的方式,完全看需求的实现。比如:允许重置 tokenId 所对应的内容;在 NFT 原数据中增加其他字段内容,再允许修改这些字段....
以太坊NFT的实现原理其实很简单,就是用智能合约技术来保证id的唯一,同时利用nft智能合约技术实现该id对应的一些状态值(字段值)的更新。
全部评论
大佬看完电影输出一篇以太坊NFT技术原理分析,我看完电影“又是为别人的绝美爱情而流泪的一天”
点赞 回复 分享
发布于 2022-08-15 11:42

相关推荐

11-11 14:21
西京学院 C++
Java抽象练习生:教育背景放最前面,不要耍小聪明
点赞 评论 收藏
分享
牛客339922477号:都不用reverse,直接-1。一行。啥送分题
点赞 评论 收藏
分享
2 3 评论
分享
牛客网
牛客企业服务