Spacemesh-浏览器

什么是XELIS?使用同态加密和智能合约支持的私有区块DAG

77次阅读
没有评论

主要特点

XELIS的主要特点如下:

  • BlockDAG:降低孤立块速率。
  • 平等挖矿:任何 CPU 或 GPU 都可以轻松挖掘 XELIS。
  • 隐私:同态加密允许加密余额和加密的转账金额。
  • 机密资产:部署在XELIS网络上的任何资产都将具有与XELIS相同的隐私和功能。不仅仅是智能合约中的一个数字。
  • 事件系统:网络上发生的每个事件(守护进程或钱包)都可以轻松检测和通知。
  • 即时同步:您的钱包余额和历史记录会在几秒钟内同步。
  • 智能合约:创建和部署不可阻挡的去中心化应用程序。
  • 集成地址:在您的钱包地址中引入任何数据,以在交易中共享信息。
  • 易于使用:我们的目标是提供最简单的平台来构建和日常使用。

目标

XELIS的主要目标是:

  • 提供交易/余额的隐私。
  • 提供智能合约支持。
  • 安全快速。

其他目标包括:

  • 提供作为原生币的真实自定义资产。
  • 设计为 CPU/GPU 挖矿友好,以尽可能提高去中心化。
  • 简单易用。
  • 社区驱动的决策。

配置

网络

  • 预期阻塞时间为秒15
  • 地址前缀位于主网和 testnet/devnet 上xelxet
  • 交易费用为每KB XEL0.01000
  • 精确到小数点后8
  • 最大供应量:百万18.4
  • 最大块大小:MB1.25
  • 难度调整算法:在每个区块重新定位
  • 区块奖励发放:在每个区块处重新定位(平滑减少)

守护 进程

  • 默认 P2P 端口为2125
  • Defaut RPC Server 端口是8080

钱包

  • 默认 RPC 服务器端口为8081

路线图

  • 将硬币发送到尚未注册的地址时包括额外费用
  • 支持智能合约 (xelis-vm)
  • 隐私(通过同态加密)

BlockDAG的

XELIS使用具有以下规则的blockDG:

  • 当方块高度小于该方块,并且是特定高度的唯一方块(或仅在其高度上有序方块并且累积难度不低于以前的方块)时,将考虑该方块。Sync BlockTOP_HEIGHT - STABLE_LIMIT
  • 当块高度小于或等于过去 8 个拓扑块的高度时,将考虑一个块。Side Block
  • 当块在 DAG 中没有排序(没有拓扑高度)时,将考虑该块。Orphaned
  • 高度不再是独一无二的。
  • 每个块的拓扑高度都是唯一的,但当 DAG 重新排序到 时,拓扑高度可能会发生变化。TOP_HEIGHT - STABLE_LIMIT
  • 一个块中最多可以有 3 个以前的块。
  • 对于挖矿,您必须在 3 个最重的尖端之一上挖矿。
  • 块不应偏离主链/较重的尖端太多。
  • 在同一块中选择的提示之间最大难度差异为 9%。
  • 侧块仅获得 30% 的区块奖励。
  • 每次重新排序区块时都会重新计算供应量,因为它基于拓扑顺序。
  • 当添加一个新区块并且链接到的区块尚未处于稳定的地形高度时,交易和矿工奖励将重新计算。
  • 如果同一笔交易不在同一提示分支中,则可以将它们添加到多个区块中。客户端协议将只执行一次。

Topoheight 表示 DAG 排序的区块链中有多少个唯一区块。

订购的区块是有效且已执行的区块。

地形高度顺序不稳定,可能会发生变化,直到块处于稳定高度。

最长链是节点选择的链。但对于提示分支冲突,使用累积难度来选择主链。

同态加密

同态加密 (HE) 将允许通过在保持加密形式的同时进行计算来增加交易和账户的隐私。 每个余额,交易资产价值都是加密形式的,除了相关方之外,没有人可以确定它的真实价值。

注意:这部分尚未部署,正在繁重地工作中。

采矿

