Web 3.0 簡介
Web 3.0 絕對是我們這些天經常看到的一個詞,並且最近已成為許多人迷戀的流行詞。Web 3.0 的一個包羅萬象的定義是消除Internet 上的中間人。在深入探討區塊鏈技術和Web 3.0 是什麼之前,我們必須先回顧一下互聯網最初創建的歷史及其目的。互聯網的起源始於Web 1.0,當時Web 被視為一種使信息訪問民主化的方式,但不幸的是,它對如何與靜態頁面進行交互設置了許多限制。因此,Web 2.0 是由谷歌、Facebook、亞馬遜、Twitter 和領先的大型科技公司創建的,使互聯網更容易連接和在線交易。電子商務和社交媒體為其他人提供了將平台擴展到更廣泛受眾的機會。然而,許多批評者認為這些公司現在已經增持了太多的權力,並由此創造了Web 3.0 一詞。Web 3.0 的理念是建立一個去中心化的系統,個人可以控制自己的數據,並能夠使用單個個性化帳戶在不同的平台上跳轉,在區塊鏈上創建所有活動的個人記錄。這將引入一個利用AI(人工智能)、IOT(物聯網)和區塊鏈技術的自主和開放的互聯網。0 的想法是擁有一個去中心化的系統,個人控制自己的數據並能夠使用單個個性化帳戶在不同的平台上反彈,在區塊鏈上創建所有活動的個人記錄。這將引入一個利用AI(人工智能)、IOT(物聯網)和區塊鏈技術的自主和開放的互聯網。0 的想法是擁有一個去中心化的系統,個人控制自己的數據並能夠使用單個個性化帳戶在不同的平台上反彈,在區塊鏈上創建所有活動的個人記錄。這將引入一個利用AI(人工智能)、IOT(物聯網)和區塊鏈技術的自主和開放的互聯網。
那麼區塊鏈在Web 3.0 中的作用是什麼?通過其在點對點網絡中促進數據存儲在多個副本中的能力以及網絡中驗證者之間達成共識的要求,區塊鏈協議真正成為Web 3.0 的支柱。最重要的是,它能夠讓兩個不知名的人通過智能合約達成協議,並通過互聯網結算交易,從而消除了對中介的需求。現在,我將深入了解我對區塊鏈基礎設施的理解,並幫助我的讀者了解客戶與區塊鏈交互的代碼以及這一切的開創性。
區塊鏈基礎設施
當客戶通過dapp 或去中心化交易所與區塊鏈上的特定合約地址進行交互時,他或她總是首先將他們的數字錢包連接到啟動該過程的應用程序本身。從那裡,客戶端的請求與網絡中的驗證器節點進行交互。驗證器節點利用RPC(遠程程序調用)讀取特定塊的先前哈希,當所有節點驗證交易時,批准在區塊鏈本身上創建塊。此步驟有助於驗證先前的交易以及當前的交易,以確保區塊本身沒有被可疑行為者篡改。
許多人想知道為什麼使用RPC 而不是更常用的REST API 方法。REST API 有時可能會失敗,尤其是在更大規模的應用程序中,這就是為什麼RPC 更常用於內部通信的原因。然而,在REST API 上使用RPC 的最大原因是由於區塊鏈的不變性組件。REST API 支持CRUD(創建、讀取、更新、刪除)操作;而驗證器在與區塊鏈交互時不需要更新和刪除方法,只需要GET 和POST。這種更簡單的方法有助於簡化與區塊鏈交互的應用程序。
示例交互
現在我們已經看到了基礎設施的概述,我們可以看看在幕後與區塊鏈交互的代碼。 免責聲明: 下面顯示的示例是在Chainlink/Solana 訓練營期間提供的示例代碼。所做的所有工作都是使用Solana CLI 在本地Solana 集群上完成的,並用作與Solana區塊鏈交互的模型。顯示的合約和錢包地址不是現有地址。
會議期間使用的示例是創建我們自己的代幣,因為這是大多數人熟悉的區塊鏈。我們從本地化服務器開始,然後在一個Rust 文件中,我們調用我們想要發生的事情的說明。
use borsh::{BorshDeserialize, BorshSerialize};#[derive(BorshSerialize, BorshDeserialize, Debug, Clone)]pub enum代幣Instruction {CreateToken,CreateTokenAccount,Mint { amount: u64 },Transfer { amount: u64 },}
Borsh 在這種情況下用於散列,主要用於行業中的安全關鍵項目,因為它優先考慮一致性、速度並具有嚴格的規範。它的Serialize/Deserialize 方法用於將數據結構轉換為字節,主要用於與RPC 和客戶端交互的過程中。
下一步是定義將存儲在程序中的數據,該數據分為兩個結構,一個用於定義標頭級別信息的“Token”標頭級別,以及一個定義用於令牌的帳戶。從那裡,編譯器被告知使用來自Borsh 庫的信息以及我們傳遞的指令和帳戶信息。
use borsh::{BorshDeserialize};use solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint::ProgramResult, msg, program_error::ProgramError, pubkey::Pubkey,};use crate::instruction::TokenInstruction;use crate::state::{Token,代幣Account};pub struct Processor {}impl Processor { pub fn process_instruction( _program_id: &Pubkey, accounts: &[AccountInfo]instruction_data: &[u8]) -> ProgramResult { let instruction =代幣Instruction::try_from_slice(instruction_data) .map_err(|_| ProgramError::InvalidInstructionData)?; let accounts_iter = &mut accounts.iter(); msg!(“Instruction: {:?}”,instruction); match instruction { 代幣Instruction::CreateToken => { msg!(“Instruction: Create代幣”); } 代幣Instruction::CreateTokenAccount => { msg!(“Instruction: Create代幣Account”); } 代幣Instruction::Mint { amount } => { msg!(“Instruction: Mint”); } 代幣Instruction::Transfer { amount } => { msg!(“Instruction: Transfer”); } } Ok(()) }}
注意: Crate 是編譯器。帳戶信息存儲我們要維護令牌所有權的帳戶的信息。
從這裡,我們傳入我們希望每個函數執行的操作。
總之,我們要做的是首先為我們指定的帳戶創建一個新令牌,同時還指定一個“令牌授權”帳戶(鑄造或創建新令牌等的特權)。然後,我們指定令牌的具體細節,例如供應和保存所有者帳戶以訪問令牌授權帳戶。
完成此步驟後,我們將指定要接收鑄造代幣的賬戶、所有者賬戶以及代幣授權賬戶。代碼邏輯將驗證它是試圖鑄造令牌的令牌授權帳戶,否則它將返回錯誤。一旦檢查通過,代幣賬戶的總供應量將隨著目標接收者的餘額而增加。
邏輯的最後一部分是驗證令牌可以在賬戶之間轉移。為此,我們必須驗證“發件人”帳戶以及“收件人”帳戶,並確認“發件人”帳戶擁有足夠的資金。我們的邏輯還將驗證“發件人”帳戶的所有者是否已簽署交易,同時還會檢查“收件人”帳戶是否與我們輸入的要發送到的帳戶匹配。如果全部結帳,兩個帳戶上的餘額將被更新並保存。
指令部分的最終代碼塊應如下所示:
match instruction {TokenInstruction::CreateToken => {msg!(“Instruction: Create代幣”);//get account info for master token accountlet token_master_account = next_account_info(accounts_iter)?;let token_authority = next_account_info(accounts_iter)?;let mut token =代幣::load_unchecked(token_master_account)?;//set default values and save master token accounttoken.authority = *token_authority.key;token.supply = 0;token.save(token_master_account)?}TokenInstruction::CreateTokenAccount => {msg!(“Instruction: Create代幣Account”);//get account info for master token account and token account to be createdlet token_account_acct = next_account_info(accounts_iter)?;let token_master_account = next_account_info(accounts_iter)?;let owner = next_account_info(accounts_iter)?;let mut token_account =代幣Account::load_unchecked(token_account_acct)?;//set default values and save token accounttoken_account.owner = *owner.key;token_account.token = *token_master_account.key;token_account.amount = 0;token_account.save(token_account_acct)?}TokenInstruction::Mint { amount } => {msg!(“Instruction: Mint”);//get account info for master token account and token account to mint tolet token_account_acct = next_account_info(accounts_iter)?;let token_master_account = next_account_info(accounts_iter)?;let mut token_account =代幣Account::load(token_account_acct)?;let mut token =代幣::load(token_master_account)?;//basic validation, ensure its the master token authority trying to mintlet token_authority = next_account_info(accounts_iter)?;if !token_authority.is_signer {msg!(“Only the token owner can mint tokens”);return Err(ProgramError::MissingRequiredSignature);}//update total supply of the master token, and update balance of token account that received the minttoken.supply += amount;token_account.amount += amount;//save updated contents of both accountstoken_account.save(token_account_acct)?;token.save(token_master_account)?;}TokenInstruction::Transfer { amount } => {msg!(“Instruction: Transfer”);//get account info for from and to token accounts, as well as master token accountlet from_token_acct = next_account_info(accounts_iter)?;let to_token_acct = next_account_info(accounts_iter)?;let owner = next_account_info(accounts_iter)?;let mut src_token_account =代幣Account::load(from_token_acct)?;let mut dst_token_account =代幣Account::load(to_token_acct)?;//basic validation, ensure sender has enough fundsif src_token_account.amount msg!(“Not enough tokens to transfer”);return Err(ProgramError::InsufficientFunds);}//ensure the owner of the from account is the one signing the transactionif !owner.is_signer {msg!(“Not the token owner signing the transaction”);return Err(ProgramError::MissingRequiredSignature);}//ensure the owner passed in is the actual owner of the token accountif !(src_token_account.owner == *owner.key) {msg!(“Not the token account owner signing the transaction”);return Err(ProgramError::MissingRequiredSignature);}//update values in from and to accounts, then save new contents of both accountssrc_token_account.amount -= amount;dst_token_account.amount += amount;src_token_account.save(from_token_acct)?;dst_token_account.save(to_token_acct)?;}
一旦我們部署了客戶端代碼,我們應該在Solana CLI 中看到,我們應該看到一個成功的交易以及令牌名稱、新鑄造的餘額以及兩個賬戶之間的轉賬。
回顧與思考
這個博客最終肯定比我預期的要長,但在區塊鏈技術及其自動化我們今天做事方式的能力方面,確實有很多東西需要解開。我希望我寫的下一篇博客與預言機如何與鏈一起工作以將現實世界的信息與來自智能合約的查詢聯繫起來。如果我想讓其他人從中學到什麼,那就是區塊鏈技術仍然是一個不斷發展的領域,與去中心化有其優點和缺點,但最終有可能幫助每個人作為一個社會共同發展。