开发者入门
手把手带你拆解密码学与智能合约的底层逻辑,完成从“看不懂区块浏览器”到“能独立部署主网 DApp”的跨越,用中文把区块链写进未来。
41个主题在此版面
-
通过Cargo管理工程cargo作为rust的工程管理工具。类似go语言的gomod。其主要通过 Cargo.toml作为配置文件, 配合cargo 二进制工具来管理依赖。 cargo在通过rustup安装rust的过程中已经安装好了。Cargo.toml在通过cargo new 创建工程的时候,自动生成。 在构建的时候,cargo 会根据Cargo.toml中的依赖,自动拉取依赖的代码,并将相应的版本信息,资源签名,记录在 Cargo.lock文件中,该文件类似go.sum文件,记录了各个依赖的meta信息。 cargo命令创建工程首先通过cargo命令,可以创建工程。创建的工程分成两类,一类是库,一类是二进制可执行程序。 通过cargo new project_name 命令可以创建project_name的工程。默认工程是一个可执行程序。 通过指定--lib可以指定其为库项目。一个工程,只能包含一个库目标,但是可以包含多个二进制程序。 添加依赖当需要依赖外部库的时候,首先要将其加入到工程中: Copycargo add [options] crate… cargo add [options] --path path cargo add [options] --git url [crate…]三种不同的参数,可以针对三种情况的依赖。 直接跟库名,会去cargo.io上索引,找到最新的版本 --path指定库在本地的路径,可以对本地目录进行依赖 --git 则指定的git仓库的路径,比如是私有的git仓库 通过 carg…
-
- 0 篇回复
- 16 次查看
-
-
Rust基本语法变量和类型基本数据类型基本数据类型主要有整形、浮点、布尔以及字符类型。 整形按照所占空间大小被分为1、2、4、8、16 字节大小的整数。每个大小又有有符号和无符号的差别。 具体的定义如下: Length Signed Unsigned 8-bit i8 u8 16-bit i16 u16 32-bit i32 u32 64-bit i64 u64 128-bit i128 u128 arch isize usize 而浮点型包括f32和f64两个分别使用4字节和8字节的IEEE-754 浮点格式的浮点数。 布尔类型和其他语言的布尔类型类似,用true和false来表示。 字符类型是用''单引号括起来的字符。rust天生支持utf-8,所以任何单引号括起来的utf-8字符都是合法的字符类型变量。 复合类型复合类型是基本类型和复合类型的组合,典型的有 元组: Copylet tup: (i32, f64, u8) = (500, 6.4, 1);单纯的把几个类型放在一起。访问的时候通过下标索引来访问 比如 这里的500:tup.0 数组: Copylet arr = [1, 2, 3, 4, 5];和元组不通的是,这里每个元素的类型必须是同样的。访问的时候,下标用中括号表示: arr[0] Copystruct: struct User { active: bool, username: String, email: String, sign_in_co…
-
- 0 篇回复
- 17 次查看
-
-
HelloWorldRust没隔6个星期,就会发布一个小版本。在Rust历史中又有三个大版本的差别。这里不是传统的x.y.z里面的版本号。 Rust以3年为一个界限,发布一个大版本,新特性可能不兼容之前版本。每个版本叫做一个edition。有点类似C98/C11/C14/C17 的感觉。目前Rust主要有2015/2018/2021三个Edition。 Rust环境安装通过rustup工具,可以帮助我们一键安装rust开发环境: Copycurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh Current installation options: default host triple: x86_64-apple-darwin default toolchain: stable (default) profile: default modify PATH variable: yes 1) Proceed with installation (default) 2) Customize installation 3) Cancel installation 直接Enter采用默认方式 Rust is installed now. Great! To get started you may need to restart your cur…
-
- 0 篇回复
- 18 次查看
-
-
课后练习实现一个 DApp 页面,实现代币创建,并按白名单发送空投 思路创建代币首先要构造一个 MintAccount: CopymintKeypair = Keypair.generate();然后创建一个创建这个 MintAccount 的指令,我们借助系统指令库 CopySystemProgram.createAccount({ fromPubkey: publicKey, newAccountPubkey: mintKeypair.publicKey, space: MINT_SIZE, lamports:lamports, programId: TOKEN_PROGRAM_ID, }),这里 from 是付费人,new 是要创建的地址,space 是 data 的大小,因为我们要放 MintAccount 其为 spl-token 库里的定义 lamports 我们通过 库提供的const lamports = await getMinimumBalanceForRentExemptMint(connection);来获得一个 Account 对应这个大小的存储空间的最小的 rent 花费。 接着创建 创建 token 的指令: CopycreateInitializeMint2Instruction(mintKeypair.publicKey, 9, publicKey, publicK…
-
- 0 篇回复
- 15 次查看
-
-
合约调用在前面的例子中,我们通过 web3.js 提供的 SystemProgram 来帮助我们实现了转账的功能。 但是对于一个陌生的合约,我们要怎么来发起调用请求呢? 合约的入口这里我们以 SPL Token 合约来举例。SPL Token 合约类似 web3.js 一样,其实已经封装好了一套 JS 库给我们来直接使用。这里我们不使用库,而以一个前端的身份,来看这样的一个合约,我们要怎么来交互。 我们以 transfer 函数作为例子。 首先要理解合约的作用和参数,这个可以跟合约开发去沟通。比如我们从注释了解到 transfer 为 Copy/// Transfers tokens from one account to another either directly or via a /// delegate. If this account is associated with the native mint then equal /// amounts of SOL and Tokens will be transferred to the destination /// account. /// /// Accounts expected by this instruction: /// /// * Single owner/delegate /// 0. `[writable]` The source account. /// 1. `[wr…
-
- 0 篇回复
- 15 次查看
-
-
通过 WalletAdatper 与钱包交互为了给 DApp 提供一套统一的兼容钱包的接口。Solana 设计了一套 Wallet Adapter。 Solana 要求,钱包方需要按照该套接口设计,提供实现。这样 DApp 使用方,只需要按照一套接口,就可以轻松支持多个钱包。接口包含了 网络选择 账号选择 账号签名 等 除了统一的接口,Adapter 还设计了一套基础 UI,其包括了弹出钱包的选择列表,以及链接钱包后的的账号地址显示。 安装在你的工程总安装 Wallet_Adapter 依赖: Copynpm install --save \ @solana/wallet-adapter-base \ @solana/wallet-adapter-react \ @solana/wallet-adapter-react-ui \ @solana/wallet-adapter-wallets \ @solana/web3.js这里我们还会用到一些 web3.js 里面的变量,所以也将其 install 上。 在使用地方先 import 相关 SDK Copyimport { ConnectionProvider, WalletProvider } from '@solana/wallet-adapter-react'; import { WalletAdapterNetwork } from '@solana/wallet-adapter-base'; import { …
-
- 0 篇回复
- 12 次查看
-
-
Web3.js如果之前接触过 ETH,一定知道 ETH 的web3.js ,主要提供了通过 JavaScript 与 ETH 上合约进行交互。而 Solana 也提供了与 Solana 的 JSON RPC 接口交互的solana-web3.js 。通过这个库,可以实现在 dapp 中用 JavaScritp 和 Solana 上的智能合约进行交互。 Web3.js 库主要分为三部分 RPC 访问 keypair 管理 交易发送 Demo首先来看一个 Demo,在 Demo 中,首先导入私钥,然后可以查询该账号的余额。然后执行转账,转账后再可以查询余额来进行结果判断。 这里我们是以开发网为开发环境,所以相应的数据都在开发网上。 安装solana/web3.js 提供了 npm 包和 yarn 包的选择,使用 yarn 的话,可以在工程中用 Copyyarn add @solana/web3.js进行引用,如果使用的 npm 的话,使用: Copynpm install --save @solana/web3.js如果想在自己已有的没有使用包管理的项目中使用,可以先 checkout 出 solana/web3.js 的代码,然后 checkout 到最新的分支上,执行: Copycd your_solana_web3js_directory git clone https://github.com/solana-labs/solana-web3.js.git git checkout v1.78.0 yarn in…
-
- 0 篇回复
- 16 次查看
-
-
课后练习通过curl和wscat命令行来模拟一个监视钱包动作 提示: 创建一个新账号 实时展示余额变化 列出已知SPL-Token的余额 实时展示SPL-Token余额变化 创建账号我们复用前面的账号 SOL账号: Czorr4y9oFvE3VdfCLVFuKDYxaNUG1iyQomR7kMZUuzi SPL-Token(Mint Account): 7vtXvye2ECB1T5Se8E1KebNfmV7t4VkaULDjf2v1xpA9 Token Account: EZhhUANUMKsRhRMArczio1kLc9axefTUAh5xofGX35AK 订阅SOL余额变化这个其实已经在课上演示过了。详情可以查看视频录像以及教程中的"订阅Account变化"章节 展示SPL-Token变化早期的钱包是通过官方的 token-list 来获得 已知的SPL-Token,现在则通过Metaplex的FT标准查询。除此之外还可以通过订阅Token合约管理的账户变化 来判断是否有Owner为自己的 Token Account被创建。 这里我们假设第一种情况,钱包只维护知名token或者用户自己添加的Token,比如上面的 "7vtXvye2ECB1T5Se8E1KebNfmV7t4VkaULDjf2v1xpA9" 我们首先获取这个SPL-Token下我们有多少 Token Account: Copycurl https://api.devnet.solana.com -X POST -H "Content-Type: application…
-
- 0 篇回复
- 16 次查看
-
-
接口RPC节点相关接口获取集群节点信息通过getClusterNodes方法可以获得当前网络内,集群节点的相关信息,比如验证者的key,节点IP,节点版本等。 Copycurl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d ' { "jsonrpc": "2.0", "id": 1, "method": "getClusterNodes" } '得到的输出类似这样: Copy{ "jsonrpc": "2.0", "result": [ { "featureSet": 2891131721, "gossip": "67.209.54.46:8001", "pubkey": "8pgVP32abaxodvpJx3iXo4o9FUWzarudQ7RHZAkkqEKi", "pubsub": null, "rpc": null, "shredVersion": 28353, "tpu": "67.209.54.46:8004", "tpuQuic": "67.209.54.46:8010", "version": "…
-
- 0 篇回复
- 19 次查看
-
-
RPC 介绍RPC 是什么? 写代码的应该都知道 RPC 是啥,但是 RPC 跟区块链是什么关系呢? 引用 Polkadot 的一个架构图: RPC 作为区块链系统与外界交互的一层接口调用。被普通用户直接使用。 但是为什么普通用户又感知不到 RPC 的存在呢?普通用户只知道钱包,拉起、确定=》 币没了。 这里是因为我们这帮程序员,帮忙将中间的过程都通过代码来串联起来了。所以 RPC 又是用户界面和区块链之间的桥梁。 Solana 提供的 RPC 分为主动请求的 HTTP 接口和消息推送的 Websocket 接口。只是单次查询一般使用 HTTP 接口,如发送交易,查询用户余额。而对于链上数据的监控则通过 Websocket 接口,如监控合约执行的日志。 HTTP 接口HTTP 接口是通过 JSON RPC 的格式对外提供服务,JSON RPC 是一种以 JSSON 作为序列化工具,HTTP 作为传输协议的 RPC 模式,其有多个版本,当前使用的是 v2 版本。 其请求格式为: Copy{ "jsonrpc": "2.0", "id": 1, "method": "getBalance", "params": [ "83astBRguLMdt2h5U1Tpdq5tjFoJ6noeGwaY3mDLVcri" ] }这里最外层是一个字典,其中各个 Key 是固定的,其中 method 表示 RPC 的函数方法名。params 表示…
-
- 0 篇回复
- 15 次查看
-
-
课后练习通过命令行,发行一个代币。并给自己账号mint一定数量的代币。 并通过插件钱包或者命令行的方式给其他同学空投该代币 提示: 命令行操作,查看spl-token命令的帮助文档 Copysolana config set --url https://api.devnet.solana.com示例设置环境为开发环境: 创建账号: Copysolana-keygen new --force Generating a new keypair For added security, enter a BIP39 passphrase NOTE! This passphrase improves security of the recovery seed phrase NOT the keypair file itself, which is stored as insecure plain text BIP39 Passphrase (empty for none): Wrote new keypair to /Users/you/.config/solana/id.json =========================================================================== pubkey: Czorr4y9oFvE3VdfCLVFuKDYxaNUG1iyQomR7kMZUuzi ======================================================…
-
- 0 篇回复
- 21 次查看
-
-
钱包使用Solana的钱包目前以Phantom、Solfare等Chrome插件为主, 类似TokenPocket、MathWallet等手机钱包为辅。甚至还有Solana Saga手机设备作为钱包。 比如打开raydium的链接钱包界面,我们可以看到这么多钱包: 五花八门,实在是太多了。这里我们抽选Phantom来举例使用。 安装这里我们以Phantom的Chrome插件为例,来演示其基本操作。当然Phantom还有Firefox、手机 等版本。其操作类似。 首先在Chrome中打开: https://chrome.google.com/webstore/detail/phantom/bfnaelmomeimhlpmgjnjophhpkkoljpa 点击"添加至Chrome" 创建/导入账号如果没有账号可以在扩展打开的时候,选择创建账号,创建账号的时候,需要记住这里的助记词,并设置一个 密码,就可以创建新账号了。 这里的助记词和我们的命令行工具的助记词是一样的。因此我们还可以选择导入账号,输入我们的已有的助记词, 并设置好密码。 同时我们还可以选择不同的网络环境,这里我们选择开发网,就可以看到我们前面领的水龙头代币了。 转账转账分为转移SOL代币和普通的SPL-Token代币,在很久以前,这里需要注意对方账户地址, 普通用户的SOL账号地址,和SPL-Token地址不一样,现在因为有了ATA账号的存在,可以直接通过 SOL账号地址进行推导,所以只需要知道对方的钱包地址也就是公钥就可以了。 在应用中打开钱包在DApp应用中,…
-
- 0 篇回复
- 21 次查看
-
-
Solana命令行接下来我们来开始体验Solana,Solana为我们提供了一套命令行工具来实现对Solana的操作。 这里注意,这个命令行工具,是除了节点外,官方提供的唯一工具。什么钱包,scan浏览器等还 都是第三方的,所以我们从这里开始。 这里建议开发工具平台使用Mac/Linux(Ubuntu),Windows不建议折腾,虽然Solana也是支持 的,下面我们以Mac作为演示平台进行讲演。 安装打开命令行,输入: Copysh -c "$(curl -sSfL https://release.solana.com/stable/install)" downloading stable installer stable commit cd1c6d0 initialized Adding export PATH="/Users/you/.local/share/solana/install/active_release/bin:$PATH" to /Users/you/.profile Close and reopen your terminal to apply the PATH changes or run the following in your existing shell: export PATH="/Users/you/.local/share/solana/install/active_release/bin:$PATH"这里需要科学上网,大家自行处理。 按照提示设置好…
-
- 0 篇回复
- 15 次查看
-
-
SPL 代币在以太坊中,普通代币被一个叫ERC20的提案定了规范,可以认为普通代币合约统一叫做ERC20代币。 那么Solana世界里的ERC20代币是什么呢?答案就是SPL代币。 SPL Token是 " Solana Program Library"中的一个组成部分,叫做"Token Program",简称为SPL Token。 所有的代币都有这个合约来管理,该合约代码在 https://github.com/solana-labs/solana-program-library/tree/master/token 代币信息不同于以太坊中,一个代币就是一个合约。 SPL Token中,一个代币,仅仅是一个归Token合约管理的普通的Account对象,这个对象里面的二进制数据定义了 这个代币的基本属性。其结构为: Copypub struct Mint { /// Optional authority used to mint new tokens. The mint authority may only be provided during /// mint creation. If no mint authority is present then the mint has a fixed supply and no /// further tokens may be minted. pub mint_authority: COption<Pubkey>,…
-
- 0 篇回复
- 17 次查看
-
-
Solana核心概念Account在Solana中,"Everythin is an Account" 类似Linux世界里面把所有的资源都抽象成"文件"一样。 Solana作为一个分布式区块链系统,所有的信息都存储在Account对象中,如合约(Solana叫Onchain Program), 账号信息,合约中存储的内容等都是存储在一个个Account对象中。 Account的定义如下: Copypub struct Account { /// lamports in the account pub lamports: u64, /// data held in this account #[serde(with = "serde_bytes")] pub data: Vec<u8>, /// the program that owns this account. If executable, the program that loads this account. pub owner: Pubkey, /// this account's data contains a loaded program (and is now read-only) pub executable: bool, /// the epoch at which this account wil…
-
- 0 篇回复
- 20 次查看
-
-
Solana介绍一句话概括 一张图表示 曾经也是辉煌夺目 Solana历史2017年11月,Anatoly Yakovenko发表了一篇白皮书,介绍了“Proof of History”这一技术,用于在不信任彼此的计算机之间进行时间同步。根据Anatoly在高通、Mesosphere和Dropbox设计分布式系统的经验,他知道可靠的时钟可以使网络同步变得非常简单。当同步变得简单时,结果的网络可以非常快速,仅受网络带宽的限制。 Anatoly注意到,没有时钟的区块链系统(如比特币和以太坊)在全球范围内的交易速度在15次每秒时遇到困难,而世界中心化支付系统(如Visa)则需要峰值65000次每秒。 没有时钟,很明显他们永远无法成为全球支付系统或全球超级计算机。当Anatoly解决了计算机之间不信任时间一致性的问题时,他知道他拥有将40年分布式系统研究带给区块链世界的关键。由此产生的集群不仅仅是10倍、100倍或1000倍,而是立即实现了出厂时是一万倍的速度! Anatoly的实施开始是在一个私人代码库中,使用C编程语言进行实现。曾在Qualcomm Incorporated与Anatoly一起合作的Greg Fitzgerald鼓励他以Rust编程语言重新实现该项目。Greg曾在LLVM编译器基础设施上工作,该基础设施是Clang C/C++编译器和Rust编译器的基础。Greg声称该语言的安全保证将提高软件的生产率,并且其无垃圾回收器将使程序能够像使用C编写的程序一样运行。Anatoly尝试了一下,仅用了两个星期,就将他的整个代码库迁移…
-
- 0 篇回复
- 23 次查看
-