由于标准未实施,XELIS的挖矿能力与其他链略有不同。 发送到矿工的每个作业都是十六进制格式的实例。BlockMiner

其格式如下:BlockMiner

  • 标头工作哈希:32 字节
  • 时间戳(u64 表示毫秒):8 字节 (BigEndian)
  • 随机数 (u64):8 字节 (BigEndian)
  • 额外随机数:32 字节
  • 矿工公钥:32字节

总块工作大小应等于 120 字节。 标头工作哈希是块工作的不可变部分,它是使用哈希算法计算的哈希,其输入格式如下:Blake3

  • 块版本:1 字节
  • 块高度 (u64):8 字节 (BigEndian)
  • 提示哈希值:32 字节
  • 交易哈希的哈希值:32字节

标头工作必须完全等于 73 个字节,其哈希值必须等于 32 个字节。

注意:矿工密钥不包含在不可变的区块工作中,以具有可以与任何矿工兼容的通用区块模板。

除工作量证明哈希之外,所有哈希值均使用哈希算法计算。Blake3

应根据格式计算 POW 哈希值,并与目标难度进行比较。BlockMiner

注意:建议使用 GetWork WebSocket 服务器接收新块工作的通知并提交正确的工作。

仅当找到新区块或在内存池中添加新 TX 时,才会发送挖矿作业。 建议矿工软件自行更新区块时间戳(或至少每 500 毫秒更新一次),以获得最佳网络难度计算。

实际上,POW哈希算法是直到我们开发(或选择)自己的算法。Blake3

客户端协议

XELIS与BlockDAG集成,一种接受多次相同TX并只执行一次的方法。 我们没有因为与TX的另一个blockDAG分支发生冲突而排除整个块,而是不执行TX并保留其哈希值。

只有在以下情况下,同一 TX 才能包含在多个块中:

  • TX 未在稳定高度执行
  • TX 不包含在块提示(以前的块)中

此外,为了提高安全性,用户帐户应仅在同一条链/尖端上执行 TX,以防止任何孤立的 TX。 当两个具有相同随机数的不同 TX(但所有者相同)在两个不同的分支中发送时,可能会发生孤立 TX。

在生成 DAG 顺序(将唯一拓扑高度链接到区块哈希值)期间,第一个被订购的区块将首先执行 TX。

此功能允许接受其他分支提示,即使交易相同,并防止在分支合并时阻止更多孤儿块。

交易

