rust

值得关注的11个零知识证明开发包

只谈情不闲聊 提交于 2020-07-28 11:36:32
零知识证明是区块链开发者值得关注的密码学技术,本文整理了11个主流的零知识证明开发库,希望有助于你在自己的项目中学习并利用零知识证明技术。 用自己熟悉的语言学习以太坊DApp开发: Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart 1、libsnark libsnark是SCIPR Lab开发的zkSNARK方案实现,开发语言为C++,应用于zcash等多个项目。 libsnark主要包括三部分:通用证据系统、基础电路库和应用示例。 libsnark下载地址: https://github.com/scipr-lab/libsnark 3、ZoKrates ZoKrates是一个用于以太坊零知识证明应用开发的zkSNARK工具箱,利用ZokRates提供的插件,你可以直接在 Remix 中开发零知识证明应用。 ZoKrates的开发语言主要为Rust。 ZoKrates下载地址: https://github.com/Zokrates/ZoKrates 3、snarkjs snarkjs是zkSARNK方案的javascript实现库,支持原始的8points协议和 Groth协议。利用snarkjs你可以进行可信设置、生成证据并验证证据。

Rust异步浅谈

怎甘沉沦 提交于 2020-07-28 11:26:33
https://rustcc.cn/article?id=e6d50145-4bc2-4f1e-84da-c39c8217640b 前提   这篇文章主要描述了Rust中异步的原理与相关的实现,Rust异步也是在最近的版本(1.39)中才稳定下来。希望可以通过这边文章在提高自己认知的情况下,也可以给读者带来一些解惑。( 来自于本人被Rust异步毒打的一些经验之谈 ).   阅读这篇文章需要对操作系统,IO多路复用,以及一些数据结构有一定的概念。   老生常谈,几乎所有的语言中异步相关的解释都是统一的: 线程切换开销大,且资源浪费(主要集中在内存上) ,这篇文章假定读者已对这些情况已知晓。 Future    Future 字面的意思就是未来发生的事情,在程序中则代表了一系列暂时没有结果的运算子, Future 需要程序主动去 poll (轮询)才能获取到最终的结果,每一次轮询的结果可能是 Ready 或者 Pending 。   当 Ready 的时候,证明当前 Future 已完成,代码逻辑可以向下执行;当 Pending 的时候,代表当前 Future 并未执行完成,代码不能向下执行,看到这里就要问了,那什么时候才能向下执行呢,这里的关键在于 Runtime 中的 Executor 需要不停的去执行 Future 的 poll 操作,直至 Future 返回 Ready

Python 为什么没有 main 函数?为什么我不推荐写 main 函数?

扶醉桌前 提交于 2020-07-28 08:59:38
毫无疑问 Python 中没有所谓的 main 入口函数,但是网上经常看到一些文章提“Python 的 main 函数”、“建议写 main 函数”…… 有些人是知情的,他的意图可能是模仿那些正宗的 main 函数,但还有不少人明显是被误导了(或自己误解了),就写出来很累赘的代码。 本期“Python 为什么”栏目来聊聊 Python 为什么没有 main 函数? 在开始正题之前,先要来回答这两个问题: 所谓的 “main 函数”是指什么?为什么有些编程语言需要强制写一个 main 函数? 某些编程语言以 main 函数作为程序的执行入口,例如 C/C++、C#、 Java、Go 和 Rust 等,它们具有特定的含义: main 函数名是强制的,也就是要求必须有一个 main 函数 main 函数最多只能有一个,也就是说程序的入口是唯一的 语法格式有一定的要求,具有相对固定的模板 为什么要强制一个 main 入口函数呢? 这些语言是编译型语言,需要把代码编译成可执行的二进制文件,为了让操作系统/启动器找到程序的起点,所以要约定这一个函数。简单地说,就是在一大堆代码里,需要定义一个显著的可用于执行的开头。 不难看出,main 函数是那些语言中重要而不可缺的有机组成部分。 然而,我们再来看看 Python,情况就大不相同了。 Python 是解释型语言,即脚本语言,运行过程是从上往下

Rust 裸指针操作范例。

