defi/dapp代币合约链上开发案例丨dapp/defi链上代币合约swap薄饼去中心交易所系统开发实现技术及源码

简介:  区块链最重要的功能,就是建立一种价值共识,而这个“共识”,主要基于“价值量化的能力”和“价值安全的过程”两个方面。先是“价值量化能力”:把一件事通过数字化的方式描述清楚,就是一个价值量化的过程。

  区块链最重要的功能,就是建立一种价值共识,而这个“共识”,主要基于“价值量化的能力”和“价值安全的过程”两个方面。先是“价值量化能力”:把一件事通过数字化的方式描述清楚,就是一个价值量化的过程。

  其次是“价值安全的过程”:通过数字化的方式描述清楚后,还要保护数据不被篡改,并可以随时随地地查询。,这两个方面叠加起来,就形成了价值共识。所以,区块链在数据互通机制、信用体系的搭建上,必将发挥非常重要的作用。

后者定义如下:

function _nextExtraData(
address from,
address to,
uint256 prevOwnershipPacked
) private view returns (uint256) {
uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
}

此函数用于写入额外的信息,开发者需要自行定义 _extraData 函数以实现相关数据的写入。

此过程的核心函数为 _packOwnershipData ,其定义如下:

function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
assembly {
// Mask owner to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags.
result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
}
}

有了上述 _nextInitializedFlag 和 _nextExtraData 的补充和注释,相信读者可以理解 _packOwnershipData 的实现原理,简单来说,该函数使用 or 操作符拼接 owner 、 timestamp 和 flags 以实现最终的数据结构。显然,我们只需要构造以下部分作为flags输入,即可完成 _packOwnershipData 的构造:

// - [224] burned
// - [225] nextInitialized
// - [232..255] extraData
1
2
3
读者可以注意到 owner 、 timestamp 和 flags 均为 uint256 数据类型,所以直接使用 or 进行拼接是合适的

接下来设置 _packedAddressData 数据结构。此数据结构定义如下:

// Bits Layout:
// - [0..63] balance
// - [64..127] numberMinted
// - [128..191] numberBurned
// - [192..255] aux
mapping(address => uint256) private _packedAddressData;

mint 过程仅涉及 balance 和 numberMinted 两部分数据。所以设置较为简单,代码如下:

_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
1
我们使用 ((1 << _BITPOS_NUMBER_MINTED) | 1) 构造(此处 _BITPOS_NUMBER_MINTED = 64 )出如下二进制数字 (以 16 进制表示):

0b10000001
1
使用 Python 运行 bin((64 << 1) | 1) 可以获得此结果

所以我们可以直接将数字与 balance 和 numberMinted 对齐相加。

在释放 Transfer 事件前,我们需要对 NFT 接受方的地址进行简单校验,即保证 NFT 接受方的地址不为 0 地址,校验代码如下:

uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;

if (toMasked == 0) _revert(MintToZeroAddress.selector);

相关文章
|
数据挖掘
深入分析:ERP系统的优势与劣势
深入分析:ERP系统的优势与劣势
950 3
|
12月前
|
运维 数据处理 Apache
数据实时计算产品对比测评报告:阿里云实时计算Flink版
数据实时计算产品对比测评报告:阿里云实时计算Flink版
|
存储 缓存 资源调度
你真的知道 NPM、Yarn 与 PNPM 这三个前端包管理器之间的区别吗?
【6月更文挑战第9天】NPM、Yarn和PNPM是主流前端包管理器,各有特色。NPM生态庞大,易用但速度慢;Yarn速度快,依赖管理稳定;PNPM性能优异,节省磁盘空间。Yarn和PNPM在速度和确定性上胜出,NPM因广泛使用和丰富资源领先。开发者可根据项目需求和喜好选择,三者共同推动前端开发进步。
381 8
|
Java 应用服务中间件
Tomcat出现the jre_home environment variable is not defined correctly this environment variable is need
今天运行Tomcat点击startup.bat cmd直接一闪而过,直接闪退了,很难受,原因是前几天手贱不小心把环境全删了,好难受,只能重新安装了,现在官网下载jdk,我的是jdk-17.0.2,路径是`D:\javase\jdk-17.0.2` 记住这个路径(很重要),然后在环境变量里设置,在用户变量里添加JAVA_HOME与JRE_HOME把我们刚刚的路径复制进去。在系统变量里面的PATH新建的添加%JAVA_HOME%\bin 与%JRE_HOME%\bin 点击确定。环境配置好了。
889 0
Tomcat出现the jre_home environment variable is not defined correctly this environment variable is need
|
Ubuntu 搜索推荐 Shell
Linux、Ubuntu、CentOS安装和配置zsh
Linux、Ubuntu、CentOS安装和配置zsh
694 0
|
并行计算 Java PyTorch
使用VGG网络训练发生错误RuntimeError: CUDA out of memory解决方案:
使用VGG网络训练发生错误RuntimeError: CUDA out of memory解决方案:
850 0
|
消息中间件 Cloud Native Serverless
云原生概要介绍-阿里云云原生产品体系
云原生概要介绍-阿里云云原生产品体系
云原生概要介绍-阿里云云原生产品体系
|
存储 数据采集 SQL
DAMA数据管理知识体系指南(5):数据建模和设计
DAMA:国际数据管理协会,是一个全球性数据管理和业务专业志愿人士组成的非营利协会,是当前国际上在数据治理领域最权威的机构。 DMBOK2则是DAMA组织众多数据管理领域的国际级资深专家编著,深入阐述数据管理各领域的完整知识体系。它是市场上唯一综合了数据管理方方面面的一部权威性著作。 本系列文章,将针对DMBOK中的核心内容进行解读。
DAMA数据管理知识体系指南(5):数据建模和设计
STM32F103C8T6 TFTILI9328液晶显示屏使用教程
STM32F103C8T6 TFTILI9328液晶显示屏使用教程
359 0
|
缓存 运维 监控
《阿里云云原生 Serverless 案例集》——典型案例——互娱-网易云音乐
《阿里云云原生 Serverless 案例集》——典型案例——互娱-网易云音乐
338 0