支持的交易类型:

  • 传输:可以将许多资产发送到同一 TX 中的多个地址(内部最多 255 个输出)
  • 销毁:公开销毁特定资产的数量,并使用此 TX 作为销毁证明(硬币从流通中完全删除)
  • 看涨合约:调用具有特定参数和要存入资产列表(WIP)的智能合约(注意:同一TX中的多看涨合约?
  • 部署合约:在链上部署新的(有效)智能合约(WIP)

目前,交易是公开的,并具有以下数据。

类型 评论
所有者 公钥 此交易的签名者
数据 事务类型 包含此事务数据的类型
整数 业主为包括此 TX 而支付的费用
随机数 整数 匹配要验证的平衡随机数,并防止任何重放 TX 攻击
签名 签名 有效签名,以证明所有者验证了此 TX

交易原生支持任何已注册的资产。

为防止任何重放攻击或双重支出,每个 TX 都应包含一个与帐户余额匹配的随机数。 在每个 TX 之后,随机数递增 1。

综合地址

集成地址是集成了自定义数据的基址。 例如,您可以在其中集成一个唯一标识符,该标识符将集成到将来使用它完成的事务中。它有助于轻松确定将哪个帐户与服务端的帐户/订单相关联。

允许的最大数据为 1KB(与事务有效负载相同)。

使用集成地址时,每个数据都集成在事务负载中。

P2p(加密网络)

所有传输的数据都使用手动制作的自定义序列化器/反序列化器,以直接转换原始字节的结构表示。 此序列化是使用每个字段的固定位置及其相应的位大小完成的。

在发送数据包之前,我们使用 ChaCha20-Poly1305 算法对其进行加密,以防止网络流量分析并验证每个传输的数据。

传输的每个数据都是通过数据包系统完成的,该系统可以很容易地读取和传输数据,并完成整个序列化本身。

新对等体的连接(从队列或新的传入连接中获取)通过唯一的 tokio 任务执行,该任务具有相同的握手分配缓冲区。 这可以防止在创建多个任务和验证连接时进行任何 DoS 攻击。

当对等节点被验证和有效时,我们为他创建自己的任务。一个用于读取传入的数据包,一个用于向他写入数据包。 通过在两个不同的任务中分离两个方向,它可以防止阻碍对方的通信。

对于事务传播,我们将从对等方发送或接收的最后 N 个事务保存在缓存中,以便在传播过程中不会发送两次相同的数据。

守护程序还运行了 3 个 tokio 任务:

  • 维护与种子节点的连接
  • 链同步(选择一个随机对等节点来同步其链)
  • Ping 任务,用于构建一个通用的 ping 数据包,该数据包将发送到连接的每个对等体(或在必要时为每个对等体构建一个特定的 ping 数据包)

修剪模式

这允许任何想要运行轻节点的人通过删除区块、交易和版本控制余额来减小区块链的大小。 修剪后的地形高度只能位于顶部地形高度的至少块后面。Sync BlockPRUNE_SAFETY_LIMIT

对于连接到修剪节点的钱包,您无法检索在修剪的拓扑高度之前发生的交易历史记录和矿工奖励。 但是您的余额仍然是最新的,如果您的钱包已经同步了它们,它们会保留在您的钱包数据库中。

链的安全性不会降低,因为你所有的区块都已经由你自己的节点在本地验证了。

快速同步

快速同步模式允许您非常快速地同步必要的数据,只是为了运行正确和有效的链版本。为此,我们请求一个对等节点 在稳定点向我们发送其链状态,其中包括所有账户、资产、余额、顶部区块。 所以在未来,当链条变得非常沉重时,任何人都可以通过使用与修剪模式兼容的快速同步系统来加入它。

警告:您应该只对受信任的对等方使用快速同步模式,因为他们可能会向您发送潜在的假链。

加速同步

这是向其他节点请求完整的链,但速度更快。 可以使用 启用 Boost 同步模式。此模式使用更多资源,但同步速度更快。 它更快,因为它请求块并行同步,而不是传统的同步,即只请求一个块,验证它,执行它,重复它。 默认情况下,它未启用以防止节点上负载过大。--allow-boost-sync-mode

这是快速同步和传统链同步之间的完美结合,在速度更快的同时拥有完整的账本。

本部分解释了XELIS网络中用于通过P2P网络进行通信的最重要的数据包。

密钥交换

密钥交换是创建新连接时要发送的真正第一个数据包。 这允许在对等体之间交换系统加密密钥,以通过 TCP 建立加密的通信通道。

目前,我们正在使用 ChaCha20-Poly1305 算法来加密/解密每个数据包。

稍后可以发送此数据包以轮换对等方的密钥。 目前,每发送 1 GB 数据即可完成此操作。

我们使用两种不同的对称密钥对每个 Peer 进行加密。 一个密钥来自我们,用于加密我们的数据包,另一个密钥用于解密对等方的数据包。

握手

握手数据包必须是发送的第一个带有区块链状态的数据包,才能将连接升级到对等体。 如果有效,对等方将发送具有自己的区块链状态的相同数据包。

除开始时外,此数据包不应再次发送。

Ping数据包会定期发送,并通知同行我们的区块链状态。 每 15 分钟,数据包最多可以包含套接字地址(IPv4 或 IPv6),以帮助其他节点扩展其对等节点列表。MAX_LEN

链同步

我们从对等体列表中随机选择一个身高比我们高的对等体,并向他发送连锁请求。

链请求包括我们链的最后一个区块哈希值,它们的拓扑高度呈指数级间隔。 选择的对等体使用此数据来尝试找到与我们的链和他自己的链的共同点(区块哈希必须与其他对等体处于相同的拓扑高度)。 如果选定的对等节点找到一个共同点,他将按块高度排序的块哈希值相加。CHAIN_SYNC_REQUEST_MAX_BLOCKSCHAIN_SYNC_RESPONSE_MAX_BLOCKS

通过“询问和等待”请求对象系统,我们询问完整的区块(包含交易的区块头)并直接将其添加到链中。

请求链同步的最小间隔为秒。CHAIN_SYNC_DELAY

块传播

块传播数据包仅包含块头。它发送给所有身高减去我们的身高小于 的同行。 为了构建区块,我们从内存池中检索交易。 如果在内存池中找不到交易,我们会从同一个对等节点请求它来构建它。STABLE_LIMIT

事务传播

事务传播数据包仅包含哈希值,以防止发送 TX。 它还由每个对等方的缓存支持,以了解交易是否已经从他那里收到/发送给他。

存储

所有这些数据都以明文形式保存。

密钥类型 值类型 评论
交易 散 列 交易 根据其哈希值保存整个交易
散 列 块头 仅根据其哈希值保存块头
blocks_at_height 整数 哈希数组 将所有块哈希保存在特定高度
额外 字节 无特定类型 保存最高拓扑高度、修剪后的拓扑高度和 TIPS
topo_by_hash 散 列 整数 在特定拓扑高度保存块哈希
hash_by_topo 整数 散 列 保存特定区块哈希的拓扑高度
cumulative_difficulty 散 列 整数 保存每个区块哈希的累积难度
资产 散 列 整数 验证资产是否存在及其注册高度
奖励 整数 整数 保存区块奖励
供应 整数 整数 计算每个区块的供应量(过去 + 区块奖励)
困难 散 列 整数 每个方块的难度
tx_blocks 散 列 哈希数组 包含此 TX 哈希的所有区块
平衡 习惯 整数 版本化平衡的最后拓扑高度
随机数 公钥 整数 存储版本化随机数的最高拓扑高度
versioned_balances 习惯 版本控制余额 密钥由拓扑+资产+公钥组成
versioned_nonces 习惯 版本控制 Nonce 密钥由拓扑+公钥组成

说明

  • Tree 有一个自定义密钥,由 32 字节的公钥和 32 字节的资产组成。balances
  • 余额和随机数是版本化的,这意味着每次链中发生更改时都会存储它们。
  • 由于每个树的开销,每个版本使用树的树太重,解决方案是根据属性对生成的键进行哈希处理。
  • 已登记的资产的价值与其登记时的地形高度相同。
  • 供应和区块奖励仅在区块按拓扑排序时存储

使用的数据库引擎是 sled。将来可能会发生变化。

每个块的当前开销:

  • 使用 Hash(32 字节)键保存 Block 标头(132 字节,无 TX)值。blocks
  • 树并保存哈希(32 字节)<=> topoheight(8 字节)指针。(×2)topo_by_hashhash_by_topo
  • 树保存 使用 Hash(32 字节)键的块(最多 33 字节)的难度值。difficulty
  • 树保存拓扑高度(8 个字节)的累积难度值(最多 33 个字节)。cumulative_difficulty
  • 使用 topoheight(8 字节)键保存树保存块奖励值(8 字节)。rewards
  • 树状保存电流循环电源值(8 字节)使用 topoheight(8 字节)键。supply
  • 树在每个区块(矿工奖励)以及每个有交互(交易)的账户上都会更新:密钥为 72 字节,价值为 16 字节。versioned_balances
  • 对于每个拓扑高度至少发送一个 TX 的每个帐户,将更新树:键为 40 字节,值为 16 字节versioned_nonces

目前,在当前实现的情况下,每个新帐户的最小开销是 208 字节的键和 56 字节的值:

  • balances公钥 + 资产(64 字节)=上次版本控制余额的 > 个拓扑高度(8 字节)
  • nonces公钥(32 字节)=上次版本化随机数的 > 拓扑高度(8 字节)
  • versioned_balances公共拓扑 + 密钥 + 资产(72 字节)=> 版本控制余额(16 字节)
  • versioned_noncesTopoheight + 公钥(40 字节)=> 版本控制随机数(16 字节)

可以做一个优化的版本,通过创建指针来进一步减少磁盘使用量。 我们不是多次保存整个公钥(32 字节),而是创建一个指针表,其中分配了 u64 值。 我们存储这个 u64 id,而不是整个公钥,资产。

钱包

钱包跟踪您在链上的所有交易,您拥有的所有资产。

创建新钱包时,它会生成一个新的随机安全“主密钥”,该密钥将通过哈希密码进行加密。 此主密钥允许轻松更改钱包的密码,因为您只需要保存它的新加密版本。

主密钥也是能够解密/加密您所有钱包存储的密钥。

这样可以安全轻松地在任何设备上保存数据。

使用的密码哈希算法是 Argon2id,配置为 15 MB,迭代 16 次。

存储

Wallet 实现了一个完全加密的存储系统,具有以下功能:

  • 树名使用生成的盐进行哈希处理
  • 密钥数据使用生成的盐进行哈希处理
  • 每次保存值时,都使用 XChaCha20Poly1305 和随机新生成的随机随机数对值进行加密。

资产列表的例外情况,其密钥已加密,以便以后能够检索它们。

用于键/树名的哈希算法是 Blake3。 生成的随机盐长度为 64 个字节。 这个简单的系统可以防止有人在没有必要密钥的情况下读取/使用数据。

数据类型和值

该协议允许通过名为 的自定义钱包地址传输数据。 它只需将编码数据集成到钱包地址中,即可在创建交易时将特定数据发送到钱包。 每个事务最多可以保留 1 KB 的空间(例如,用于加密数据传输)。integrated address

您可以通过钱包在链上创建简单的服务/通信,同时保持匿名和加密形式。

实际上,您可以通过 API 获得以下值:

  • 空值表示
  • 布尔
  • 字符串
  • 无符号数字 (, , , ,u8u16u32u64u128)

而这些类型:

  • 值(只有一个值,可用于 PaymentID 表示)
  • 数组(任何不同值类型)
  • 字段(例如,可用于表示自定义)struct

应用程序接口

Http Server 使用 Actix Framework 运行,并提供 JSON-RPC API 和 WebSocket。

JSON-RPC的

JSON-RPC 在您设置的 RPC 服务器地址(或默认地址)上的路由上可用。 有关更详细的 API,请参阅此处的 API 文档。/json_rpc

网络套接字

WebSocket 允许 JSON-RPC 调用和任何应用在守护程序上发生特定事件时收到通知。 它在同一 RPC 服务器地址上的路由上运行。/ws

在 WebSocket 连接中订阅已注册事件的示例:

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "subscribe",
    "params": {
        "notify": "new_block"
    }
}

