37
孙凯Rust Substrate 框架 中的使用

Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

孙凯超

Rust 在 Substrate 开发框架

中的使用

Page 2: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

内容

● Rust 简介

● Rust 特性

● Why blockchain

● 什么是Substrate

● Substrate Runtime 组件

● Substrate 应用开发

Page 3: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Bugs from Chrome

Page 4: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Rust 简介

Performance Safety

C, C++ Java JS, Python

Page 5: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Rust 简介

Performance Safety

C, C++ Java JS, Python

Page 6: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Rust 简介

Performance Safety

C, C++ Java JS, Python

Page 7: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

A language empowering everyone to build reliable and efficient software.

● 2015年发布Rust 1.0● 内存安全、高效和并发

● 无GC● 支持函数式编程

● 强大友好的编译器

Rust 简介

Page 8: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Rust 的内存安全是由Ownership来保证

,在编译期间检查,规则:

● 每个值都有一个owner● 同一时间只有一个owner● 当owner离开作用域之后,值被丢

Rust 特性 - 内存安全

Page 9: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Rust 特性 - ownership

fn print_sum(v: Vec<i32>) { println!("{}", v[0] + v[1]);

}

fn main() { let mut v = Vec::new(); for i in 1..1000 { v.push(i); }

print_sum(v); println!("Compile error: {}", v);

}

Page 10: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Rust 特性 - ownership

fn print_sum(v: Vec<i32>) { println!("{}", v[0] + v[1]);

}

fn main() { let mut v = Vec::new(); for i in 1..1000 { v.push(i); }

print_sum(v); println!("Compile error: {}", v);

}

deallocation

create resource

move ownership

error!

Page 11: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Rust 特性 - copy

fn print_sum(a: i32, b: i32) { println!("{}", a + b); }

fn main() { let a = 35; let b = 42;

print_sum(a, b);

println!("We still have {} and {}", a, b);

}

Page 12: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Rust 特性 - copy

fn print_sum(a: i32, b: i32) { println!("{}", a + b); }

fn main() { let a = 35; let b = 42;

print_sum(a, b);

println!("We still have {} and {}", a, b);

}

deallocation

create resource

copied

no error

deallocation

Page 13: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Rust 特性 - borrow ownership

fn print_sum(v: &Vec<i32>) { println!("{}", v[0] + v[1]);

}

fn main() { let mut v = Vec::new(); for i in 1..1000 { v.push(i); }

print_sum(&v);

println!("We still have v: {}, {}, ...", v[0], v[1]); }

Page 14: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Rust 特性 - borrow ownership

fn print_sum(v: &Vec<i32>) { println!("{}", v[0] + v[1]);

}

fn main() { let mut v = Vec::new(); for i in 1..1000 { v.push(i); }

print_sum(&v);

println!("We still have v: {}, {}, ...", v[0], v[1]); }

drop reference

create resource

borrow v

no error

deallocation

Page 15: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Ownership 使并发变得简单:

● Message passing○ fn send<T: Send>(chan: &Channel<T>, t: T);

○ fn recv<T: Send>(chan: &Channel<T>) -> T;

● Lock○ fn mutex<T: Send>(t: T) -> Mutex<T>; // create

a new mutex

○ fn lock<T: Send>(mutex: &Mutex<T>) -> MutexGuard<T>; // acquire the lock

○ fn access<T: Send>(guard: &mut MutexGuard<T>) -> &mut T; // access the data protected by the lock

Rust 特性 - 并发

Page 16: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Why Rust:

● All the above features● WebAssembly

例子:

● Substrate● Libra

Rust in blockchain

Page 17: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Why blockchain?

Page 18: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

后端:

● 开发语言:Java, Ruby● 框架:Spring,Rails● 数据库:Postgres, MySQL● 自动化测试

● CI / CD● 部署云服务:AWS,阿里云

web 2.0 开发

前端:HTML, Javascript, CSS

● React● Vue● Angular

Page 19: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

中心应用的问题:

● 难以保证不作恶

● 用户隐私问题

● 代码安全

● 隐藏成本高

● 服务不可用

● ……

web 2.0

Page 20: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

中心应用的问题:

● 难以保证不作恶

● 用户隐私问题

● 代码安全

● 隐藏成本高

● 服务不可用

● ……

web 2.0 Vs web 3.0

去中心应用 – 解决方案

● 分叉、链上治理

● 用户拥有数据主权

● 开源可审查

● 分享权益

● 永不离线

● ……

Page 21: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

协议:

● IPFS● Matrix● BitTorrent

特点:

● DHT● 自驱动

