您正在查看: Solana-新手教程 分类下的文章

RISC-V 与EVM集成的性能和可行性分析

前置总结

技术目的:以太坊网络扩容面临的几个长期瓶颈,包括稳定的数据可用性采样、确保区块生产保持竞争力,以及零知识EVM证明。在智能合约中实施RISC-V架构将保持区块生产市场的竞争力,并提高执行层零知识功能的效率。转向RISC-V将使 Ethereum 与 Solana 和Sui等更新的区块链更具竞争力

技术可行性:从《RISC-V 与以太坊虚拟机集成的性能和可行性分析》分析和测试结果应该可行

难度和风险:需要执行层的重新设计,社区大概评估整体需要数年的时间,需要大量资源,并可能出现新的漏洞,并且开发人员和项目将如何通过旧的智能控制trac移植到新系统存在问题。当涉及向后兼容性时,这可能会引起很多麻烦。基本等同于个完整的新链

现状:目前消息来看,Vitalik只是计划考虑信标链运行RISC-V,相当于技术调研初期,对于以太坊目前现状,可以主要为了造势,稳币价。对于以太坊是否真正开始投入开发支持,可能等先观望下了

RISC-V 与以太坊虚拟机集成的性能和可行性分析

https://hackmd.io/@0xdeveloperuche/Hk18BWxkxl

RISC-V与EVM相关项目:

evm

https://github.com/developeruche/riscv-evm-experiment/tree/main/crates/research-draft

img

zkevm

https://verified-zkevm.org/

https://argument.xyz/blog/riscv-good-bad/

Solana 节点服务器优化

系统初始化配置

https://docs.solanalabs.com/operations/guides/validator-start#system-tuning

sudo bash -c "cat >/etc/sysctl.d/21-agave-validator.conf <<EOF
# Increase UDP buffer sizes
net.core.rmem_default = 134217728
net.core.rmem_max = 134217728
net.core.wmem_default = 134217728
net.core.wmem_max = 134217728

# Increase memory mapped files limit
vm.max_map_count = 1000000

# Increase number of allowed open file descriptors
fs.nr_open = 1000000
EOF"
sudo sysctl -p /etc/sysctl.d/21-agave-validator.conf
sudo bash -c "cat >/etc/security/limits.d/90-solana-nofiles.conf <<EOF
# Increase process file descriptor count limit
* - nofile 1000000
EOF"

私有链化部署Squads Protocol

前期调研

  • 目前v3已经停止升级,优先使用v4版本
  • Squads-Protocol 官方app.squads.so前端不开源,只开源了精简版本 squads-backup-kit
  • squads-backup-kit 前端不支持创建,只支持管理已有多签账户地址
  • 首次创建可以使用Squads CLI进行创建
  • v4程序地址:SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf

squads-backup-kit

GitHub:https://github.com/Squads-Protocol/public-v4-client
在线地址:https://backup.app.squads.so/

Squads CLI 使用

https://docs.squads.so/main/development/cli/installation
https://docs.squads.so/main/development/cli/commands

创建keypair

mkdir squads-multisig
cd squads-multisig
solana-keygen new -o ./keypair-multisig.json
solana-keygen new -o ./keypair-1.json
solana-keygen new -o ./keypair-2.json
solana-keygen new -o ./keypair-3.json

生成测试账户地址

89CefQR7XpdSKsDAFMZVUu3ipqiW35BceuahoE8CiAxz
56uqkuNMGsozcYDuzKfkqUEPqDLQfXRncvoH73xHzHnt
G3YLqbreJj1spvBMajv8qgPXVzZ1WaN34LDn7ChFdAPY
Hj3KcgcuvcHRM9or6SbuLuTV8Xe5pDttKk3nQSXzP65d

分别给上面4个账户地址转1SOL,为后面演示 2/3多签测试做准备

创建多重签名

squads-multisig-cli multisig-create --rpc-url <RPC_URL> --program-id <PROGRAM_ID> --keypair <KEYPAIR_PATH> --config-authority <CONFIG_AUTHORITY> --members <MEMBER_1> <MEMBER_2> ... --threshold <THRESHOLD>

multisig-create参数

  • --rpc-url :(可选)Solana RPC 端点的 URL。如果未指定,则默认为主网。
  • --program-id :(可选)多重签名程序的 ID。如未指定,则默认为标准 ID。
  • --keypair :密钥对文件的路径。
  • --config-authority :(可选)程序配置机构的地址。
  • --members <MEMBER_...>:成员公钥列表,以空格分隔。
  • --threshold :执行多重签名交易所需的签名阈值数量。

测试创建