您可以通知多个事件,只需对每个事件执行请求即可。 只要您不取消订阅或关闭 WebSocket,守护程序就会向您发送发生的所有事件。

取消订阅特定事件的示例:

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "unsubscribe",
    "params": {
        "notify": "new_block"
    }
}

守护 进程

可在守护程序 API 上订阅的事件包括:

  • block_ordered:当一个块被 DAG 排序时
  • stable_height_changed:更新稳定高度时
  • peer_connected:当新的对等节点连接到节点时
  • peer_disconnected:当对等方与我们断开连接时
  • peer_peer_list_updated:当对等节点的对等列表已更新时
  • peer_state_updated:当对等状态已更新时
  • peer_peer_disconnected:当一个普通的对等体与我们的一个对等体断开连接时
  • new_block:当链接受新区块时
  • transaction_added_in_mempool:在 mempool 中添加新的有效事务时
  • transaction_executed:当交易被包含在一个有效的区块中并在链上执行时
  • transaction_sc_result:当有效的 TX SC 调用哈希已由链执行时
  • new_asset:注册新资产时
  • block_ordered当块首次被排序或重新排序为新的拓扑高度时
  • block_orphaned当先前订购的块因未在 DAG 重组中选择而成为孤立块时。

钱包

可在钱包 API 上订阅的事件包括:

  • new_topoheight:当守护进程发送新的拓扑高度时
  • new_asset:当新资产被添加到钱包中时。
  • new_transaction:当新交易(coinbase、传出、传入)被添加到钱包历史记录中时。
  • balance_changed:检测到余额变化时。
  • rescan:当钱包发生重新扫描时。
  • online:当钱包网络状态现在在线时。
  • offline:当钱包网络状态现在处于离线状态时。

