以太坊智能合约Event的哈希值验证

本文介绍了一次以太坊智能合约Event部分的哈希值测试过程,使用golang验证了Received事件签名的哈希值,通过对比预设值确认了keccak256哈希函数的正确性。

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

最近在研究以太坊,看到智能合约的Event部分,在etherscan上看到下面这张图

标题

就是这个topic0,据说这是Received(blablabal)那一串的哈希值。怀着动手一试的想法,我用golang测了一下,诚不欺我也。代码如下:

t.Run("test keccak256 event", func(t *testing.T) {
		var testcases = []struct {
			str string
			want string
		} {
			{
				//"event Transfer(address indexed from, address indexed to, uint tokens)",
				//"event Transfer(address, address, uint)",
				"Transfer(address,address,uint256)",
				"ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
			},
			{
				"Received(uint256,address,bytes)",
				"606834f57405380c4fb88d1f4850326ad3885f014bab3b568dfbf7a041eef738",
			},
		}
		for _, oneCase := range testcases {
			var keccak256Hash hash.Hash
			var eventFunHash string

			keccak256Hash = sha3.NewLegacyKeccak256()
			keccak256Hash.Write([]byte(oneCase.str))
			eventFunHash = hex.EncodeToString(keccak256Hash.Sum(nil))

			if eventFunHash !=  oneCase.want {
				t.Error("keccak256 error")
				t.Error("want:", oneCase.want)
				t.Error("got:", eventFunHash)
				return
			}
		}
	})

(全文完)

### 将云服务器上的数据上传至区块链教程 #### 准备工作 为了实现这一目标,需先确认所使用的云计算平台支持API访问以及文件操作接口。通常情况下,主流的云服务提供商都提供了详尽的文档来指导开发者如何通过编程方式管理存储资源[^1]。 #### 构建智能合约以太坊或其他兼容EVM(Ethereum Virtual Machine)环境里部署一个用于接收并记录哈希值智能合约是非常必要的。这一步骤确保了即使原始数据不在链上存续,也能验证其存在性和完整性。 ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract DataRegistry { event LogUpload(address indexed sender, bytes32 hash); function uploadData(bytes32 _hash) public returns (bool success){ emit LogUpload(msg.sender,_hash); return true; } } ``` #### 数据处理与加密 从云服务器获取待上传的数据后,对其进行散列运算得到固定长度的消息摘要。这里推荐采用SHA-256算法,因其具备良好的抗碰撞性能,在密码学领域广泛应用。 ```python import hashlib def calculate_sha256(file_path): sha256_hash = hashlib.sha256() with open(file_path,"rb") as f: for byte_block in iter(lambda: f.read(4096),b""): sha256_hash.update(byte_block) return sha256_hash.hexdigest() ``` #### Web3交互逻辑编写 利用Web3.py库可以方便地连接到指定节点并与之通信。下面给出了一段Python脚本片段展示怎样调用之前定义好的`uploadData()`方法向区块链提交计算所得的哈希值。 ```python from web3 import Web3 w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID')) account = w3.eth.account.privateKeyToAccount('YOUR_PRIVATE_KEY') data_registry_contract_address='CONTRACT_ADDRESS' abi=[{"constant":false,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"uploadData","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},...] contract=w3.eth.contract(address=data_registry_contract_address, abi=abi) tx={'to': data_registry_contract_address, 'value': 0, 'gas': 2000000, 'gasPrice': w3.toWei('21', 'gwei'), 'nonce': w3.eth.getTransactionCount(account.address), 'chainId': 1} file_hash="CALCULATED_HASH_VALUE" hex_file_hash=int(file_hash,16).to_bytes((len(file_hash)+1)//2,'big') signed_txn = account.signTransaction(dict(tx,**{'data': contract.encodeABI(fn_name='uploadData', args=[hex_file_hash])})) txn_hash=w3.eth.sendRawTransaction(signed_txn.rawTransaction) print(f'Transaction submitted successfully! Hash:{txn_hash.hex()}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值