squads-multisig-cli multisig-create --rpc-url https://api.devnet.solana.com --program-id SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf --keypair ./keypair-multisig.json --members 56uqkuNMGsozcYDuzKfkqUEPqDLQfXRncvoH73xHzHnt,7 --members G3YLqbreJj1spvBMajv8qgPXVzZ1WaN34LDn7ChFdAPY,7 --members Hj3KcgcuvcHRM9or6SbuLuTV8Xe5pDttKk3nQSXzP65d,7 --threshold 2

threshold为2,则代表 2/3通过

权限是数字,映射到以下内容:

  • 提议人 -1
  • 投票人 -2
  • 执行人 -4
  • 上述所有的 -7

或者任何权限组合(即提议者和投票者3)
例如 --members FcBpwMquaMURbYwpRFUrBrYgFwJzfWiBEGfHLbik1Wsm,7

执行命令后返回
https://solscan.io/tx/XRFQkd2HN4mFoQvKa2FUdKYr2WkETZmxAYbCkM87VjxFDBgUWCEQYEixPcodpQtu1kv8cVgu1MP5pQpcU995U9A?cluster=devnet

You're about to create a multisig, please review the details:

RPC Cluster URL:   https://api.devnet.solana.com
Program ID:        SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf
Your Public Key:       89CefQR7XpdSKsDAFMZVUu3ipqiW35BceuahoE8CiAxz

Config Parameters

Config Authority:  None
Threshold:          2
Rent Collector:     None
Members amount:      3

Do you want to proceed? yes

⠒ Sending transaction...                                                                                                Transaction confirmed: XRFQkd2HN4mFoQvKa2FUdKYr2WkETZmxAYbCkM87VjxFDBgUWCEQYEixPcodpQtu1kv8cVgu1MP5pQpcU995U9A


Created Multisig: 9VrXzJ8zQ8PZQ1pBnzbfNVB8cJKneU6rdrjwUKypAybE. Signature: XRFQkd2HN4mFoQvKa2FUdKYr2WkETZmxAYbCkM87VjxFDBgUWCEQYEixPcodpQtu1kv8cVgu1MP5pQpcU995U9A

多签钱包地址为:9VrXzJ8zQ8PZQ1pBnzbfNVB8cJKneU6rdrjwUKypAybE

使用前端工具进行测试

https://backup.app.squads.so/

查看当前多签配置

https://backup.app.squads.so/#/config/

修改配置交易创建

squads-multisig-cli config-transaction-create --rpc-url <RPC_URL> --program-id <PROGRAM_ID> --keypair <KEYPAIR_PATH> --multisig-pubkey <MULTISIG_PUBLIC_KEY> --action <ACTION> [--memo <MEMO>]

添加新成员

squads-multisig-cli config-transaction-create --rpc-url https://api.devnet.solana.com --program-id SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf --keypair ./keypair-multisig.json --multisig-pubkey 89CefQR7XpdSKsDAFMZVUu3ipqiW35BceuahoE8CiAxz --action "AddMember 56uqkuNMGsozcYDuzKfkqUEPqDLQfXRncvoH73xHzHnt 7" --memo "AddMember 56uqkuNMGsozcYDuzKfkqUEPqDLQfXRncvoH73xHzHnt 7"

其余修改操作参考 https://docs.squads.so/main/development/cli/commands

私有链部署

对于私有链部署,首先需要初始化程序so

solana program -u m dump SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf ./roles/svm-node/files/spl/squads-protocol-v4.so
solana-genesis --upgradeable-program SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf BPFLoaderUpgradeab1e11111111111111111111111 {{path}}/config/spl/squads-protocol-v4.so {{upgradeAccount}} 

链启动后,创建多签交易报错

⠂ Sending transaction...                                                                                                thread 'main' panicked at /root/.cargo/registry/src/index.crates.io-6f17d22bba15001f/squads-multisig-cli-0.1.3/src/command/multisig_create.rs:141:14:
Failed to fetch program config account: Error { request: None, kind: RpcError(ForUser("AccountNotFound: pubkey=BSTq9w3kZwNwpBXJEvTZz2G9ZTNyKBvoSeXMvwb4cNZr")) }

分析:缺少内部初始化账户

获取账户地址Data {注意需要base64格式}

curl https://api.devnet.solana.com -s -X \
  POST -H "Content-Type: application/json" -d ' 
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getAccountInfo",
    "params": [
      "BSTq9w3kZwNwpBXJEvTZz2G9ZTNyKBvoSeXMvwb4cNZr",
      {
        "encoding": "base64"
      }
    ]
  }
' | jq

返回