XSWD的

XSWD(XELIS Secure WebSocket DApp)协议是在唯一的端口和路径上启动的WebSocket,以便从dApp中轻松找到。 它的工作是提供一种易于访问和安全的方式,从桌面/CLI 钱包到任何 dApp(直接在软件或浏览器内/网站)进行通信。44325/xswd

它基于 JSON-RPC API,并具有完全相同的方法,以便于兼容,唯一的例外是验证方式。 在传统的 RPC 服务器上,如果启用了身份验证,则必须提供用户名/密码。

XSWD 保持打开状态,但请求用户执行手动操作以接受 XSWD 服务器上的 dApp 连接。 接受后,dApp 可以轻松请求 JSON-RPC 方法,用户可以为每个方法设置/配置权限。 如果未找到请求方法的权限,则会提示/要求用户进行手动验证。

XSWD 还能够直接向守护程序发送 JSON-RPC 请求。 为此,请在守护进程请求前面设置前缀,它不会被请求给用户,因为它是公共的链上数据。 对于钱包 RPC 方法,设置将请求/使用用户设置的权限的前缀。node.wallet.

DApp 还可以请求签名以在其一侧保留配置的权限,然后在用户稍后重新连接时提供它。ApplicationData

来自 dApp 的第一条 JSON 消息必须采用以下格式才能标识应用程序:

