Solana 核心概念全解析:账户、交易、合约与租约,高流量区块链技术揭秘!

目录

1.Solana 核心概念简述

1.1. 账户(Account)

1.2. 交易(Transaction)

1.3. 交易指令(Instruction)

1.4. SPL 代币

1.5. 合约(Program)

1.6. 租约(Rent)

2通过RPC与Solana交互

2.1.配置环境

2.2.查看钱包信息

2.3.Token 账户查询

2.4.创建 Token 账户

2.5.实时监控账户变动

2.6.转账操作

3.Solana的Web3.js

3.1.交易代码

3.2.输出结果

4.通过 WalletAdatper 与钱包交互

4.1 依赖和示例界面

4.2Solana 钱包 API 整理 

4.2.1关键包和导入

4.2.2SolongWallet 适配器集成

4.2.3钱包连接和状态管理

4.2.4 交易操作

4.2.5 RPC 配置和管理


1.Solana 核心概念简述

Solana 是一个高性能的区块链平台,其核心概念包括 账户(Account)交易(Transaction)合约(Program)租约(Rent)。以下是对这些概念的简短易懂概括:

1.1. 账户(Account)

  • “一切皆账户”:类似 Linux 系统把所有资源抽象为“文件”,Solana 中所有的信息(如代币余额、合约代码等)都存储在账户对象中。
  • 账户结构
    • lamports:账户余额(Solana 的原生代币单位)。
    • data:存储的数据(对于合约账户,这里是代码;对于用户账户,这里可能是代币信息)。
    • owner:账户的所有者(通常是一个合约地址,决定谁能操作这个账户)。
    • executable:是否为可执行合约(如果是合约账户,此值为 true)。
    • rent_epoch:下次需要支付租金的周期。
  • 账户与签名

    1.2. 交易(Transaction)

    • 用户账户本质是一个 私钥,通过 Ed25519 算法生成(高效、安全、签名短)。
    • 账户地址是私钥对应的 公钥,经过 Base58 编码后变成可读形式(如 HawRVHh7t4d3H3bitWHFt25WhhoDmbJMCfWdESQQoYEy)。
    • 私钥签名用于证明对账户的控制权。
  • 定义:交易是用户与区块链交互的方式,例如转账或调用合约。
  • 组成
    • 一系列 交易指令(Instruction):指定要执行的操作、涉及的账户和数据。
    • 签名:由发起者的私钥生成,用于验证交易有效性。
    • 账户列表:交易中涉及的所有账户地址。
    • 最近区块哈希:确保交易的时效性。

1.3. 交易指令(Instruction)

  • 定义:交易的核心单元,描述具体的操作。
  • 结构
    • program_id_index:要调用的合约地址(在账户列表中的索引)。
    • accounts:操作涉及的账户。
    • data:输入的具体数据。

1.4. SPL 代币(SPL)

在以太坊中,普通代币被一个叫ERC20的提案定了规范,可以认为普通代币合约统一叫做ERC20代币。

那么Solana世界里的ERC20代币是什么呢?答案就是SPL代币。

The Solana Program Library (SPL) is a collection of on-chain programs targeting the Sealevel parallel runtime.

SPL Token是 " Solana Program Library"中的一个组成部分,叫做"Token Program",简称为SPL Token。

所有的代币都有这个合约来管理,该合约代码在 https://github.com/solana-labs/solana-program-library/tree/master/token

不同于以太坊中,一个代币就是一个合约。

SPL Token中,一个代币,仅仅是一个归Token合约管理的普通的Account对象,这个对象里面的二进制数据定义了 这个代币的基本属性

1.5. 合约(Program)

  • 类型
    • 系统合约(Native Program):由 Solana 官方提供,如 System Program(创建账户、转账)、BPF Loader Program(部署合约)。
    • 普通合约(On Chain Program):用户开发并部署的合约,如代币相关合约。
  • 特点
    • 合约是存储在账户中的可执行代码(executable = true)。
    • 用户通过交易调用合约执行逻辑。
    • Solana 的合约可以更新或销毁,销毁时存储资源会退还给部署者。

1.6. 租约(Rent)

  • 什么是租约
    • 账户需要支付“租金”来保持数据存储在区块链上,租金根据存储的数据量和时间计算。
  • 规则
    • 免租:账户余额超过“两年租金”的阈值则无需支付租金。
    • 租金不足:余额低于免租阈值或付不出租金的账户会被“垃圾收集”(删除)。
  • 与交易费用的区别
    • 租金是为存储付费。
    • 交易费用是为处理指令付费。

