
rust
文章平均质量分 81
跨链技术践行者
区块链研究员
展开
-
Rust-线程:使用Sync和Send trait的可扩展并发
Rust的并发模型中一个有趣的方面是:语言本身对并发知之甚少。我们之前讨论的几乎所有内容,都属于标准库,而不是语言本身的内容。由于不需要语言提供并发相关的基础设施,并发方案不受标准库或语言所限:我们可以编写自已的或使用别人编写的并发功能。然而有两个并发概念是内嵌于语言中的:std::marker 中的 Sync 和 Send trait。通过Send允许在线程间转移所有权Send标记trait表明类型的所有权可以在线程间传递。几乎所有的Rust类型都是Send的,不过有一些例外,包括Rc<转载 2022-03-25 16:24:50 · 641 阅读 · 0 评论 -
什么是联邦学习
联邦学习是一种带有隐私保护、安全加密技术的分布式机器学习框架,旨在让分散的各参与方在满足不向其他参与者披露隐私数据的前提下,协作进行机器学习的模型训练。经典联邦学习框架的训练过程可以简单概括为以下步骤: 协调方建立基本模型,并将模型的基本结构与参数告知各参与方; 各参与方利用本地数据进行模型训练,并将结果返回给协调方; 协调方汇总各参与方的模型,构建更精准的全局模型,以整体提升模型性能和效果。 联邦学习框架包含多方面的技术,比如传统机器学习的模型训练技术、协调方参数整合的算转载 2021-10-26 16:03:53 · 8263 阅读 · 0 评论 -
在 WSL 中学习 Rust ffi
最近从新学习 Rust FFI 的使用,但是手头上没有可用的 Linux 环境(Windows 编译c太麻烦了),于是就尝试着使用 WSL来搭建 Rust 环境和简易的 c 编译环境,并记录下中间遇到的一些坑。感谢 Unsafe Rust 群群友 @框框 对本文的首发赞助!感谢 Rust深水群 @栗子 的 gcc 指导!阅读须知阅读本文,你可以知道:一些配置 WSL 全局变量的技巧 快速配置 Rust 编译运行环境 简单的 gcc 编译技巧但是,本文不涉及:如何安装 WSL?转载 2021-09-13 16:25:00 · 216 阅读 · 0 评论 -
rust下根据protobuf的消息名创建对象实例
在C++里面, 我们可以根据一个消息的名称, 动态的创建一个实例 1 2 3 4 5 6 google::protobuf::Descriptor* desc = google::protobuf::DescriptorPool::generated_pool() ->FindMessageTypeByName("mypkg.MyType"); google::protobuf::M...转载 2021-09-11 18:16:09 · 368 阅读 · 0 评论 -
Tokio教程之桥接同步代码
桥接同步代码Tokio教程之桥接同步代码https://tokio.rs/tokio/tutorial/bridging在我们到目前为止看到的例子中,我们用#[tokio::main]标记了主函数,并使整个项目成为异步的。然而,这对所有项目来说都是不可取的。例如,一个GUI应用程序可能希望在主线程上运行GUI代码,并在另一个线程上运行Tokio运行时。本页解释了如何将异步/等待隔离到项目的一小部分。#[tokio::main]扩展到什么?#[tokio::main]宏是一个...转载 2021-08-23 16:49:06 · 724 阅读 · 0 评论 -
Tokio教程之stream
streamTokio教程之streamhttps://tokio.rs/tokio/tutorial/streams流是一个数值的异步系列。它是 Rust 的std::iter::Iterator的异步等价物,由 Stream 特性表示。流可以在 async 函数中被迭代。它们也可以使用适配器进行转换。Tokio在StreamExttrait上提供了许多常见的适配器。Tokio在一个单独的tokio-streamcrate 中提供流支持:tokio-stream = ...转载 2021-08-23 16:48:13 · 470 阅读 · 0 评论 -
Tokio教程之select
selectTokio教程之selecthttps://tokio.rs/tokio/tutorial/select到目前为止,当我们想给系统添加并发性时,我们会生成一个新的任务。现在我们将介绍一些额外的方法,用Tokio并发执行异步代码。tokio::select!tokio::select!宏允许在多个异步计算中等待,并在单个计算完成后返回。比如说:use tokio::sync::oneshot;#[tokio::main]async fn main() {.转载 2021-08-23 16:47:26 · 1234 阅读 · 1 评论 -
Tokio教程之深入异步
深入异步Tokio教程之深入异步https://tokio.rs/tokio/tutorial/async在这一点上,我们已经完成了对异步 Rust 和 Tokio 的相当全面的考察。现在我们将深入挖掘Rust的异步运行时模型。在教程的一开始,我们就暗示过,异步Rust采取了一种独特的方法。现在,我们解释一下这意味着什么。Futures作为快速回顾,让我们采取一个非常基本的异步函数。与本教程到目前为止所涉及的内容相比,这并不新鲜。use tokio::net::TcpStrea转载 2021-08-23 16:46:31 · 641 阅读 · 0 评论 -
Tokio教程之分帧
分帧Tokio教程之分帧https://tokio.rs/tokio/tutorial/framing我们现在将应用我们刚刚学到的关于I/O的知识,实现 Mini-Redis 的分帧层。成帧是将一个字节流转换为一个分帧流的过程。一个帧是两个对等体之间传输的数据单位。Redis协议的帧定义如下。use bytes::Bytes;enum Frame { Simple(String), Error(String), Integer(u64), Bulk(转载 2021-08-23 16:45:45 · 404 阅读 · 0 评论 -
Tokio教程之I/O
I/OTokio教程之I/Ohttps://tokio.rs/tokio/tutorial/ioTokio中的 I/O 操作方式与 std 中大致相同,但是是异步的。有一个特质用于读取(AsyncRead)和一个特质用于写入(AsyncWrite)。特定的类型根据情况实现这些特性(TcpStream、File、Stdout)。AsyncRead 和 AsyncWrite 也由一些数据结构实现,如Vec<u8>和&[u8]。这允许在期望有读写器的地方使用字节数组。...转载 2021-08-23 16:45:01 · 508 阅读 · 0 评论 -
Tokio教程之通道
通道Tokio教程之通道https://tokio.rs/tokio/tutorial/channels假设我们想运行两个并发的Redis命令。我们可以为每个命令生成一个任务。那么这两条命令就会同时发生。起初,我们可能会尝试类似的做法。use mini_redis::client;#[tokio::main]async fn main() { // Establish a connection to the server let mut client = cl转载 2021-08-23 16:44:17 · 718 阅读 · 0 评论 -
Tokio共享状态
Tokio教程之共享状态https://tokio.rs/tokio/tutorial/shared-state到目前为止,我们有一个键值服务器在工作。然而,有一个重大的缺陷:状态没有在不同的连接中共享。我们将在这篇文章中解决这个问题。策略在Tokio中,共享状态有几种不同的方式:用Mutex来保护共享状态。 生成一个任务来管理状态,并使用消息传递来操作它。一般来说,对于简单的数据使用第一种方法,而对于需要异步工作的东西使用第二种方法,比如I/O原语。在本章中,共享状态是一个Ha转载 2021-08-23 16:43:14 · 718 阅读 · 0 评论 -
spawning
Tokio教程之spawninghttps://tokio.rs/tokio/tutorial/spawning我们将换个角度,开始在Redis服务器上工作。接受套接字我们的Redis服务器需要做的第一件事是接受入站的TCP套接字。这是用tokio::net::TcpListener完成的。Tokio的许多类型与Rust标准库中的同步类型命名相同。在合理的情况下,Tokio暴露了与std相同的API,但使用了async fn。TcpListener被绑定到6379端口,然..转载 2021-08-23 16:42:12 · 322 阅读 · 0 评论 -
Hello Tokio
Tokio教程之Hello Tokiohttps://tokio.rs/tokio/tutorial/hello-tokio我们将通过编写一个非常基本的Tokio应用程序开始。它将连接到Mini-Redis服务器,将密钥hello的值设置为world。然后它将读回密钥。这将使用Mini-Redis客户端库来完成。代码use mini_redis::{client, Result};#[tokio::main]pub async fn main() -> Result<转载 2021-08-23 16:41:30 · 200 阅读 · 0 评论 -
TOKIO教程介绍
Tokio教程介绍https://tokio.rs/tokio/tutorial本教程将带领你一步一步地完成构建Redis客户端和服务器的过程。我们将从Rust的异步编程的基础知识开始,并在此基础上建立起来。我们将实现Redis命令的一个子集,但会对Tokio进行全面考察。Mini-Redis你将在本教程中构建的项目在 GitHub 上以 Mini-Redis 的形式提供。Mini-Redis是以学习Tokio为主要目的而设计的,因此注释得非常好,但这也意味着Mini-Redis缺少一些转载 2021-08-23 16:40:51 · 443 阅读 · 0 评论 -
select
selectTokio教程之selecthttps://tokio.rs/tokio/tutorial/select到目前为止,当我们想给系统添加并发性时,我们会生成一个新的任务。现在我们将介绍一些额外的方法,用Tokio并发执行异步代码。tokio::select!tokio::select!宏允许在多个异步计算中等待,并在单个计算完成后返回。比如说:use tokio::sync::oneshot;#[tokio::main]async fn main() {.转载 2021-08-23 16:39:35 · 174 阅读 · 0 评论 -
Rust多线程之数据共享
1. 怎么创建线程我们都知道Java中通过实现Runnable接口或继承Thread类,来完成一个线程的创建,那么在Rust中是如何实现一个线程的呢?代码如下。fn how_to_create_a_thread(){ // 创建一个线程 let thread_handle = thread::spawn(|| { println!("Thread inner"); }); // 阻塞线程,并等待其自己执行完毕 thread_handle.join(转载 2021-08-23 16:29:49 · 776 阅读 · 0 评论 -
使用 Tokio 实现 Actor 系统
本文将不使用任何 Actors 库(例如 Actix ) 而直接使用Tokio实现 Actors 系统。事实上这甚至是更容易的,但是还是有一些细节需要注意:tokio::spawn 的调用位置。 使用带有run方法的结构体还是裸函数。 Actor 的 Handle 函数。 背压( Backpressure ) 和 有界信道。 优雅的关闭。本文概述的技术适用于任何执行器,但为简单起见,我们仅讨论Tokio。与Tokio教程中的 spawning 和channel chapters章节有一些重.转载 2021-08-23 14:00:00 · 318 阅读 · 0 评论 -
Rust futures: async fn 中的 thread::sleep 和阻塞调用
原文:Rust futures: thread::sleep and blocking calls inside async fnURL: https://blog.hwc.io/posts/rust-futures-threadsleep-and-blocking-calls-inside-async-fn/近来,关于 Rust 的futures和async/await如何工作(“blockers”,哈哈),我看到存在一些普遍的误解。很多新用户为async/await带来的重大改进而感到兴.转载 2021-08-12 15:27:04 · 879 阅读 · 0 评论 -
Windows下使用GDB + VS Code调试Rust程序
在Windows下调试Rust程序,我就在这里写个简单的指南(以Rust 1.10为例)。本文参考Stackoverflowhttp://stackoverflow.com/questions/33570021/how-to-set-up-gdb-for-debugging-rust-programs-in-windowsRust目前支持使用LLDB和GDB调试(貌似LLVM工具链越来越受欢迎),可惜LLDB目前没有Windows版(后面会有的,耐心等待),所以在Windows下调试Rust程序,你需要转载 2021-08-03 21:54:30 · 1259 阅读 · 0 评论 -
Rust LLDB 调试入门指北
本文介绍工具 LLDB 的初步使用Rust 会使用 DWARF 格式在 binary 中嵌入调试信息,所以可以使用一些通用的调试工具,比如 GDB 和 LLDB。Rust 提供了rust-gdb和rust-lldb两个命令用于调试,其相比原生的gdb和lldb添加了一些方便调试的脚本下面来初步的了解rust-lldb的使用,rustup会安装rust-lldb,但不会安装lldb,需要自行安装LLDB 的命令结构如下<noun> <verb>...转载 2021-08-03 21:51:43 · 3148 阅读 · 0 评论 -
Deno通过V8和Rust的数据传递
题外话这几天终于能放下一些事情,回头来关注一下Deno,打开Deno目录,git pull一下,突然有点小惊喜,那一大坨C++ binding相关的东西被移除了,感觉整个Deno目录整洁了许多,再仔细瞧瞧,发现整个项目的目录重构后,也比原来理解起来也轻松多了。Rust中使用V8,避免不了使用C++,那么V8和C++那一部分到哪儿去了呢?答案是:denoland/rusty_v8github.com/denoland/rusty_v8打开rusty_v8的目录,可以熟悉的看到http转载 2021-08-03 14:41:38 · 321 阅读 · 0 评论 -
Clap - 强大的命令行参数解析+帮助说明生成库
CLI,cli,command-line,commandline,命令行命令行程序是工程师们最常用的程序形式之一,而编写一个方便使用的命令行程序最重要的就是参数的设置与易读的参数帮助说明。今天为大家搬运的就是专门处理命令性参数以及生成帮助说明的库。clap是一个易于使用、高效且功能齐全的库,用于在编写控制台/终端应用程序时解析命令行参数和子命令。关于clap用于解析并验证用户在运行命令行程序时提供的命令行参数字符串。 你所需要做的只是提供有效参数的列表,clap会自动处理其余的繁杂工作。 这转载 2021-08-03 14:30:10 · 1467 阅读 · 0 评论 -
微软的wasm 和 rust的wasm 方案对比
微软家的:blazor看图即可见原理。mono.wasm用来构造了一个dotnet解释器。在blazor被微软收购之前是用的dotnetanywhere,现在换成了mono然后,直接加载那些dll,执行正经的IL代码。这个方案,稳健,除了加载容量吓死人这个helloworld,肉眼可见的压缩后容量超过100K的文件就4个。开发工具 visual studio 2019开发语言 IL家族火狐家的rustwasm非常干净,代码直接被编译为wasm执行,没有依赖转载 2021-08-02 13:55:28 · 1139 阅读 · 0 评论 -
Rust学习 - Result/Option/unwrap/?
学习Rust时,注意到有4个概念经常放到一起讨论:Result、Option、unwapr和?操作符。 本文记录了我对这4个Rust概念的思考,这个思考过程帮助我理解并学会了如何写出更地道的Rust代码。1、Option - 可空变量虽然Rust中有null的概念,但是使用null并不是Rust中常见的模式。假设我们要 写一个函数,输入一种手机操作系统的名称,这个函数就会返回其应用商店的名称。 如果传入字符串iOS,该函数将返回App Store;如果传入字符串android,那么该函数将返回转载 2021-07-31 14:06:21 · 350 阅读 · 0 评论 -
理解Substrate数据存储的底层实现Merkle Patricia Trie
Merkle Tree介绍 Merkle Patricia Trie原理 Trie MPT Child Trie 区块裁剪 总结 引用 更多[TOC]通过本文,你会了解到:区块链应用为什么使用Merkle Tree的数据结构; Substrate采用的Patricia Merkle Trie的特点和应用。Merkle Tree介绍Merkle Tree是一种数据结构,用来验证计算机之间存储和传输数据的一致性,如果不使用这一数据结构,一致性的验证需要消耗大量的存储和转载 2021-07-31 10:59:48 · 449 阅读 · 0 评论 -
rust copy 和 clone 区别
Rust 中有两个常见的 trait,Clone 和 Copy,许多初学者没有搞明白。今天我们来专门谈一谈这两个 trait。Copy 的含义Copy 的全名是 std::marker::Copy。请大家注意 std::marker 这个模块里面的所有的 trait 都是特殊的 trait。目前稳定的有四个,它们是 Copy、Send、Sized、Sync。它们的特殊之处在于它们是跟编译器密切绑定的,impl 这些 trait 对编译器的行为有重要影响。在编译器眼里,它们与其它的 trait 不一样转载 2021-07-22 10:13:49 · 2049 阅读 · 0 评论 -
rust - 方法 `draw`存在,但在Vec <Box <dyn Trait >>中不满足以下特征范围,Compilernote应该满足吗?
This question already has an answer here:Trait implementation for both a trait object and for direct implementors of the trait(1个答案)3个月前关闭。PlaygroundMyCode使用另一个库'Their ...'-特别需要的是'TheirShadow'。我正在尝试从MyDrawing-Trait中执行功能“draw”,该功能已实现对于MyGraph-Str..转载 2021-07-16 14:19:33 · 322 阅读 · 0 评论 -
rust - 如何在Vec上更新或插入?
我正在用Rust编写数据结构。它包含键值对的Vec。当插入结构时,我需要找到一个匹配的键并同时更新键和值(实际上是一个子指针)。代码看起来像这样,其中pivots是ref mut的Vec<Pivot>,而Pivot只是具有两个字段的结构:match pivots.iter_mut().find(|ref p| key <= p.min_key) { // first mutable borrow Some(ref mut pivot) => { // I转载 2021-07-16 14:14:03 · 1021 阅读 · 0 评论 -
hashmap - 如何遍历Hashmap,打印键/值并删除Rust中的值?
在任何语言中,这都应该是一项微不足道的任务。这在铁锈中不起作用。use std::collections::HashMap;fn do_it(map: &mut HashMap<String, String>) { for (key, value) in map { println!("{} / {}", key, value); map.remove(key); }}fn main() {}以下是编译器错误:&转载 2021-07-16 14:10:39 · 2500 阅读 · 1 评论 -
iterator - 在&vec与vec.iter()之间进行反向迭代
编程风格指南概述本指南旨在约定 solidity 代码的编码规范。本指南是不断变化演进的,旧的、过时的编码规范会被淘汰, 而新的、有用的规范会被添加进来。许多项目会实施他们自己的编码风格指南。如遇冲突,应优先使用具体项目的风格指南。本风格指南中的结构和许多建议是取自 python 的pep8 style guide。本指南并不是以指导正确或最佳的 solidity 编码...原创 2019-05-08 13:18:50 · 12124 阅读 · 0 评论 -
LLVM:Rust、Clang等语言的强大支持以及编译原理和过程
本文档根据当前最新官方版本v0.5.8进行翻译,本翻译最初HiBlock社区发起,后经过深入浅出区块链社区社区成员根据最新版本补充翻译。本中文文档大部分情况下,英中直译,但有时为了更好的理解也会使用意译,如需转载请联系Tiny熊(微信:xlbxiong).Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javas...原创 2019-05-08 11:35:43 · 13759 阅读 · 1 评论 -
{转}学习LLVM
一、特殊的技术会对文明带来重大变革(一)文明是有记录的承载我们今天先回顾一下人类的文明史。众所周知,文明是由记录手段来承载的。最早的文字是篆刻在石板上,泥板上,龟甲上,以及金属上的。我们可以看到这种记载工具主要使用在奴隶社会。 在这之后广泛出现了可以书写的文字,文字书写在羊皮上,丝绸上和纸上。建立在书写文字上的文明,其传播水平相对于刻写的信息提高了一个效率档次。人类来到了封建社会。时间...原创 2021-07-02 15:15:26 · 7110 阅读 · 0 评论 -
llvm快速学习
摘要:前两篇文章都是来自某乎上妹子的回答,无论是从金融的角度还是技术的角度,感觉文风都是萌萌哒。这篇文章咱们将专注于技术角度,从现实的技术去分析区块链技术,相信你在读完本文以后将获取一些新的思路和想法!精彩不容错过!在前面的两篇文章里,咱们看到了知乎上的两位妹纸关于区块链的理解,一位从金融角度切入同时兼顾了技术概况,另一位呢则偏重于技术层面(一言不合就放代码)。通过两位妹子(萌萌哒)的叙述,...原创 2021-06-24 15:40:38 · 10938 阅读 · 0 评论 -
WebAssembly (WASM)智能合约
对中国农话网与交换机产业的一点看法中国农话的现状及发展趋势中国是一个农业大国,农村地域和农业人口占了总数的80%左右。这几年,随着国家经济的蓬勃发展,农村经济特别乡镇企业发展非常迅猛,从而促使农村电话的大发展,潜力很大。但也不能用资本主义国家的方法来测算。我国农村总体文化不发达,商品经济还未成熟,通信是要发展,不会这么快,这么急迫;现在的估计过大了一些,造成严重的供过于求。放号率不高,资金...原创 2021-07-02 14:05:17 · 11188 阅读 · 2 评论 -
EVM、Wasm虚拟机原理和设计思路
目前我们的形势和任务——任正非在1995年总结大会上的讲话 1995年12月26日【1987年到1995年,华为用了不到10年时间,员工人数从6人至1750人,销售收入从0到15亿元。任正非在这次讲话中首次提出末位淘汰的思想,每年保持5%的自然淘汰率和10%的合理流动率,以激发员工的积极性。】一、历史回顾十五年前,我们打开国门,实行开放改革。那时十亿中国人的心中装满的是世界上2/3...原创 2021-07-02 13:50:20 · 12332 阅读 · 1 评论 -
如何使用LLVM将C语言编译为WASM
不前进就免职──任正非在生产系统干部就职仪式上的讲话首先祝贺您们就任新职务。公司组织改造从市场部中层开始,已经延伸到生产系统。在华为大发展的历史时期,您们有机会负责一部分事情是无尚光荣的。公司号召为伟大祖国的繁荣昌盛、为中华民族的振兴、为自己与家人的幸福而努力奋斗。历史已经把我们推到了时代的前沿,您们要用自己的青春热血去实践,我相信您们会踏踏实实、一丝不苟地去做好自己管辖的事情。华为的...转载 2021-06-30 14:05:14 · 11810 阅读 · 1 评论 -
asynchronous - rust lazy_static和tokio::select中的tokio::sync::mpsc::channel
我最近开始用 rust 编码,我很喜欢它。我在一个要“包装” C-API的项目上编码。在一种情况下,我必须在Rust中定义C可以调用的回调。我让bindgen创建了回调。由于代码需要异步运行,因此我使用了tokio。我想要达成的目标我将主要功能创建为tokio::main。在主要功能中,我创建了2个异步任务,一个监听 channel ,另一个监听C-API中的消息队列。如果消息可用,我想通过回调函数上的 channel 发送消息,这样我就可以在任务中接收消息,而我正在监听事件。稍后,我想通过SSE或Gr原创 2021-06-04 15:07:45 · 661 阅读 · 0 评论 -
用Rust编写LLVM的玩具编译器
原文:A Toy Front-End for LLVM, written in Rust正文我目前的副业是用 Rust 编写一个可以将代码转换成 LLVM IR 的编译器。LLVM 的 API 对于新手来说有点令人生畏,而且没有很多有关的教程(有限的教程大多数还是基于 C++ 的,如何使用 Rust 做同样的事并不总是那么明确)。我希望当我准备做一件事情时,有人可以手把手的教我,这也是我要写这篇文章的原因。对于 Rust,与 LLVM 的接口交互的最佳选择是使用 llvm-sys。互联网.转载 2021-06-03 14:48:41 · 1256 阅读 · 2 评论 -
交叉编译和静态链接 RUST 库
在 CSIS 中,我们过去使用 Python 编写后端,同时为Incident Response Toolkit编写一些 C/C++ 代码。几年前,主要是由于性能原因,我们开始用 Rust 替换 Python 重写了一些特定的后端服务,并取得了巨大的成功。现在,为了便于开发和测试,我们正在探索将 C/C++ 代码库的某些部分也迁移到 Rust 的方法。为了做到这一点,我们决定尝试将Rust集成到现有的代码库中,而不是一次重写所有内容。下面是我们实验的摘要,以及编写一个Rust库并从 C/C+..转载 2021-05-18 10:27:57 · 593 阅读 · 0 评论