{
    "id": "0000006b2aec4651b82111816ed599d1b72176c425128c66b2ab945552437dc9",
    "name": "XELIS Example",
    "description": "Description example of up to 255 characters",
    "url": "https://xelis.io",
    "permissions": {}
}

如果您的 dApp 在之前的连接中请求了钱包的签名,您还可以添加字段并提供签名权限。signature

如果用户通过 XSWD 接受 dApp,您将收到以下响应:

{
    "id": null,
    "jsonrpc": "2.0",
    "result": true
}

否则,将发送如下错误,并且服务器将关闭连接:

{
    "error": {
        "code": -32603,
        "message": "Invalid JSON format for application data"
    },
    "id": null,
    "jsonrpc": "2.0"
}

如何构建

构建这个项目需要一个有效的 Rust(稳定)工具链。

它有望跨平台运行,并保证在 Linux、Windows、MacOS 平台上运行。

从子项目生成

转到要从源代码构建的以下文件夹之一:或 。 要构建发布(优化)版本,请执行以下操作:xelis_daemonxelis_minerxelis_walletcargo build --release

从工作区生成

若要直接从工作区(父文件夹)生成版本,请使用 with 或 as value 选项。 例:--binxelis_daemonxelis_minerxelis_walletcargo build --release --bin xelis_miner

您还可以构建调试版本(只需删除选项)或直接从 cargo 运行它:--releasecargo run

从 Docker 构建

若要使用 Docker 进行生成,请使用以下命令,使用 build 参数选择要生成的项目:appdocker build -t xelis-daemon:master --build-arg app=xelis_daemon .

资金

XELIS是一个社区驱动的项目,不受任何公司或组织的资助。 为了帮助 XELIS 的发展、成功并提供更好的支持,我们设定了开发费百分比,从区块奖励的 15% 开始。

当前的开发费用曲线如下:

  • 从区块 0 到 1 250 000 的 15%(预计时间为 ~6 个月,来自区块 DAG 的侧区块)
  • 从区块 1 250 001 到 3 000 000 的 10%(预计时间是另一个 ~6 个月,来自区块的侧块和网络增长)
  • 从 3 000 001 开始增加 5%,直到项目正在开发并稳定到足以减少它。
正文完
 0
pexpay
版权声明:本站原创文章,由 pexpay 于2024-04-22发表,共计9319字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)