超过270亿人民币的EOS未映射,你的EOS安全吗?

区块链安全公司PeckShield发布的报告显示EOSToken注册映射率不足四成。EOSToken于2017年发行,总量10亿枚,目前流通市值440亿人民币。投资者若计划长期持有,建议使用支持EOS映射的钱包如麦子钱包完成映射操作。本文详细介绍使用麦子钱包进行映射的具体步骤。

最近,区块链安全公司PeckShield发布了EOS Token的安全分析报告,报告发现EOS Token的注册映射率不足四成,这与EOS社区目前的火热局面和全球前五的虚拟货币市值存在差距。

EOS Token于2017年7月2日发布,总计发行量10亿枚,目前流通7.98亿枚,流通市值高达440亿人民币。

EOS 和以太坊一样都是区块链平台,但是EOS因为开发进度的问题需要在今年6月份才能上线主网。

你可以把现在手里的EOS Token看成是一个「假币」,并非血统纯正的EOS Token。

而映射就是把「假币」映射为真正的、主网的EOS Token。

但这个过程比较繁琐,即便有教程,普通人也需要一阵子才能弄懂。


上图中红色部分为未映射的EOS,截止4月1日,比例高达62%,如果以市值计算超过270亿人民币。目前还有大量的交易所地址是未进行映射的。

 

我投资了EOS Token,下一步该怎么办?

我们建议各位EOS Token的投资者,如果你准备在钱包内长期持有EOS Token,请使用支持EOS映射的EOS钱包来完成映射的操作。

这里给大家推荐一款目前市场上对EOS支持得最好的麦子钱包,因为它同时支持以太坊和EOS生态,所以在映射的流程、映射结果验证、私钥的保管上有很大的优势。

 

麦子钱包的EOS映射具体步骤如下:

1.    将EOS转入麦子钱包的以太坊钱包中。



2.    创建一个新的EOS钱包,并备份EOS私钥(重要:请务必备份并保护好私钥的安全)。



3.    切换到以太坊钱包的EOS界面,选择EOS Key,开始映射,并进行一笔0以太币的转账,将映射关系写入区块链。



4.    等该转账完成确认,映射结果会在界面上被明确的显示。



麦子钱包下载地址:http://www.medishares.org/wallet/cn/

 

