可验证智能合约简介
可验证智能合约使用加密技术来验证在区块链外部完成的计算是正确的。这意味着,不需要在链上完成所有工作(这可能会很慢且昂贵),而是将繁重的计算工作放在链下完成,并且只将结果的证明存储在区块链上。
StarkNet 是以太坊上的一个 Layer-2 网络,使用 STARK(可扩展透明知识论证)证明来提供可扩展性和安全性。它允许开发者构建能够处理每秒大量交易的 dApp,同时受益于以太坊的安全性。
当在 StarkNet 上执行智能合约时,会涉及状态变化。这些状态变化是执行合约功能后对合约存储所做的更新。为了确保这些状态变化的正确性,StarkNet 生成并验证 STARK 证明。
以下是此过程的逐步解释:
当用户与 StarkNet 上的智能合约交互时,例如调用一个函数 increase_counter
,会发生以下步骤:
increase_counter(10)
将计数器增加 10。在执行智能合约期间,StarkNet 生成一个 跟踪(Trace)。跟踪是执行期间每一步计算的详细日志,包括初始状态、执行的操作和结果状态。这个跟踪对于生成证明至关重要。
使用前一步生成的跟踪,StarkNet 生成一个 STARK 证明。这个证明是一个加密证书,证明计算和结果状态变化的正确性。其工作原理如下:
生成的 STARK 证明以及新的状态变化被提交到以太坊主网进行验证。这是 STARKs 高效性的体现:
让我们以计数器合约为例来说明这个过程:
increase_counter(10)
。Cairo(计算机代数用于 RISC 操作)是一种专门为编写可验证程序而设计的编程语言。它是 StarkNet 上开发智能合约的本地语言,利用零知识证明确保计算完整性。
Cairo 的主要特点:
在本文中,我们将探讨在 StarkNet 上构建、部署和交互智能合约的步骤。
在开始之前,请确保你已安装以下内容:
cargo
(Rust 的包管理器)starknet-devnet
(StarkNet 本地测试网)starknet
CLIscarb
(Cairo 的 Rust 包管理器)你可以使用以下命令安装必要的工具:
# 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 安装 Node.js 和 npm(如果尚未安装)
sudo apt-get install nodejs
sudo apt-get install npm
# 安装 StarkNet CLI
pip install starknet-devnet
# 安装 Scarb(Cairo 的 Rust 包管理器)
curl -L https://github.com/software-mansion/scarb/releases/download/latest/scarb-x86_64-unknown-linux-gnu.tar.gz | tar xz
sudo mv scarb /usr/local/bin
使用以下命令启动 StarkNet Devnet:
starknet-devnet
此命令将在 http://localhost:5000
启动一个本地的 StarkNet Devnet 实例。
创建一个新的 Rust 项目并添加 Cairo 的必要依赖项。运行以下命令:
cargo new starknet\_counter
cd starknet\_counter
将以下依赖项添加到你的 Cargo.toml
文件中:
[dependencies]
cairo = "0.1"
starknet = { git = "https://github.com/starkware-libs/cairo.git" }
创建一个名为 src/main.rs
的文件,并添加以下代码用于一个简单的计数器合约:
use cairo::contract;
use cairo::types::felt::Felt252;
use cairo::starknet::storage::Storage;
use cairo::starknet::types::Address;
#[contract]
mod counter {
use super::*;
#[storage]
struct Storage {
counter: Felt252,
}
#[constructor]
fn new() -> Storage {
Storage {
counter: Felt252::from(0),
}
}
#[external]
fn increase_counter(storage: &mut Storage, amount: Felt252) {
storage.counter += amount;
}
#[view]
fn get_counter(storage: &Storage) -> Felt252 {
storage.counter
}
}
这个合约定义了一个简单的计数器,包含两个函数:
increase_counter(amount: Felt252)
: 按指定数量增加计数器。get_counter() -> Felt252
: 获取计数器的当前值。使用 Scarb 工具编译合约:
scarb build
这将在 target
目录中生成必要的编译文件。
使用 StarkNet CLI 将编译后的合约部署到 StarkNet Devnet:
starknet deploy --contract target/release/starknet_counter.sierra.json --abi target/release/starknet_counter.abi.json --network localhost
记录部署输出中的合约地址和交易哈希。你需要合约地址来与合约进行交互。
要与合约交互,我们将使用 StarkNet CLI。首先,让我们将计数器增加 10。
starknet invoke --function increase_counter --inputs 10 --address <contract_address> --abi target/release/starknet_counter.abi.json --network localhost
将 <contract_address>
替换为从部署步骤中获得的实际合约地址。
接下来,让我们查询计数器的当前值。
starknet call --function get_counter --address <contract_address> --abi target/release/starknet_counter.abi.json --network localhost
这应该返回 10
,因为我们刚刚将计数器增加了 10。
L1-L2 消息传递是指 Layer-1 区块链与其 Layer-2 解决方案之间的通信协议。Layer-2 解决方案旨在处理主区块链之外的交易,以提高可扩展性、降低交易费用并增加吞吐量。这些解决方案仍然必须与 L1 区块链进行交互,以确保交易的安全性、互操作性和最终性。
L1-L2 消息传递通常涉及几个关键步骤:
2. 生成证明:
3. 向 L1 提交证明:
4. 在 L1 上验证和最终确定:
创建一个新的 Rust 项目并添加 Cairo 的必要依赖项。运行以下命令:
cargo new l1_l2_messaging
cd l1_l2_messaging
将以下依赖项添加到你的 Cargo.toml
文件中:
[dependencies]
cairo-lang = "0.6.2"
starknet = { git = "https://github.com/starkware-libs/starknet-rs.git" }
创建一个名为 src/main.rs
的文件,并添加以下 L1-L2 消息传递合约代码:
use cairo::contract;
use cairo::types::felt::Felt252;
use cairo::starknet::storage::Storage;
use cairo::starknet::types::Address;
#[contract]
mod l1_l2_messaging {
use super::*;
#[storage]
struct Storage {
message: Felt252,
}
#[constructor]
fn new() -> Storage {
Storage {
message: Felt252::from(0),
}
}
#[external]
fn send_message(storage: &mut Storage, sender: Felt252, message: Felt252) {
storage.message = message;
emit_message_sent(sender, message);
}
#[view]
fn get_message(storage: &Storage) -> Felt252 {
storage.message
}
#[event]
fn emit_message_sent(sender: Felt252, message: Felt252);
}
使用 Scarb 工具编译合约:
scarb build
使用 StarkNet CLI 将编译后的合约部署到 StarkNet Devnet:
starknet deploy --contract target/release/l1_l2_messaging.sierra.json --abi target/release/l1_l2_messaging.abi.json --network localhost
记录部署输出中的合约地址。
starknet invoke --function send_message --inputs 123 456 --address <contract_address> --abi target/release/l1_l2_messaging.abi.json --network localhost
将 <contract_address>
替换为从部署步骤中获得的实际合约地址。这里,123
是发送者的地址,456
是消息。
2. 获取存储的消息:
starknet call --function get_message --address <contract_address> --abi target/release/l1_l2_messaging.abi.json --network localhost
emit_message_sent
,包含发送者和消息。要进一步探索 StarkNet 和 Cairo,以下资源将为你提供全面的指南、文档和社区支持:
这些资源将帮助你开始在 StarkNet 上进行开发,并使用 Cairo 编写智能合约,为你提供必要的工具、教程和社区支持,以构建可扩展和安全的 dApps。
🔗 与我联系: 在 Twitter 上关注
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!