● 数据存储、索引

Chain-less

Page 22: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

协议:

● IPFS● Matrix● BitTorrent

特点:

● DHT● 自驱动

● 数据存储、索引

Chain-less Vs blockchain

协议:

● Bitcoin● Ethereum● Polkadot

特点:

● 区块结构,链式存储

● 激励机制

● 数据交易

Page 23: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

特点:

● Gas 费用

● 沙盒环境

● 链上存储租赁

● 状态回滚

Smart contract

Page 24: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

smart contract 特点:

● Gas 费用

● 沙盒环境

● 链上存储租赁

● 状态回滚

Smart contract Vs application chain

app chain特点:

● Runtime 安全有开发者完全负责

● 获取链上所有状态

● 高度定制化,包括共识,通证,交易

方式

Page 25: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

一个开源、模块化、可扩展的区块链开

发框架,涵盖了区块链的核心组件:

● Database layer● P2P● PoS● Transaction pool● Full / light client● Runtime modules

Substrate简介

Page 26: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

libp2p

CONSENSUS

WEBASSEMBLY

smart contracts

staking slashing csprng

governance dao

parachains permissions

Rust

编译为Wasm

Wasm在链上存储

Rust

编译成本地可执行文件

RUNTIME

Page 27: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Substrate Runtime Module Library 提供一系列的即插即用的功能,如

资产管理、共识、合约、自治等。

你也可以开发自己的Runtime组件。

Substrate Runtime 组件

Substrate Runtime Module Library (SRML)

assets aura balances consensus

contract council democracy executive

treasury grandpa indices metadata

session staking sudo system

timestamp finality-grandpa and more ...

Page 28: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

应用场景

去中心化技术的特点包括,永不离

线、开源审查、数据加密、保护隐

私、分享权益等。

随着区块链技术的发展,交易成本、

确认时间、能源消耗、安全性、互通

性都有极大地提升。

国际支付金融交易

去中心自治组织

信息登记

存证

Page 29: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

应用链开发 - 房产登记交易平台

房主登记房产信息

房管局认证登记信息

房主出售房产

房管局授权交易

买房购买锁定房产

05

01

02 03

04

Page 30: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

pub struct Property<Hash> { id: Hash, size: u64, certificate_no: u64, is_authenticated: bool}

应用链开发 - 存储管理

Page 31: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

应用链开发 - 存储管理

decl_storage! { trait Store for Module<T: Trait> as RealEstateStorage { Nonce: u64; Properties get(property): map T::Hash => Property<T::Hash>; AllPropertiesArray: map u64 => T::Hash; PropertyOwner get(property_owner): map T::Hash => T::AccountId; Managers get(manager): map u64 => T::AccountId; ManagersIndex: map T::AccountId => u64; ManagerNonce: u64; …... }}

Page 32: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

pub fn record_property(origin, size: u64, certificate_no: u64) -> Result { let sender = ensure_signed(origin)?; let nonce = <Nonce<T>>::get(); let random_seed = <system::Module<T>>::random_seed(); let random_hash = (random_seed, &sender, nonce).using_encoded(<T as system::Trait>::Hashing::hash);

let property = Property { id: random_hash, size: size, certificate_no: certificate_no, is_authenticated: false }; <Properties<T>>::insert(random_hash, property); <AllPropertiesArray<T>>::insert(nonce, random_hash); <PropertyOwner<T>>::insert(random_hash, sender); <Nonce<T>>::mutate(|n| *n += 1); Ok(())}

应用链开发 - 功能函数

Page 33: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

decl_event!( pub enum Event<T> where <T as system::Trait>::AccountId, <T as system::Trait>::Hash, <T as balances::Trait>::Balance { Authenticated(AccountId, Hash, bool), …... });

应用链开发 - 事件定义和触发

pub fn authenticate(origin, property_id: T::Hash, is_authenticated: bool) -> Result { …... Self::deposit_event(RawEvent::Authenticated(sender, property_id, is_authenticated)); Ok(())}

Page 34: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

应用链开发 - 开发原则

● 安全检查优先

● 线下处理计算密集的任务

● 文件存储采用其它方案,如

IPFS

应用源码

:kaichaosun/substrate-real-estate-node

Page 36: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Help Contribute!

官方文档:substrate.dev知乎专栏:《Substrate区块链开发》

Page 37: Rust 在 Substrate 开发框架 中的使用bos.itdks.com/Substrate-Rust在区块链中的应用.pdf开发语言:Java, Ruby 框架:Spring,Rails 数据库:Postgres, MySQL

Questions?