<think> 我们正在讨论Mutter(GNOME桌面环境的窗口管理器)如何处理多显示器不同旋转方向的输入坐标映射。根据引用[1]中描述的X Window System事件处理流程,我们知道在传统X架构中,输入事件的处理涉及多个步骤,并且合成器(如Mutter)在获取事件时可能由于窗口变换(旋转、缩放等)而无法精确定位。但Wayland架构下,合成器(即Mutter)直接管理输入和输出,因此可以更高效地处理输入坐标变换。 在Mutter中,处理多显示器不同旋转方向的输入坐标映射主要涉及以下几个步骤: 1. **显示器配置(Monitor Configuration)**:每个显示器都有自己的几何属性(位置、分辨率、旋转方向等)。Mutter维护一个逻辑屏幕空间(logical screen space),所有显示器都放置在这个空间中。每个显示器的旋转方向(0°, 90°, 180°, 270°)会影响该显示器上的坐标系统。 2. **输入设备的坐标映射(Input Device Coordinate Mapping)**:当输入设备(如鼠标或触摸屏)产生一个事件时,该事件会携带设备相关的坐标(通常是相对于设备原点的位置)。Mutter需要将这个坐标映射到逻辑屏幕空间,然后根据显示器的旋转方向进行变换。 3. **坐标变换(Coordinate Transformation)**:对于每个显示器,根据其旋转方向,Mutter会应用一个变换矩阵(通常是一个旋转矩阵)来将输入设备的坐标转换为该显示器上的正确坐标。 具体实现方式如下: ### 1. **逻辑屏幕空间的建立** Mutter使用一个全局的坐标系统,称为逻辑屏幕空间(logical screen space)。每个显示器在这个空间中有一个位置(x, y)和尺寸(width, height),以及旋转方向(rotation)。旋转方向会影响坐标系统的方向。 ### 2. **输入事件的处理** 当输入设备产生一个事件(如鼠标移动)时,事件携带的坐标是相对于输入设备所在显示器的坐标(如果设备与特定显示器关联)或者是全局坐标(如触摸板)。Mutter首先将这个坐标转换为逻辑屏幕空间中的坐标。 ### 3. **旋转变换** 对于每个显示器,Mutter定义一个变换矩阵,该矩阵根据显示器的旋转方向来旋转坐标。例如: - 0°:单位矩阵 - 90°:顺时针旋转90°的矩阵 - 180°:旋转180°的矩阵 - 270°:顺时针旋转270°(或逆时针90°)的矩阵 假设一个显示器位于逻辑屏幕空间中的位置($x_0$, $y_0$),分辨率为$W \times H$,旋转角度为$\theta$(以弧度表示)。那么,对于该显示器上的一个点$(x_{local}, y_{local})$(相对于显示器左上角),其在逻辑屏幕空间中的坐标$(x_{global}, y_{global})$计算如下: 1. 首先,根据旋转角度,将局部坐标进行旋转: - 对于90°旋转($\theta = \pi/2$): $$ \begin{aligned} x_{rot} &= y_{local} \\ y_{rot} &= W - x_{local} \end{aligned} $$ - 对于180°旋转($\theta = \pi$): $$ \begin{aligned} x_{rot} &= W - x_{local} \\ y_{rot} &= H - y_{local} \end{aligned} $$ - 对于270°旋转($\theta = 3\pi/2$): $$ \begin{aligned} x_{rot} &= H - y_{local} \\ y_{rot} &= x_{local} \end{aligned} $$ - 0°旋转则不变。 2. 然后,加上显示器的全局位置: $$ \begin{aligned} x_{global} &= x_0 + x_{rot} \\ y_{global} &= y_0 + y_{rot} \end{aligned} $$ 但是,注意:在旋转过程中,显示器的有效尺寸可能会交换(如90°和270°旋转时,宽度和高度互换)。因此,在计算旋转后的坐标时,需要根据旋转角度调整参考尺寸。 ### 4. **Mutter中的具体实现** 在Mutter源码中,这些变换主要在`meta-monitor-manager`和`meta-crtc`(代表显示器的配置)以及处理输入事件的模块(如`clutter`后端)中实现。 - 显示器配置:在`meta-monitor-manager`中,每个显示器(`MetaMonitor`)的旋转信息被存储,并用于构建变换矩阵。 - 输入事件处理:在Clutter(Mutter使用的图形库)的输入处理部分,当事件到达时,会根据事件来源的显示器(如果有)应用相应的逆变换(因为事件坐标是设备坐标,需要转换为全局逻辑坐标,然后根据目标窗口所在的显示器再转换为该显示器的局部坐标)。 例如,在Mutter的Clutter后端中,可能会看到类似以下伪代码的处理: ```c // 当接收到一个输入事件(如鼠标事件) void handle_input_event(ClutterInputDevice *device, ClutterEvent *event) { // 获取事件在设备坐标系的坐标 float device_x = clutter_event_get_x(event); float device_y = clutter_event_get_y(event); // 获取事件关联的显示器(根据设备的位置或配置) MetaMonitor *monitor = get_associated_monitor(device); // 将设备坐标转换为该显示器的全局坐标(考虑旋转) float global_x, global_y; transform_device_coords_to_global(monitor, device_x, device_y, &global_x, &global_y); // 然后,根据全局坐标找到目标窗口,并转换为该窗口的局部坐标 // ... } // 转换函数 void transform_device_coords_to_global(MetaMonitor *monitor, float x_local, float y_local, float *x_global, float *y_global) { MetaRectangle rect; meta_monitor_get_geometry(monitor, &rect); float rotated_x, rotated_y; // 根据旋转方向变换坐标 switch (meta_monitor_get_rotation(monitor)) { case META_MONITOR_ROTATION_90: rotated_x = y_local; rotated_y = rect.width - x_local; break; case META_MONITOR_ROTATION_180: rotated_x = rect.width - x_local; rotated_y = rect.height - y_local; break; case META_MONITOR_ROTATION_270: rotated_x = rect.height - y_local; rotated_y = x_local; break; case META_MONITOR_ROTATION_0: default: rotated_x = x_local; rotated_y = y_local; } *x_global = rect.x + rotated_x; *y_global = rect.y + rotated_y; } ``` 注意:上面的代码是伪代码,实际实现可能更复杂,因为还要考虑缩放因子(scale factor)以及多个显示器的排列。 ### 5. **多显示器排列** 当多个显示器以不同旋转方向排列时,Mutter会确保逻辑屏幕空间的连续性。例如,一个显示器在另一个显示器的右边,即使右边的显示器被旋转了90°,它的坐标空间也会紧接着左边显示器的右边。 ### 6. **Wayland协议中的处理** 在Wayland协议中,输入事件由合成器(Mutter)直接发送给客户端(应用程序)。Mutter在发送事件前,会将事件坐标转换为目标窗口所在的坐标空间(考虑窗口所在的显示器的旋转、缩放以及窗口位置)。因此,客户端不需要知道物理显示器的旋转,它接收到的坐标已经是变换后的。 ### 总结 Mutter处理多显示器不同旋转方向的输入坐标映射的关键在于: 1. 为每个显示器维护一个变换(旋转、缩放)信息。 2. 将输入设备的坐标通过变换映射到全局逻辑屏幕空间。 3. 在全局坐标空间中确定事件的目标窗口,再将全局坐标转换到目标窗口的局部坐标(可能再次应用变换,比如窗口在旋转的显示器上)。 这种设计确保了无论显示器的物理方向如何,用户操作(如鼠标点击)都能正确地映射到应用程序窗口的相应位置。 ### 相关问题 1. Mutter如何检测并应用显示器的旋转变化? 2. 在Wayland协议下,输入事件的处理与X Window System有何本质区别? 3. 如何处理触摸屏在多显示器旋转环境下的坐标映射? 4. Mutter中如何实现高DPI显示器的坐标映射? [^1]: 引用[1]描述了X Window System的事件处理流程,有助于理解传统架构与Wayland架构的区别。 </think> ### Mutter处理多显示器不同旋转方向输入坐标映射的实现方式 Mutter(GNOME 桌面环境的窗口管理器)通过以下方式实现多显示器不同旋转方向的输入坐标映射: #### 1. **逻辑屏幕空间与物理显示器的解耦** Mutter 维护一个统一的**逻辑屏幕坐标系**($X_{\text{log}}, Y_{\text{log}}$),所有输入事件首先映射到此坐标系。该坐标系独立于物理显示器的旋转方向,为绝对坐标系统。例如: - 主显示器坐标范围:$[0,0]$ 到 $[W_1, H_1]$ - 副显示器坐标范围:$[W_1,0]$ 到 $[W_1+W_2, H_2]$ #### 2. **显示器旋转的矩阵变换** 每个物理显示器配置一个**仿射变换矩阵**,处理旋转和位置偏移: ```math \begin{bmatrix} X_{\text{physical}} \\ Y_{\text{physical}} \\ 1 \end{bmatrix} = T \times \begin{bmatrix} X_{\text{log}} \\ Y_{\text{log}} \\ 1 \end{bmatrix} ``` 其中变换矩阵 $T$ 包含: - **旋转分量**:根据显示器方向(0°、90°、180°、270°)使用旋转矩阵 - 90°旋转示例: $$ R_{90^\circ} = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} $$ - **平移分量**:包含显示器在逻辑空间中的偏移量 $(T_x, T_y)$ #### 3. **输入事件处理流程** 当输入事件发生时(如鼠标移动): 1. **原始坐标获取** 从输入设备(evdev)读取原始坐标 $(X_{\text{raw}}, Y_{\text{raw}})$ 2. **逻辑坐标映射** 通过线性映射转换为逻辑坐标: $$ X_{\text{log}} = S_x \cdot X_{\text{raw}} + O_x $$ $$ Y_{\text{log}} = S_y \cdot Y_{\text{raw}} + O_y $$ 其中 $S$ 是缩放因子,$O$ 是偏移量 3. **目标显示器判定** 根据 $(X_{\text{log}}, Y_{\text{log}})$ 确定事件所在的物理显示器 4. **逆变换应用** 使用目标显示器的**逆变换矩阵** $T^{-1}$ 计算物理坐标: $$ \begin{bmatrix} X_{\text{physical}} \\ Y_{\text{physical}} \\ 1 \end{bmatrix} = T^{-1} \times \begin{bmatrix} X_{\text{log}} \\ Y_{\text{log}} \\ 1 \end{bmatrix} $$ #### 4. **关键源码实现** 在 Mutter 源码中,核心实现位于: 1. **显示器配置管理** `src/backends/meta-monitor-manager.c`: ```c void meta_monitor_manager_apply_rotation (MetaMonitor *monitor, MetaRotation rotation) { // 计算旋转矩阵并更新CRTC配置 calculate_rotation_matrix(monitor, rotation); update_crtc_transform(monitor->crtc); } ``` 2. **输入事件变换** `src/core/events.c`: ```c static void transform_coordinates (MetaDisplay *display, double *x, double *y) { MetaMonitorManager *manager = meta_monitor_manager_get(); MetaLogicalMonitor *log_mon = find_logical_monitor(manager, *x, *y); // 应用逆变换 cairo_matrix_transform_point(&log_mon->transform, x, y); } ``` 3. **Wayland协议交互** 通过 `wl_pointer_send_motion()` 发送已变换的坐标到客户端: ```c wl_pointer_send_motion(resource, time, wl_fixed_from_double(x_physical), wl_fixed_from_double(y_physical)); ``` #### 5. **多显示器协同示例** 假设以下配置: - 显示器A:1920×1080 @ 0° - 显示器B:1080×1920 @ 90°(位于A右侧) ```math \begin{array}{c|c} \text{逻辑坐标} & \text{显示器B物理坐标} \\ \hline (1920, 0) & \rightarrow (0, 0) \\ (1920, 500) & \rightarrow (500, 0) \\ (3000, 500) & \rightarrow (500, 1080) \\ \end{array} ``` 转换公式: $$ X_{\text{physical}} = Y_{\text{log}} - 1920 $$ $$ Y_{\text{physical}} = 1920 - (X_{\text{log}} - 1920) $$ ### 相关问题 1. 当显示器使用非整数缩放时(如150%),Mutter如何调整坐标映射? 2. 在混合旋转方向的多显示器环境下,如何优化输入延迟? 3. Wayland协议如何处理触摸屏在多显示器旋转场景下的手势事件? 4. Mutter的坐标变换算法是否支持非正交旋转(如45°)? [^1]: 引用[1]描述了输入事件在传统X架构中的处理流程,突显了Wayland架构下合成器直接管理坐标映射的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值