删除回忆录丶 提交于 2020-07-28 04:22:12
内存分布和 C 基本一致,不过还没有找到如何打印变量本身在栈中的位置的方法,也许它已经被完全编译器优化为偏移量了,没有深入研究。 &stu1 的值是结构体的首地址,第一个 String 占用了 0x18 个字节的大小。 以下代码用来通过指针偏移量打印 Student.age 的值。 struct Student { name: String, age: i32, } fn main() { let stu1 = Student{name:"1234".into(), age:123}; println!("raw points at {:p}", &stu1); // raw points at 0x7ffeef327268 + 0x18 println!("raw points at {:p}", &stu1.age); // raw points at 0x7ffeef327280 let praw = ((&stu1 as *const Student) as usize + 0x18usize) as *const i32; // i32 i64 u64 usize 都没问题 let raw = unsafe { *praw }; println!("{:p}", praw); println!("{}", raw); } 结果: raw points at

How to create a dedicated threadpool for CPU-intensive work in Tokio?

馋奶兔 提交于 2020-07-28 04:20:09
问题 I have a Rust async server based on the Tokio runtime. It has to process a mix of latency-sensitive I/O-bound requests, and heavy CPU-bound requests. I don't want to let the CPU-bound tasks monopolize the Tokio runtime and starve the I/O bound tasks, so I'd like to offload the CPU-bound tasks to a dedicated, isolated threadpool (isolation is the key here, so spawn_blocking / block_in_place on one shared threadpool are insufficient). How can I create such a threadpool in Tokio? A naive

How to create a dedicated threadpool for CPU-intensive work in Tokio?

蓝咒 提交于 2020-07-28 04:20:09
问题 I have a Rust async server based on the Tokio runtime. It has to process a mix of latency-sensitive I/O-bound requests, and heavy CPU-bound requests. I don't want to let the CPU-bound tasks monopolize the Tokio runtime and starve the I/O bound tasks, so I'd like to offload the CPU-bound tasks to a dedicated, isolated threadpool (isolation is the key here, so spawn_blocking / block_in_place on one shared threadpool are insufficient). How can I create such a threadpool in Tokio? A naive

Rust源码分析:channel内部mpsc队列

爷,独闯天下 提交于 2020-07-27 23:10:13
https://zhuanlan.zhihu.com/p/50176724 接着前面的 channel的升级 继续讲。 首先,之前的upgrade过程中内存的回收要稍微注意下。因为Receiver现在指向shared::Packet之后,那个new_port需要被析构,也就是调用drop函数,我们看下drop的实现: impl < T > Drop for Receiver < T > { fn drop ( & mut self ) { match * unsafe { self . inner () } { Flavor:: Oneshot ( ref p ) => p . drop_port (), Flavor:: Stream ( ref p ) => p . drop_port (), Flavor:: Shared ( ref p ) => p . drop_port (), Flavor:: Sync ( ref p ) => p . drop_port (), } } } 由于之前的swap操作,走Flavor::Oneshot路径: pub fn drop_port ( & self ) { match self . state . swap ( DISCONNECTED , Ordering:: SeqCst ) { // An empty channel

TechEmpower Web 框架性能第19轮测试结果正式发布,ASP.NET Core在主流框架中拔得头筹

醉酒当歌 提交于 2020-07-27 22:00:44
TechEmpower 第19轮编程语言框架性能排行榜2020年5月28日正式发布,详见官方博客: https://www.techempower.com/blog/2020/05/28/framework-benchmarks-round-19/ ,TechEmpower基准测试有许多场景(也称为测试类型),此次评测多了一个综合评分选项,把拥有完整测试覆盖的框架现在将具有综合 分数 ,这反映了测试项目类型的总体性能得分:JSON serialization, Single-query, Multi-query, Updates, Fortunes 和 Plaintext. 。对于每一轮,我们使每个测试类型的结果规范化,然后为每个测试类型应用主观权重(例如,Fortunes的权重比 Plaintext 高,因为Fortunes 是一种更现实的测试类型)。asp.net core排第6名,asp.net 排名倒数第二,第103名, 微软从倒数一路追赶到第一。 表上前缀T标签表示精选的主流编程语言 第1名 C++的drogon 9676分 第2名 Rust的actix 9064分 第6名 C#的ASP.NET Core 5659分 第29名 Go的Chi 2229分 第34名 Java的Spring 1867分 第73名 Nodejs的Express 821分 第94名

Rust源码分析:channel&apos;s upgrade

谁说我不能喝 提交于 2020-07-27 21:56:58
https://zhuanlan.zhihu.com/p/50101525 std::sync::mpsc::channel 本文分析Rust标准库中的channel,channel(通道)作为线程间通信的一种方式被广泛使用。 Rust提供了多生产者单消费者的channel。我们重点关注多个生产者的情况。 它的实现方式非常有趣。我把它分为通道升级跟并发队列两部分。 本文描述通道升级 对于一个channel()调用,我们得到的(sender, receiver)是oneshot的,这一点从源码可以得到暗示: #[stable(feature = "rust1" , since = "1.0.0" )] pub fn channel < T > () -> ( Sender < T > , Receiver < T > ) { let a = Arc:: new ( oneshot:: Packet:: new ()); ( Sender:: new ( Flavor:: Oneshot ( a . clone ())), Receiver:: new ( Flavor:: Oneshot ( a ))) } 这里至少有四个结构: oneshot::Packet:Packet,真正存放数据的地方。此处是单个数据(其他类型可能使用队列) Flavor::Oneshot。 Sender

一个茴字有三种写法——吐槽C#9.0的Records

北慕城南 提交于 2020-07-27 14:44:29
最近是微软开了Build 2020大会,由于疫情原因,改成了在线举行,Build大会上,C#公布9.0版本。 我个人对于C#的更新向来都是喜闻乐见,乐于接受的,对于博客园上某些人天天嘲讽C#只会增加语法糖的人,我向来对他们不屑一顾,认为他们是井底之蛙。 因此我仔细看了微软发的文章 Welcome to C# 9.0 ,准备好好观摩和学习。但当我看到Records语法时,我就隐隐感觉C#这样玩语法糖要翻车了。 后来看到知乎上的问题 如何评价即将发布的 C# 9.0? ,我稍加思索,愈发觉得Records语法完全是大型翻车现场,因此整理出来我认为的Records的翻车点(兼吐槽)。 首先看官方给出的Records样例 public data class Person { public string FirstName { get; init; } public string LastName { get; init; } } 第一个吐槽点: data class 声明有必要吗?如果要多加一个 data 关键字,直接用 record 不好吗,如果不加关键字,为什么不用 readonly class 啊。 public record Person {} public readonly class Person {} 第二个吐槽点,官方给出上面的等价定义 public data class