跳转到帖子
View in the app

A better way to browse. Learn more.

WEB3论坛社区

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

开发者入门

手把手带你拆解密码学与智能合约的底层逻辑,完成从“看不懂区块浏览器”到“能独立部署主网 DApp”的跨越,用中文把区块链写进未来。

  1. 发帖人 WEB3论坛

    通过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 次查看
  2. 发帖人 WEB3论坛

    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 次查看
  3. 发帖人 WEB3论坛

    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 次查看
  4. 发帖人 WEB3论坛

    课后练习实现一个 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 次查看
  5. 发帖人 WEB3论坛

    合约调用在前面的例子中,我们通过 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 次查看
  6. 发帖人 WEB3论坛

    通过 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 次查看
  7. 发帖人 WEB3论坛

    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 次查看
  8. 发帖人 WEB3论坛

    课后练习通过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 次查看
  9. 发帖人 WEB3论坛

    接口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 次查看
  10. 发帖人 WEB3论坛

    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 次查看
  11. 发帖人 WEB3论坛

    课后练习通过命令行,发行一个代币。并给自己账号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 次查看
  12. 发帖人 WEB3论坛

    钱包使用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 次查看
  13. 发帖人 WEB3论坛

    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 次查看
  14. 发帖人 WEB3论坛

    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 次查看
  15. 发帖人 WEB3论坛

    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 次查看
  16. 发帖人 WEB3论坛

    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 次查看

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.