区块链 节点专题(3)SPV轻节点怎么用 chainmaker为例

本文档介绍了SPV轻节点在独立部署和组件集成两种方式下的使用,支持SPV和Light模式。在SPV模式下,轻节点作为验证节点,通过区块头和部分数据提供交易证明服务;在Light模式下,它可以同步区块和组织内交易。文中还给出了SPV模式下客户端通过gRPC验证交易有效性的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9.1.1. SPV轻节点概述

SPV轻节点在spvlight两种模式下,支持独立部署和作为组件集成的方式使用:

  • 独立部署,单独一个进程。在spv模式下,作为验证节点,通过同步区块头和部分其他数据,可对外提供交易存在性及有效性证明服务;在light模式下,作为轻节点,可同步区块及同组织内的交易。

  • 作为组件集成进其他项目,与其他项目在一个进程中。在spv模式下,调用启动以获取业务链的数据,可提供交易存在性及有效性证明功能;在light模式下,可同步和查询区块和同组织内的交易数据,并支持用户注册回调函数,在提交区块后将被执行。

SPV模式独立部署时,Client端通过grpc验证交易有效性示例

package usecase

import (
	"context"
	"log"

	"chainmaker.org/chainmaker/spv/v2/pb/api"
	"google.golang.org/grpc"
)

func useCase() {
	// 1.构造Client
	conn, err := grpc.Dial("127.0.0.1:12308", grpc.WithInsecure())
	if err != nil {
		log.Fatal(err)
		return
	}
	client := api.NewRpcProverClient(conn)

	// 2.构造交易验证信息
	request := &api.TxValidationRequest{
		ChainId: "chainId", // 链Id
		BlockHeight: 1,     // 交易所在区块高度
		//Index: -1,        // 此版本未验证该字段,不需要填写
		TxKey: "TxId",      // 交易Id
		ContractData: &api.ContractData{
			Name: "contractName",  // 合约名
			Method: "method",              // 方法名
			Version: "version",            // 合约版本
			Params: []*api.KVPair{
				{Key: "argName1", Value: []byte("argValue1")},  // Key是所调用合约方法的参数名,Value是参数值
				{Key: "argName2", Value: []byte("argValue2")},
				{Key: "argName3", Value: []byte("argValue3")},
			},
			Extra: nil,    // 预留扩展字段
		},
		Timeout: 5000,     // 验证超时时间 
		Extra: nil,        // 预留扩展字段
	}

	// 3.验证交易有效性
	response, err := client.ValidTransaction(context.Background(), request)
	if err != nil {
		log.Fatal(err)
	}

	if int32(response.Code) != 0 {
		log.Fatal(err)
	}

	// 4.用户其他逻辑

}

9. SPV轻节点 部署和使用文档 — chainmaker-docs v2.2.1 documentation

### 关于区块链SPV仿真代码 #### Python实现的比特币SPV客户端简易版本 下面是一个简单的Python程序来模拟一个比特币SPV钱包的工作流程。此代码展示了如何通过Merkle树证明交易的存在: ```python import hashlib def hash256(data): sha = hashlib.sha256() sha.update(data.encode(&#39;utf-8&#39;)) return sha.hexdigest() class MerkleTree: def __init__(self, transactions=None): self.transactions = transactions or [] self.tree = [] def build_tree(self): current_level = list(map(hash256, self.transactions)) while len(current_level) > 1: next_level = [] for i in range(0, len(current_level), 2): combined_hash = &#39;&#39;.join([current_level[i], current_level[i + 1] if (i + 1) < len(current_level) else &#39;&#39;]) next_level.append(hash256(combined_hash)) current_level = next_level self.tree.append(next_level) root = current_level[0] if current_level else &#39;&#39; return root def verify_merkle_proof(target_transaction, merkle_branches, target_index): proof_hashes = [hash256(branch).encode() for branch in merkle_branches] computed_hash = hash256(target_transaction) for idx, sibling in enumerate(proof_hashes): is_right_node = ((target_index >> idx) & 1) == 0 if is_right_node: computed_hash = hash256(computed_hash + sibling.decode()) else: computed_hash = hash256(sibling.decode() + computed_hash) return computed_hash # Example usage: transactions = [ "tx_1", "tx_2", "tx_3" ] merkle_tree = MerkleTree(transactions=transactions) root = merkle_tree.build_tree() print(f"Merkle Root: {root}") proof_indices = [0] branch = ["tx_2", "a9c7d4fcbdd"] # Assuming this comes from the full node as part of SPV verification process. verified_root = verify_merkle_proof( target_transaction="tx_1", merkle_branches=branch, target_index=proof_indices[0]) if verified_root == root: print("The transaction exists within the block.") else: print("Failed to validate.") ``` 上述代码创建了一个用于构建默克尔树并验证特定交易是否属于该区块的方法[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软件工程小施同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值