|
| 1 | +# SHARP(Shared Prover)技术概述 |
| 2 | + |
| 3 | +SHARP 是 StarkWare 开发的一种共享证明服务,旨在为多个应用生成有效性证明。它基于 STARK(Scalable Transparent Argument of Knowledge)技术,提供高效、安全的零矩矢证明。 |
| 4 | + |
| 5 | +## **工作原理** |
| 6 | + |
| 7 | +SHARP 的主要功能是接收来自不同应用的证明请求,并生成相应的 STARK 证明。其工作流程如下: |
| 8 | + |
| 9 | +1. **接收请求**:应用程序将交易数据和执行结果发送至 SHARP。 |
| 10 | +2. **生成证明**:SHARP 使用 Cairo 语言编写的程序,对数据进行处理,生成 STARK 证明。 |
| 11 | +3. **提交证明**:将生成的证明提交到以太坊主网,由链上合约验证其有效性。 |
| 12 | + |
| 13 | +## **技术细节** |
| 14 | + |
| 15 | +### **Cairo 语言** |
| 16 | +SHARP 使用 Cairo 编写验证逻辑。Cairo 是一种图灵完备的编程语言,专为生成高效的 STARK 证明而设计。它允许开发者定义复杂的业务逻辑,同时保持高效的证明生成能力。 |
| 17 | + |
| 18 | +### **STARK 证明** |
| 19 | +- **高扩展性**:支持批量处理大量交易,显著提升吞吐量。 |
| 20 | +- **透明性**:不需要可信设置,任何人都可以验证其有效性。 |
| 21 | +- **量子安全**:对抗量子计算攻击提供更高的安全保障。 |
| 22 | + |
| 23 | +## **优势** |
| 24 | + |
| 25 | +- **共享性**:SHARP 可同时为多个应用生成证明,提高计算资源利用率。 |
| 26 | +- **高效性**:通过批量处理交易,显著降低单个应用的计算成本。 |
| 27 | +- **安全性**:利用 STARK 技术,确保交易数据的隐私和完整性。 |
| 28 | + |
| 29 | +## **应用场景** |
| 30 | + |
| 31 | +SHARP 广泛应用于高扩展性和高安全性需求的场景,包括: |
| 32 | +- 去中心化交易所 |
| 33 | +- 支付系统 |
| 34 | +- 区块链游戏 |
| 35 | + |
| 36 | +## **参考资料** |
| 37 | + |
| 38 | +- [解析StarkWare的架构与生态:估值80亿美元的扩展潜力](https://zhuanlan.zhihu.com/p/530091142) |
| 39 | +- [万字拆解 StarkWare:80 亿美元的「以太坊扩展最佳团队」是否高估?](https://web3caff.com/zh/archives/18842) |
| 40 | + |
| 41 | +--- |
| 42 | + |
| 43 | +## **Cairo 示例代码** |
| 44 | + |
| 45 | +### 验证单个计算加密逻辑 |
| 46 | + |
| 47 | +以下是一个简单的 Cairo 程序,用于验证输入是否是某个数的平方。 |
| 48 | + |
| 49 | +```cairo |
| 50 | +%builtins output |
| 51 | +
|
| 52 | +func main{output_ptr : felt*}(): |
| 53 | + let x = 3 |
| 54 | + let y = 9 |
| 55 | + assert x * x = y # 验证 y 是否为 x 的平方 |
| 56 | + return () |
| 57 | +end |
| 58 | +``` |
| 59 | + |
| 60 | +### **代码解释**: |
| 61 | +- **%builtins output**: 声明 Cairo 程序所需的内容构件。 |
| 62 | +- **assert 语句**: 验证 `x` 的平方是否等于 `y`。 |
| 63 | + |
| 64 | +--- |
| 65 | + |
| 66 | +### 批量验证逻辑 |
| 67 | + |
| 68 | +以下展示了一个批量处理交易验证的 Cairo 示例: |
| 69 | + |
| 70 | +```cairo |
| 71 | +%builtins range_check |
| 72 | +
|
| 73 | +from starkware.cairo.common.serialize import serialize_word |
| 74 | +
|
| 75 | +func validate_transactions{range_check_ptr}(transactions: felt*, n: felt) -> (result: felt): |
| 76 | + alloc_locals |
| 77 | + local sum = 0 |
| 78 | + for i in range(n): |
| 79 | + let transaction = [transactions + i] |
| 80 | + assert transaction > 0 # 确保交易金额为正 |
| 81 | + let sum = sum + transaction |
| 82 | + end |
| 83 | + return (sum) |
| 84 | +end |
| 85 | +
|
| 86 | +func main{range_check_ptr}(): |
| 87 | + let (result) = validate_transactions([5, 10, 15], 3) |
| 88 | + serialize_word(result) # 输出验证结果 |
| 89 | + return () |
| 90 | +end |
| 91 | +``` |
| 92 | + |
| 93 | +### **代码解释**: |
| 94 | +- **validate_transactions**:验证多个交易并计算总和。 |
| 95 | +- **assert 语句**:确保每笔交易的金额为正。 |
| 96 | +- **serialize_word**:序列化输出验证结果。 |
| 97 | + |
| 98 | + |
| 99 | +### 批量验证并生成响应的加密哈希 |
| 100 | + |
| 101 | +以下示例显示如何为批量处理交易生成加密哈希: |
| 102 | + |
| 103 | +```cairo |
| 104 | +%builtins range_check pedersen |
| 105 | +
|
| 106 | +from starkware.cairo.common.pedersen_hash import pedersen |
| 107 | +
|
| 108 | +func hash_transactions{range_check_ptr, pedersen_ptr}(transactions: felt*, n: felt) -> (hash: felt): |
| 109 | + alloc_locals |
| 110 | + local hash = 0 |
| 111 | + for i in range(n): |
| 112 | + let transaction = [transactions + i] |
| 113 | + assert transaction > 0 |
| 114 | + let hash = pedersen(hash, transaction) # 将交易金额加入哈希 |
| 115 | + end |
| 116 | + return (hash) |
| 117 | +end |
| 118 | +
|
| 119 | +func main{range_check_ptr, pedersen_ptr}(): |
| 120 | + let transactions = [5, 10, 15] |
| 121 | + let n = 3 |
| 122 | + let (result) = hash_transactions(transactions, n) |
| 123 | + return () |
| 124 | +end |
| 125 | +``` |
| 126 | + |
| 127 | + |
| 128 | +## **Solidity 合约示例** |
| 129 | + |
| 130 | +以下是与 StarkEx 系统交互的 Solidity 合约,用于验证 STARK 证明。 |
| 131 | + |
| 132 | +```solidity |
| 133 | +// SPDX-License-Identifier: MIT |
| 134 | +pragma solidity ^0.8.0; |
| 135 | +
|
| 136 | +interface IStarkVerifier { |
| 137 | + function verifyProof(bytes calldata proof, uint256[] calldata publicInputs) external returns (bool); |
| 138 | +} |
| 139 | +
|
| 140 | +contract StarkProofVerifier { |
| 141 | + IStarkVerifier public starkVerifier; |
| 142 | +
|
| 143 | + constructor(address _verifier) { |
| 144 | + starkVerifier = IStarkVerifier(_verifier); |
| 145 | + } |
| 146 | +
|
| 147 | + function verifyTransactionProof(bytes memory proof, uint256[] memory inputs) public view returns (bool) { |
| 148 | + return starkVerifier.verifyProof(proof, inputs); |
| 149 | + } |
| 150 | +} |
| 151 | +
|
| 152 | +### **批量验证交易的 Solidity 合约** |
| 153 | +
|
| 154 | +以下扩展了批量验证功能,允许验证多个 STARK 证明: |
| 155 | +
|
| 156 | +```solidity |
| 157 | +// SPDX-License-Identifier: MIT |
| 158 | +pragma solidity ^0.8.0; |
| 159 | +
|
| 160 | +interface IStarkVerifier { |
| 161 | + function verifyProof(bytes calldata proof, uint256[] calldata publicInputs) external returns (bool); |
| 162 | +} |
| 163 | +
|
| 164 | +contract BatchStarkProofVerifier { |
| 165 | + IStarkVerifier public starkVerifier; |
| 166 | +
|
| 167 | + constructor(address _verifier) { |
| 168 | + starkVerifier = IStarkVerifier(_verifier); |
| 169 | + } |
| 170 | +
|
| 171 | + function verifyBatchProofs(bytes[] memory proofs, uint256[][] memory inputs) public view returns (bool[] memory) { |
| 172 | + require(proofs.length == inputs.length, "Mismatched inputs and proofs length"); |
| 173 | +
|
| 174 | + bool[] memory results = new bool[](proofs.length); |
| 175 | + for (uint256 i = 0; i < proofs.length; i++) { |
| 176 | + results[i] = starkVerifier.verifyProof(proofs[i], inputs[i]); |
| 177 | + } |
| 178 | + return results; |
| 179 | + } |
| 180 | +} |
| 181 | +``` |
| 182 | + |
| 183 | +### **代码解释**: |
| 184 | +- **批量验证方法**:`verifyBatchProofs` 接收多个证明和输入数组,依次验证每个证明。 |
| 185 | +- **输入长度验证**:确保证明和输入的数组长度一致。 |
| 186 | +- **返回值**:返回一个布尔数组,每个布尔值对应一个证明的验证结果。 |
| 187 | + |
| 188 | +--- |
| 189 | + |
| 190 | +## **链下与链上交互示例** |
| 191 | + |
| 192 | +以下展示了如何将链下生成的 STARK 证明提交至链上验证。 |
| 193 | + |
| 194 | +### **链下 Python 示例**: |
| 195 | + |
| 196 | +```python |
| 197 | +from starkware.crypto.signature.fast_pedersen_hash import pedersen_hash |
| 198 | +from starkware.starknet.services.api.gateway.transaction import InvokeFunction |
| 199 | + |
| 200 | +def generate_proof_and_inputs(transactions): |
| 201 | + # 计算交易的哈希值 |
| 202 | + hash_value = 0 |
| 203 | + for tx in transactions: |
| 204 | + assert tx > 0 # 验证交易金额 |
| 205 | + hash_value = pedersen_hash(hash_value, tx) |
| 206 | + |
| 207 | + # 模拟生成 STARK 证明(伪代码) |
| 208 | + proof = "mock_proof_data" |
| 209 | + public_inputs = [hash_value] |
| 210 | + return proof, public_inputs |
| 211 | + |
| 212 | +# 示例交易数据 |
| 213 | +transactions = [5, 10, 15] |
| 214 | +proof, public_inputs = generate_proof_and_inputs(transactions) |
| 215 | + |
| 216 | +# 提交到链上的交易示例 |
| 217 | +invoke_tx = InvokeFunction( |
| 218 | + contract_address="0xVerifierContractAddress", |
| 219 | + entry_point_selector="verifyTransactionProof", |
| 220 | + calldata=[proof, *public_inputs] |
| 221 | +) |
| 222 | +``` |
| 223 | + |
| 224 | +### **链上 Solidity 合约交互**: |
| 225 | + |
| 226 | +```solidity |
| 227 | +// 提交验证交易 |
| 228 | +contractAddress.verifyTransactionProof(proof, publicInputs); |
| 229 | +``` |
| 230 | + |
0 commit comments