{
  "jsonrpc": "2.0",
  "result": {
    "context": {
      "apiVersion": "2.2.3",
      "slot": 373312028
    },
    "value": {
      "data": [
        "xNJa55CVjD/y4DkJcttfEtTBz1IxzaY5194JtJU/4aL4ooeXbGx+0AAAAAAAAAAA8uA5CXLbXxLUwc9SMc2mOdfeCbSVP+Gi+KKHl2xsftAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
        "base64"
      ],
      "executable": false,
      "lamports": 1893120,
      "owner": "SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf",
      "rentEpoch": 18446744073709551615,
      "space": 144
    }
  },
  "id": 1
}

调整初始化参数,加载预设账户地址和data

solana-genesis --primordial-accounts-file accounts.json

accounts.json

{
  "BSTq9w3kZwNwpBXJEvTZz2G9ZTNyKBvoSeXMvwb4cNZr": {
    "balance": 100000000000,
    "owner": "SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf",
    "executable": false,
    "data": "xNJa55CVjD/y4DkJcttfEtTBz1IxzaY5194JtJU/4aL4ooeXbGx+0AAAAAAAAAAA8uA5CXLbXxLUwc9SMc2mOdfeCbSVP+Gi+KKHl2xsftAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  }
}

再次确认私链账户地址与solana devnet data数据一致

solana account BSTq9w3kZwNwpBXJEvTZz2G9ZTNyKBvoSeXMvwb4cNZr --url https://api.devnet.solana.com

参考

https://docs.eclipse.xyz/developers/developer-tooling/squads-multisig
https://docs.squads.so/main/additional-resources/what-if-the-squads-app-goes-down
https://github.com/assetCLI/assetCLI-init/blob/feb-25/local-dev.sh

solana 交易 confirmationStatus 有几种状态

在 Solana 中,交易的 confirmationStatus 用于表示交易的确认状态,主要有以下几种状态:

1. finalized

  • 含义 :这是最高级别的确认状态。当交易达到 finalized 状态时,意味着该交易已经被集群中的大多数验证节点确认,并且不会被回滚。在区块链的共识机制下,这是一个非常安全的状态,表明交易已经被永久记录在区块链上。
  • 应用场景 :在需要确保交易不可逆转的场景中,如涉及资金转移、重要数据记录等,通常会等待交易达到 finalized 状态。

2. confirmed

  • 含义 :表示交易已经被集群中的一个验证节点确认。虽然交易处于 confirmed 状态,但仍然存在一定的风险,因为在某些情况下,该交易可能会被回滚。不过,这种情况相对较少发生。
  • 应用场景 :在一些对交易确认速度要求较高,而对交易最终确定性要求不是特别严格的场景中,可以使用 confirmed 状态。例如,在一些实时性要求较高的游戏或交互场景中,当用户完成操作后,可以快速告知用户交易已 confirmed ,让用户继续后续操作。

3. processed

  • 含义 :表示交易已经被集群接收并处理,但尚未被任何验证节点确认。这是交易确认过程中的初始状态,意味着交易已经进入了集群的处理流程,但还没有得到足够的确认。
  • 应用场景 :在开发过程中,当需要快速反馈交易是否已经被集群接收时,可以使用 processed 状态。例如,在用户提交交易后,立即告知用户交易已被接收并正在处理中。

代码示例

在使用 @solana/web3.js 进行交易时,可以指定 confirmationStatus 参数。以下是一个示例代码:

const { Connection, Keypair, LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction, sendAndConfirmTransaction } = require('@solana/web3.js');

// 连接到 Solana 网络
const connection = new Connection('https://api-devnet.solana.com', 'confirmed');

// 生成发送方和接收方的密钥对
const fromKeypair = Keypair.generate();
const toPublicKey = new PublicKey('...'); // 替换为实际的接收方公钥

// 创建交易
const transaction = new Transaction().add(
    SystemProgram.transfer({
        fromPubkey: fromKeypair.publicKey,
        toPubkey: toPublicKey,
        lamports: 1 * LAMPORTS_PER_SOL,
    })
);

// 发送并确认交易,指定 confirmationStatus 为 'finalized'
sendAndConfirmTransaction(connection, transaction, [fromKeypair], {
    commitment: 'finalized'
})
.then((signature) => {
    console.log(`交易已成功发送,签名: ${signature}`);
})
.catch((error) => {
    console.error('转账过程中出现错误:', error);
});


在上述代码中, commitment 参数指定了交易的确认状态,这里设置为 finalized ,表示等待交易达到最终确认状态。你可以根据实际需求将其设置为 confirmed 或 processed 。