售前客服二维码
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!
什么是0x协议,它的工作机制是什么?本文将介绍0x协议,包括它的链序中继(匹配)、分散事务中继,以及如何在以太网公共链或私有链上通过0x智能契约建立自己的分散交换(DEX)。
什么是0x协议
0x是一个支持以太网上对等资产交换的开放协议,它的开源基础设施使开发人员和企业能够构建自己的交换来交换所有ERC-20和ERC-721资产。
0x协议特征
0x协议具有以下特征
保护不受管理的交易
您可以直接进行钱包对钱包的资产交易,而无需存款或取款。
灵活的订单类型
你可以选择以当前价格出售资产,或者允许潜在买家出价。
建立企业
通过对每笔交易收费,你可以将你的产品货币化,并加入到日益丰富的0x生态系统中。
上述0x协议特性可以实现我们的分散交换。
0x协议优势
0x协议使用模块化方法在区块链以太网进行资产交易,其优势如下:
可靠的智能合同
0x协议的智能契约已经通过了两轮严格的安全审计。
可扩展架构
0x模块化管道使开发人员能够通过扩展的应用编程接口嵌入他们自己的智能合同。
高效设计
0x协议链下的订单匹配和结算是一种节省手续费的交换方式。
0x协议可用于许多场景,如游戏、收藏品、市场预测、分散交易的订单、分散贷款等。
其次,0x的智能合同是模块化的,可以通过治理进行升级,而不会影响系统的其他组件,也不会造成市场混乱。
0x协议的智能契约
0x协议的智能契约包括:
交换合同:资产交换合同
Erc20代理合同:ERC 20代理合同
Erc721代理合同:erc721代理合同
资产交换合同
包含0x协议的业务逻辑是以下功能的入口:
*提供订单
订单取消
执行交易
签名验证
在系统中注册新资产
ERC20代理合同
该合同表示用户想要转移ERC20令牌。因此,每个用户(ERC20令牌持有者)必须批准合同可以操作他自己持有的ERC20令牌。
ERC721代理合同
该合同表示用户想要转移ERC721令牌。因此,每个用户(ERC721令牌持有者)必须批准合同可以操作他自己持有的ERC721令牌。
为了部署和使用0x协议智能契约,您需要首先安装0x.js。0x.js是一个与0x协议交互的JavaScript库,可以方便地调用0x协议的智能契约来创建、取消或验证订单,并检查ERC20和ERC721令牌持有者的授权限制和余额。
深入研究0x合同架构
0x协议采用链下订单匹配和结算的方式,加密签名的订单可以通过链下的任何通道进行通信。感兴趣的交易对手可以将这些订单中的一个或多个注入0x的资产交换合同,并结算连锁交易。
0x协议可以交换任何ERC20或ERC721资产。上图显示了取货人向0x资产交换合同提交订单时资产转移的实际处理流程(下图需要对应的参考号):
注:在外汇交易中,做市商(待定订单)和收单人(接受订单)。悬而未决的订单提供了流动性,他们的订单是被动出售的。吃订单恰恰相反,它是利用流动性积极交易。
1.接受者调用资产交换合同的fillOrder()方法来提交已签署的订单。
2.资产交换合同将订单转移到相应的ERC20代理合同,实际的令牌转移在代理合同上进行。注:在提交订单之前,制造商和收货人必须授权ERC20代理合同。
3.调用ERC20代理合同中ERC20令牌合同的转移自()方法。
4.如果未决订单人的ERC20合同的调用失败,则整个交易被回滚。
5.交易从代理返回到交换合同。
6.资产交换合同将订单转移到ERC20代理合同。
7.在资产代理合同中调用ERC20合同的转移自()方法
8.如果订购者的ERC20合同调用失败,整个交易将回滚。
9.交易从代理返回到交换合同。
10.返回事务执行结果
接下来,我们将讨论使用0x.js库在以太网上部署0x智能契约,以便交换资产并使用npm安装0x.js:
npm安装0x.js
部署0x智能合同
为了与智能契约交互,我们需要部署0x智能契约,然后通过0x.js库与具有契约地址的契约交互。
资产交换合同
资产交换合同的源代码在github[1]中。资产交换合同的构造函数没有参数,因此在部署时没有必要提供参数。部署者(消息发送者)将是合同的所有者。所有者可以在交换合同中设置代理合同的地址。
ERC20代理合同
使用ERC20代理契约的源代码[2]进行部署,代理契约的构造函数不需要参数,部署者(msg.sender)将是契约的所有者。所有者将能够在ERC20代理合同中设置资产交换合同的地址。
ERC721代理合同
使用ERC721代理合同源代码[3]进行部署,代理合同的构造函数不需要参数,部署者(msg.sender)将是合同的所有者。所有者将能够在ERC721代理合同中设置资产交换合同的地址。
与0x协议交互
与0x交互的最终目标是订单接受者使用0x.js库创建订单,订单接受者使用fillOrder()函数提交订单进行兑换。
注册合同
上述合同部署后,需要在资产代理合同中设置交换合同的地址,在交换合同中设置资产代理合同的地址。
调用资产交换合同的注册代理(ERC20 20或ERC71代理合同地址)方法记录资产代理合同的地址,代币交换交易在代理合同中进行。此方法只能由资产交换智能合同的所有者调用。
调用ERC20代理合同的addAuthorizedAddress方法注册交换合同。
调用ERC20代理合同的removeAuthorizedAddress方法删除交换合同。
合同配置
使用资产交换合同和资产代理合同的地址通过0x.js库进行交互:
让contractConfig={
合同地址: {
ERC 20 proxy : proxy address . to ower case(),
ERC 721 proxy : '0x1d 7022 F5 b 17 d2f 8 b 695918 FB 48 fa 1089 c 9 f 85401 ',
exchange : Exchangeaddress . ToLowerCase()
},
网络标识:网络标识
};
const contractWrappers=新的ContractWrappers(holderEngine,contract config);
现在,您可以与部署在专用或测试网络上的0x协议智能合同进行交互。请记住添加RPC节点提供程序来与区块链交互。
实例化
为了与0x.js库交互,我们需要导入如下所示的相关软件包
常量{
资产数据,大数字,合同包装,
generatePseudoRandomSalt,orderHashUtils,signatureUtils
}=要求('0x . js ');
常量TX _ DEFAULTS={ gas : 400000 };
const { RPCSubprovider,Web3providerengine }=require(0x . js);
让新钱包=新醚。钱包(钱包.签名钥匙.私人钥匙,省);
const holderWallet=新的私钥提供程序(wallet . signing key . private key . slice(2));
添加RPC订阅节点提供程序:
const holderEngine=新的web 3 providerengine();
holder engine . addProvider(holder wallet);
//用户节点提供商可以使用定制的网址分别连接到以太网主网、测试网或专用链。
holderEngine.addProvider(新的RPcsubProvider(ProviderRul));
holder engine . start();
获取0x合同地址并实例化合同包装:
const contractWrappers=新的ContractWrappers(holderEngine,contract config);
常量网络3包装=新网络3包装(提供引擎);
const contract address=GetContractAddresseForNetworkRow(100);//网络标识
ERC20合同授权
在待定订单持有人(持有令牌)可以创建订单并且订单执行者(持有令牌)将提交订单进行兑换之前,需要新的授权。
首先获取相关合同地址:
//合同地址
常量令牌地址=合同地址。
常量令牌地址=合同地址。
const exchange=contract address . exchange;
所有地址都可以从0x.js库中获得。
//将有关资产的所有必要信息编码为十六进制字符串
const makerAssetData=AssetDatautils。编码C20资产数据(令牌地址);
const taker asset data=asset data utils。encoderc20资产数据(令牌地址);
常量MaKERASSetamount=Web3包装。ToBaseUnitAmound(新的大数字(100),小数);
常量接受者数量=Web3Wrapper.toBaseUnitAmount(新的大数字(200),小数);
const NULL _ ADdress='0x 000000000000000000000000000000000000000000000 ';
const ZERO=新的BigNumber(0);
常量小数=18
现在挂单者和吃单者应该授权相应的资产代理合约,以便代理合约可以分别代表挂单者和吃单者转移代币:
//授权
const makerApprovalTxHash=等待合同包装。ERC 20代币。设置无限UNLIMITEdProxyLawneAsync(
令牌地址,
制造者,
);
等待web3包装。wait transactionsuccesssync(MaKEraproValtxhash);
//授权
const taker approvaltxhash=wait contract wrappers。ERC 20代币。设置无限UNLIMITEdProxyLawneAsync(
标记标记,
接受者,
);
等待web3包装。wait transactionsuccesssync(takepaprovaltxhash);
在挂单者和吃单者授权资产代理合约之后,代理合约就可以分别代表挂单者和吃单者转移代币了。
接下来,挂单者将创建一个委托订单并在链下签名,而吃单者将在链上执行订单。
创建订单、验证与吃单
创建订单:
常量顺序={
交换地址:交换地址,
makerAddress:制造商,//制造商地址
收件人地址:收件人,//收件人地址
发送者地址:接收者//发送者地址
fee recipient ADdress : NULL _ ADdress,//平台本币形式的费用
3360 randomExpiration,//订单过期时间
salt : generatepredurandomsalt(),//随机数,用来区分订单
makerAssetAmount,//挂单资产数量
接受者资产金额,//接受者资产金额
makerAssetData,//令牌的编码地址
获取者数据,//令牌b的编码地址
makerFee: ZERO,//如果需要,收费
收取费用: ZERO,//如有需要,收取费用
};
现在我们创建了一个资产交换委托订单。接下来在调用0x.js库的getOrderHash()函数获得订单哈希值以便进行签名。这个哈希根据EIP712[4]对订单计算出来的:
const OrderHashhex=OrderHashHutils。GetOrderHashhex(订单);
获取订单的哈希后,挂单者使用0x.js库的ecSignHashAsync()方法对订单签名。
const signature=wait signatureils。ecsignathassync(providerEngine,orderHashHex,maker);
const Signedor={…订单,签名};
吃单者可以使用资产交易合约的validatefilorderstorifinvalid async `验证方法验证订单是否可以执行:
等待合同包装。交易所。validatefilorderthrowifinvalid异步(
signedOrder,
接受者数量,
接受者
);
最终,吃单者调用资产交易合约的fillOrderAsync方法执行订单:
尝试{
txHash=等待合同包装。交易所。FillOrderAsync(
signedOrder,
接受者数量,
接受者,
{发送_默认值,}
);
var事务=wait web3包装。等待transactionsuccesssync(Txhash);
{}
捕捉(错误){}
让我们快速回顾一下到目前为止所学到的知识,然后通过介绍已经建立在0x上的项目来结束我们的讨论。
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!