2通过RPC与Solana交互

    2.1.配置环境

    首先,将钱包配置指向 Devnet 环境:

    solana config set --url https://api.devnet.solana.com

    2.2.查看钱包信息

    查看当前钱包地址:

    solana address

    获取测试网 SOL(开发资金):

    solana airdrop 2

    查看钱包 SOL 余额:

    solana balance

    查看钱包中所有 SPL Token 余额:

    spl-token accounts

    2.3.Token 账户查询

    通过这个 curl 请求,你可以查询 Czorr4y9oFvE3VdfCLVFuKDYxaNUG1iyQomR7kMZUuzi 这个钱包地址下,所有与 7vtXvye2ECB1T5Se8E1KebNfmV7t4VkaULDjf2v1xpA9 这个 SPL Token(Token 的 Mint 地址)相关的 Token 账户。 

    curl  https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
            {
                "jsonrpc": "2.0",
                "id": 1,
                "method": "getTokenAccountsByOwner",
                "params": [
                "Czorr4y9oFvE3VdfCLVFuKDYxaNUG1iyQomR7kMZUuzi",
                {
                    "mint": "7vtXvye2ECB1T5Se8E1KebNfmV7t4VkaULDjf2v1xpA9"
                },
                {
                    "encoding": "jsonParsed"
                }
                ]
            }
        '

    查询结果解析:

    {
        "jsonrpc": "2.0",
        "result": {
            "context": {
                "apiVersion": "2.1.13",
                "slot": 363620820
            },
            "value": [
                {
                    "account": {
                        "data": {
                            "parsed": {
                                "info": {
                                    "isNative": false,
                                    "mint": "7vtXvye2ECB1T5Se8E1KebNfmV7t4VkaULDjf2v1xpA9",
                                    "owner": "Czorr4y9oFvE3VdfCLVFuKDYxaNUG1iyQomR7kMZUuzi",
                                    "state": "initialized",
                                    "tokenAmount": {
                                        "amount": "94000000000",
                                        "decimals": 9,
                                        "uiAmount": 94,
                                        "uiAmountString": "94"
                                    }
                                },
                                "type": "account"
                            },
                            "program": "spl-token",
                            "space": 165
                        },
                        "executable": false,
                        "lamports": 315139280,
                        "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
                        "rentEpoch": 18446744073709552000,
                        "space": 165
                    },
                    "pubkey": "EZhhUANUMKsRhRMArczio1kLc9axefTUAh5xofGX35AK"
                }
            ]
        },
        "id": 1
    }
    • pubkeyEZhhUANUMKsRhRMArczio1kLc9axefTUAh5xofGX35AK - Token 账户公钥
    • mint7vtXvye2ECB1T5Se8E1KebNfmV7t4VkaULDjf2v1xpA9 - SPL Token 的类型标识符
    • ownerCzorr4y9oFvE3VdfCLVFuKDYxaNUG1iyQomR7kMZUuzi - 该 Token 账户的拥有者钱包地址
    • tokenAmount:当前持有的代币数量(带有小数位信息)

    2.4.创建 Token 账户

    为某个 SPL Token 创建关联账户(需要确保接收者有对应的 Token 账户才能接收特定代币):

    spl-token create-account 9pbWQJHTSLELGekc85QHYCHozRdLo4si2nCPbMNZ2bxj --owner HybiEijLUVae5NFoiW52jCoN2bQ9TUL74wJkfPRgHxbm --fee-payer /Users/linzhihao/.config/solana/id.json

    2.5.实时监控账户变动

    使用 WebSocket 订阅账户变化(需要提前安装 wscat 工具):

    wscat -c wss://api.devnet.solana.com

    连接后发送订阅请求: 

    {"jsonrpc":"2.0","id":1,"method":"accountSubscribe","params":["HybiEijLUVae5NFoiW52jCoN2bQ9TUL74wJkfPRgHxbm",{"encoding":"jsonParsed","commitment":"finalized"}]}

    监听Solana token account HybiEijLUVae5NFoiW52jCoN2bQ9TUL74wJkfPRgHxbm

    2.6.转账操作

    转移 SPL Token 到另一个钱包(自动为对方创建接收账户):

    spl-token transfer --fund-recipient  9pbWQJHTSLELGekc85QHYCHozRdLo4si2nCPbMNZ2bxj 0.01 BBy1K96Y3bohNeiZTHuQyB53LcfZv6NWCSWqQp89TiVu
    • --fund-recipient:如果目标地址没有该Token的账户,则为其创建一个。
    • 1:转账的Token数量,1表示转1个单位的该Token。
    • BBy1K96Y3bohNeiZTHuQyB53LcfZv6NWCSWqQp89TiVu:目标收件人的Solana Public Address

    3.Solana的Web3.js

    3.1.交易代码

    // solana-test.js
    const { Connection, Keypair, LAMPORTS_PER_SOL, PublicKey, SystemProgram, TransactionMessage, VersionedTransaction } = require('@solana/web3.js');
    const fs = require('fs'); 
    const bs58 = require('bs58');
    
    
    async function main() {
      try {
        // 1. 读取 id.json 文件
        const idJson = JSON.parse(fs.readFileSync('/Users/linzhihao/.config/solana/id.json', 'utf8'));
     
    
        // 2. 解码为 Uint8Array
        const secretKey = new Uint8Array(idJson);
    
    
        // 3. 创建 Keypair
        const keypair = Keypair.fromSecretKey(secretKey);
        console.log('✅ Loaded keypair from secret key');
        console.log(`   Address: ${keypair.publicKey.toString()}`);
    
        // 4. 连接到 Solana 网络
        const connection = new Connection('https://api.devnet.solana.com', 'confirmed');
        
    
    
        // 5. Check account balance
        const balance = await connection.getBalance(keypair.publicKey);
        console.log(`✅ Current balance: ${balance / LAMPORTS_PER_SOL} SOL`);
    
        // If balance is too low, request an airdrop
        if (balance < 0.1 * LAMPORTS_PER_SOL) {
          console.log('⏳ Requesting airdrop of 1 SOL...');
          const airdropSignature = await connection.requestAirdrop(
            keypair.publicKey,
            1 * LAMPORTS_PER_SOL
          );
          
          // Wait for confirmation
          const latestBlockhash = await connection.getLatestBlockhash('finalized');
          await connection.confirmTransaction({
            blockhash: latestBlockhash.blockhash,
            lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
            signature: airdropSignature
          });
          
          const newBalance = await connection.getBalance(keypair.publicKey);
          console.log(`✅ New balance after airdrop: ${newBalance / LAMPORTS_PER_SOL} SOL`);
        }
    
        // 6. Set up recipient address for transfer (just an example address)
        const recipientAddress = new PublicKey('Ey9M2QMRfg8Tuysyh3UEdeB9NwZmRaJU5FUjKtBSNJnb');
        const transferAmount = 0.01 * LAMPORTS_PER_SOL; // 0.01 SOL
        
        console.log(`⏳ Preparing to send ${transferAmount / LAMPORTS_PER_SOL} SOL to ${recipientAddress.toString()}...`);
    
        // 7. Get latest blockhash
        const latestBlockhash = await connection.getLatestBlockhash('finalized');
        console.log(`✅ Fetched latest blockhash. Last Valid Height: ${latestBlockhash.lastValidBlockHeight}`);
        
        // 8. Create a transfer instruction
        const transferInstruction = SystemProgram.transfer({
          fromPubkey: keypair.publicKey,
          toPubkey: recipientAddress,
          lamports: transferAmount
        });
        
        // 9. Create a transaction message
        const message = new TransactionMessage({
          payerKey: keypair.publicKey,
          recentBlockhash: latestBlockhash.blockhash,
          instructions: [transferInstruction]
        }).compileToV0Message();
        
        // 10. Create a versioned transaction
        const transaction = new VersionedTransaction(message);
        
        // 11. Sign the transaction
        transaction.sign([keypair]);
        console.log('✅ Transaction signed');
        
        // 12. Send the transaction
        const signature = await connection.sendTransaction(transaction);
        console.log(`✅ Transaction sent with signature: ${signature}`);
        
        // 13. Confirm the transaction
        console.log('⏳ Confirming transaction...');
        await connection.confirmTransaction({
          blockhash: latestBlockhash.blockhash,
          lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
          signature: signature
        });
        console.log('✅ Transaction confirmed');
        
        // 14. Check the new balance
        const newBalance = await connection.getBalance(keypair.publicKey);
        console.log(`✅ New balance after transfer: ${newBalance / LAMPORTS_PER_SOL} SOL`);
        
      } catch (error) {
        console.error('❌ Error:', error);
      }
    }
    
    main();

    3.2.输出结果

    ✅ Loaded keypair from secret key
       Address: Ed5NC8cwDiJ7A8831DoAdELq6aouydCbywUDLg3EwC8k
    ✅ Current balance: 2.89027628 SOL
    ⏳ Preparing to send 0.01 SOL to Ey9M2QMRfg8Tuysyh3UEdeB9NwZmRaJU5FUjKtBSNJnb...
    ✅ Fetched latest blockhash. Last Valid Height: 351840779
    ✅ Transaction signed
    ✅ Transaction sent with signature: 2x4DEvKHvuXDtrFUfPhLL1EcicYTf1AKKuuer6gU5o2Rrt14sa85uRGgrApZJUPLJod6JdgGuezwVBbb5x3RLs7n
    ⏳ Confirming transaction...
    ✅ Transaction confirmed
    ✅ New balance after transfer: 2.88027128 SOL

    4.通过 WalletAdatper 与钱包交互

    4.1 依赖和示例界面

    npm install \
      @solana/wallet-adapter-react@0.15.35 \
      @solana/wallet-adapter-base@0.9.23 \
      @solana/wallet-adapter-wallets@0.17.0 \
    
    
    npm install @solana/buffer-layout
    npm install @solana/web3.js@latest
    npm install @craco/craco --save-dev
    npm install web-vitals

     

    4.2Solana 钱包 API 整理 

    4.2.1关键包和导入

    // 核心适配器和连接
    import { ConnectionProvider, WalletProvider, useConnection, useWallet } from '@solana/wallet-adapter-react';
    import { WalletAdapterNetwork } from '@solana/wallet-adapter-base';
    import { WalletModalProvider } from '@solana/wallet-adapter-react-ui';
    
    // UI 组件
    import { WalletDisconnectButton, WalletMultiButton } from '@solana/wallet-adapter-react-ui';
    
    // 特定钱包适配器
    import { SolongWalletAdapter } from '@solana/wallet-adapter-solong';
    import { PhantomWalletAdapter } from '@solana/wallet-adapter-phantom';
    
    // Solana Web3 工具
    import { Keypair, Connection, LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction } from '@solana/web3.js';

    4.2.2SolongWallet 适配器集成

    // 初始化 SolongWallet 适配器
    const solongAdapter = new SolongWalletAdapter();
    
    // 组合多个钱包适配器
    const wallets = useMemo(
        () => [
            new PhantomWalletAdapter(),
            new SolongWalletAdapter(),
            // 可以添加更多适配器...
        ],
        []
    );
    
    // 提供钱包适配器给应用
    <WalletProvider wallets={wallets} autoConnect>
        {/* 应用组件 */}
    </WalletProvider>

    4.2.3钱包连接和状态管理

    <ConnectionProvider endpoint={endpoint}>
        <WalletProvider wallets={wallets} autoConnect>
            <WalletModalProvider>
                {/* 应用组件 */}
            </WalletModalProvider>
        </WalletProvider>
    </ConnectionProvider>
    
    <div style={styles.walletButtons}>
        <WalletMultiButton />
        <WalletDisconnectButton />
    </div>

    4.2.4 交易操作

    // 在组件内部获取钱包连接和功能
    const { connection } = useConnection();
    const { publicKey, sendTransaction } = useWallet();
    
    // 创建交易
    const transaction = new Transaction();
    const recipientPubKey = Keypair.generate().publicKey;
    
    // 添加转账指令
    transaction.add(
        SystemProgram.transfer({
            fromPubkey: publicKey,
            toPubkey: recipientPubKey,
            lamports: 0.01 * LAMPORTS_PER_SOL,
        })
    );
    
    // 获取最新区块哈希
    const { blockhash, lastValidBlockHeight } = value;
    transaction.recentBlockhash = blockhash;
    transaction.feePayer = publicKey;
    
    // 发送交易
    const signature = await sendTransaction(transaction, connection, { 
        minContextSlot,
        skipPreflight: false 
    });
    
    // 等待确认
    const confirmationResponse = await connection.confirmTransaction({
        blockhash,
        lastValidBlockHeight,
        signature,
    }, 'confirmed');

    4.2.5 RPC 配置和管理

    export const RPC_CONFIG = {
        // 默认 Solana Devnet - 有低速率限制
        DEFAULT: clusterApiUrl(WalletAdapterNetwork.Devnet),
        
        // 替代端点 - 在这里添加您的 API 密钥
        HELIUS: 'https://rpc-devnet.helius.xyz/your-api-key',
        QUICKNODE: 'https://your-quicknode-devnet-endpoint',
        ALCHEMY: 'https://solana-devnet.g.alchemy.com/v2/your-api-key',
        
        // 默认使用哪个端点
        ACTIVE: 'DEFAULT',
        
        // 速率限制错误的最大重试次数
        MAX_RETRIES: 3,
        
        // 指数退避的基本延迟(毫秒)
        BASE_DELAY: 1000,
        
        // 余额轮询间隔(毫秒)- 增加到 30 秒
        POLLING_INTERVAL: 30000,
    };

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/979931.html

    如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

    相关文章

    StarRocks 在爱奇艺大数据场景的实践

    作者&#xff1a;林豪&#xff0c;爱奇艺大数据 OLAP 服务负责人 小编导读&#xff1a; 本文整理自爱奇艺工程师在 StarRocks 年度峰会的分享&#xff0c;介绍了爱奇艺 OLAP 引擎演化及引入 StarRocks 后的效果。 在广告业务中&#xff0c;StarRocks 替换 ImpalaKudu 后&#x…

    【Linux】Linux的进程控制

    目录 1. 学习思维导图 2.进程创建&#xff08;fork&#xff09; 2.1 fork创建进程失败 3.进程终止 3.1 进程退出情况 3.1.1main函数 3.1.2 退出码 3.2 exit/_exit函数 1. exit() 函数 2. _exit() 函数 4.进程等待 4.1 实现进程等待的方法 wait/waitpid方法 区别&a…

    ubuntu防火墙iptables

    文章目录 步骤开启自启防火墙iptables规则链Chains的区别 在 Ubuntu 上使用 iptables 配置防火墙并保证服务可用 步骤 #防火墙状态 systemctl status iptables systemctl start iptables #开启防火墙并且开启22端口 systemctl start iptables && iptables -A INPUT -p…

    计算机毕业设计SpringBoot+Vue.js公司日常考勤系统(源码+文档+PPT+讲解)

    温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

    企业微信里可以使用的企业内刊制作工具,FLBOOK

    如何让员工及时了解公司动态、行业资讯、学习专业知识&#xff0c;并有效沉淀企业文化&#xff1f;一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网&#xff0c;注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…

    Hive-01之数仓、架构、数据类型、DDL、内外部表

    一、主题 hive的核心概念hive与数据库的区别hive的架构原理hive的安装部署hive的交互式方式hive的数据类型hive的DDL语法操作 二、要点 1.数据仓库的基本概念 1.数据仓库的基本概念 英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。数据仓库的目的是构建面向分析的…

    【Markdown 语法简洁讲解】

    Markdown 语法简洁语法讲解 什么是 Markdown1. 标题2. 列表3.文本样式4. 链接与图片5. 代码6. 表格7. 分割线8. 流程图9. 数学公式10. 快捷键11. 字体、字号与颜色 什么是 Markdown Markdown 是一种轻量级标记语言&#xff0c;通过简单的符号实现排版格式化&#xff0c;专注于…

    数据如何安全“过桥”?分类分级与风险评估,守护数据流通安全

    信息化高速发展&#xff0c;数据已成为企业的核心资产&#xff0c;驱动着业务决策、创新与市场竞争力。随着数据开发利用不断深入&#xff0c;常态化的数据流通不仅促进了信息的快速传递与共享&#xff0c;还能帮助企业快速响应市场变化&#xff0c;把握商业机遇&#xff0c;实…

    Linux网络 TCP全连接队列与tcpdump抓包

    TCP全连接队列 在 Linux 网络中&#xff0c;TCP 全连接队列&#xff08;也称为 Accept 队列&#xff09;是一个重要的概念&#xff0c;用于管理已经完成三次握手&#xff0c;即已经处于 established 状态但尚未被应用程序通过 accept( ) 函数处理的 TCP 连接&#xff0c;避免因…

    网络流算法: Edmonds-Karp算法

    图论相关帖子 基本概念图的表示: 邻接矩阵和邻接表图的遍历: 深度优先与广度优先拓扑排序图的最短路径:Dijkstra算法和Bellman-Ford算法最小生成树二分图多源最短路径强连通分量欧拉回路和汉密尔顿回路网络流算法: Edmonds-Karp算法网络流算法: Dinic算法 环境要求 本文所用…

    Python的那些事第三十六篇:基于 Vega 和 Vega-Lite 的数据可视化解决方案,Altair 声明式可视化库

    Altair 声明式可视化库:基于 Vega 和 Vega-Lite 的数据可视化解决方案 摘要 在数据科学和分析领域,有效的数据可视化是理解数据、发现模式和传达见解的关键。Python 作为数据科学的主要编程语言之一,提供了多种数据可视化库。其中,Altair 是一个基于 Vega 和 Vega-Lite 的…

    文件描述符与重定向

    1. open系统调用 在 Linux 中, open() 系统调用用于打开一个文件或设备&#xff0c;并返回一个文件描述符&#xff0c;通过该描述符可以进行文件读写操作。open() 可以用于创建新文件或打开已存在的文件&#xff0c;具体行为取决于传递给它的参数。 需要包含的头文件&#xf…

    【WPF】绑定报错:双向绑定需要 Path 或 XPath

    背景 最开始使用的是 TextBlock: <ItemsControl ItemsSource"{Binding CameraList}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><StackPanel Orientation"Horizontal"/></ItemsPanelTemplate></ItemsControl.Item…

    【Linux高级IO】五种IO模型 多路转接(select)

    目录 1. 五种IO模型 1.1 阻塞式IO 1.2 非阻塞IO 1.3 信号驱动IO 1.4 多路转接 1.5 异步IO 2. 同步通信与异步通信 3. 多路转接 3.1 select 总结 1. 五种IO模型 1.1 阻塞式IO 阻塞式IO最为常见&#xff0c;在内核将数据准备好之前, 系统调用会一直等待&#xff0c;所有的…

    Linux服务升级:Almalinux 升级 DeepSeek-R1

    目录 一、实验 1.环境 2.Almalinux 部署 Ollama 3.Almalinux 升级 DeepSeek-R1 4.Almalinux 部署 docker 5. docker 部署 DeepSeek-R1 6.Almalinux 部署 Cpolar (内网穿透) 7.使用cpolar内网穿透 二、问题 1.构建容器失败 一、实验 1.环境 &#xff08;1&#xff09…

    深度剖析数据分析职业成长阶梯

    一、数据分析岗位剖析 目前&#xff0c;数据分析领域主要有以下几类岗位&#xff1a;业务数据分析师、商业数据分析师、数据运营、数据产品经理、数据工程师、数据科学家等&#xff0c;按照工作侧重点不同&#xff0c;本文将上述岗位分为偏业务和偏技术两大类&#xff0c;并对…

    CosyVoice2整合包 特殊声音标记,声音克隆更逼真,新增批量生成

    新增批量生成,可用于制作直播话术音频 特殊声音标记 符号示例1_语气加强<strong> </strong>每天都<strong>付出</strong>和<strong>精进</strong>&#xff0c;才能达到巅峰。2_呼吸声[breath][breath] 吸气,[breath] 呼气! [breath] 吸,[b…

    vector习题

    完数和盈数 题目 完数VS盈数_牛客题霸_牛客网 一个数如果恰好等于它的各因子(该数本身除外)之和&#xff0c;如&#xff1a;6321。则称其为“完数”&#xff1b;若因子之和大于该数&#xff0c;则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述&#xff…

    如何保证 Redis 缓存和数据库的一致性?

    如何保证 Redis 缓存和数据库的一致性&#xff1f; 1. 问题出现场景 先修改数据库&#xff0c;再删除缓存 删除数据库数据成功了&#xff0c;但是删除缓存却失败了&#xff0c;缓存中仍保留的是旧数据 先删除缓存&#xff0c;再删除数据库 如果 Redis 缓存删除成功后&#xf…

    信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效

    随着数据传输、存储及信息技术的飞速发展&#xff0c;信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切&#xff0c;数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范&#xff0c;针对于涉及重要秘密信息&#xff0c;需做到安全的物…