首页 > 其他分享 >区块链挖矿实验

区块链挖矿实验

时间:2024-01-19 18:23:12浏览次数:30  
标签:hash value 实验 time return 区块 data def 挖矿

一、实验目的

了解区块链挖矿原理及过程。

二、实验器材

pycharm+python3.11

三、实验内容
实验要求:在前面已经配置好的实验环境和实验三编写的单向散列函数实现程序的基础给程序添加计时功能,进行下列实验:

(1)找一个文件M,将文件中的汉字和标点符号用区位码代替生成一个数字字符串,如果是英文的文件,将英文、标点符号和空格都用ASCII代替,转换的程序可以自己编写程序,也可以调用别人的程序。转换之后计算该文件的单向散列函数值H(M),然后通过在该散列函数值后面添加随机数的方法,即进一步计算H(H(M)||R)的方法进行挖矿。

转换程序:

 1 def strQtoCode(s):
 2 """将汉字转换为区位码"""
 3 # 获取汉字的Unicode编码
 4 unicode_code = ord(s)
 5 # 根据Unicode编码计算区位码
 6 zone_code = (unicode_code - 0x4E00) % 94 + 1
 7 return zone_code
 8 
 9 def strEtoCode(s):
10 return ord(s)
11 
12 
13 def convert_file_content(file_path):
14 with open(file_path, 'r', encoding='utf-8') as f:
15 content = f.read()
16 
17 result = []
18 for char in content:
19 if '\u4e00' <= char <= '\u9fa5': # 汉字
20 result.append(strQtoCode(char))
21 elif '\u0020' <= char <= '\u007e': # 英文、标点、空格
22 result.append(strEtoCode(char))
23 return ''.join(list(map(str,result)))
24 
25 
26 # 测试代码
27 if __name__ == "__main__":
28 file_path = input("请输入文件路径: ")
29 print(convert_file_content(file_path))

结果输出:

计算该文件单向散列函数值H(M)并添加随机数进行挖矿:

 1 import struct
 2 import random
 3 
 4 def F(x, y, z):
 5 return (x & y) | (~x & z)
 6 
 7 
 8 def G(x, y, z):
 9 return (x & y) | (x & z) | (y & z)
10 
11 
12 def H(x, y, z):
13 return x ^ y ^ z
14 
15 
16 def left_rotate(n, b):
17 return ((n << b) | (n >> (32 - b))) & 0xFFFFFFFF
18 
19 
20 def padding(message):
21 length = len(message) * 8 % 64 # Corrected this line
22 padding = b'\x80' + b'\x00' * ((56 - (length + 1) % 64) % 64) + struct.pack('<Q', length)
23 return message + padding
24 
25 
26 def md4(message):
27 message = padding(message)
28 num_blocks = len(message) // 64 # Calculate the number of blocks
29 
30 A = 0x67452301
31 B = 0xEFCDAB89
32 C = 0x98BADCFE
33 D = 0x10325476
34 
35 for i in range(num_blocks):
36 X = struct.unpack('<16I', message[i * 64:(i + 1) * 64]) # Process one block at a time
37 
38 a = A
39 b = B
40 c = C
41 d = D
42 
43 for j in range(16):
44 k = F(b, c, d)
45 temp = left_rotate(a + k + X[j], 3)
46 a = d
47 d = c
48 c = b
49 b = temp
50 
51 for j in range(16):
52 k = G(b, c, d)
53 temp = left_rotate(a + k + X[(j * 5 + 1) % 16], 7)
54 a = d
55 d = c
56 c = b
57 b = temp
58 
59 for j in range(16):
60 k = H(b, c, d)
61 temp = left_rotate(a + k + X[(j * 3 + 5) % 16], 11)
62 a = d
63 d = c
64 c = b
65 b = temp
66 
67 A = (A + a) & 0xFFFFFFFF
68 B = (B + b) & 0xFFFFFFFF
69 C = (C + c) & 0xFFFFFFFF
70 D = (D + d) & 0xFFFFFFFF
71 
72 digest = struct.pack('<4I', A, B, C, D)
73 return digest[::-1] # Return the digest in the correct order (LSB first)
74 
75 
76 message = b'104101108108111712833'
77 print('Message:', message)
78 result1 = md4(message).hex()
79 print('H(M):',result1)
80 
81 # # 生成一个介于1和10000之间的随机整数
82 random_number = random.randint(1, 10000)
83 
84 # 将原始结果和随机整数拼接在一起
85 result = result1 + str(random_number)
86 result = result.encode("utf-8")
87 print('Message:',result)
88 print('H(H(M)//R):', md4(result).hex())

结果输出:

(2)设置单向散列函数值为256比特,假设要求H(H(M)||R)< 2250,首先设置R=0,计算H(H(M)||R),首先将R值设置为0,然后每次将R值增加1计算对应的单向散列函数值,直到找到满足要求的单向散列函数值。记下对应的随机数、单向散列函数值和找到满足要求的函数值的时间。

程序:

 1 import hashlib
 2 import time
 3 
 4 # 定义哈希函数的比特长度
 5 hash_bits = 256
 6 
 7 # 计算 H(H(M)||R)
 8 def calculate_hash(data, R):
 9 data_with_R = data + str(R) # 将R添加到数据后面
10 hashed_data_with_R = hashlib.sha256(data_with_R.encode()).hexdigest() # 计算 H(M)||R
11 final_hash = hashlib.sha256(hashed_data_with_R.encode()).hexdigest() # 计算 H(H(M)||R)
12 return final_hash
13 
14 # 计算满足条件的 R 和对应的哈希值
15 def find_hash_value(data):
16 R = 0
17 while True:
18 hash_value = calculate_hash(data, R)
19 if int(hash_value, 16) < 2**250: # 将哈希值转换为整数并进行比较
20 return R, hash_value
21 R += 1
22 
23 # 主程序
24 data = "了解区块链原理及挖矿过程" # 假设的输入数据
25 start_time = time.time() # 记录开始时间
26 R, hash_value = find_hash_value(data) # 寻找满足条件的 R 和对应的哈希值
27 end_time = time.time() # 记录结束时间
28 
29 print(f"满足条件的 R 值:{R}")
30 print(f"对应的哈希值:{hash_value}")
31 print(f"找到满足要求的函数值的时间:{end_time - start_time} 秒")

结果输出:

(3)要求H(H(M)||R)< 2240,仍然利用(2)的方法寻找满足要求的单向散列函数值,直到找到。记下对应的随机数,单向散列函数值和找到满足要求的函数值的时间。

程序:

 1 import hashlib
 2 import time
 3 
 4 # 定义哈希函数的比特长度
 5 hash_bits = 256
 6 
 7 # 计算 H(H(M)||R)
 8 def calculate_hash(data, R):
 9 data_with_R = data + str(R) # 将R添加到数据后面
10 hashed_data_with_R = hashlib.sha256(data_with_R.encode()).hexdigest() # 计算 H(M)||R
11 final_hash = hashlib.sha256(hashed_data_with_R.encode()).hexdigest() # 计算 H(H(M)||R)
12 return final_hash
13 
14 # 计算满足条件的 R 和对应的哈希值
15 def find_hash_value(data):
16 R = 0
17 while True:
18 hash_value = calculate_hash(data, R)
19 if int(hash_value, 16) < 2**240: # 将哈希值转换为整数并进行比较
20 return R, hash_value
21 R += 1
22 
23 # 主程序
24 data = "了解区块链原理及挖矿过程" # 假设的输入数据
25 start_time = time.time() # 记录开始时间
26 R, hash_value = find_hash_value(data) # 寻找满足条件的 R 和对应的哈希值
27 end_time = time.time() # 记录结束时间
28 
29 print(f"满足条件的 R 值:{R}")
30 print(f"对应的哈希值:{hash_value}")
31 print(f"找到满足要求的函数值的时间:{end_time - start_time} 秒")

结果输出:

标签:hash,value,实验,time,return,区块,data,def,挖矿
From: https://www.cnblogs.com/doris510/p/17975310

相关文章

  • 定期监控是否存在之前的挖矿程序,并完成清理
    (1)编写一个脚本vi clean_host.sh  #!/bin/bashpid_cpu=`psaux|grep-vPID|sort-nr-k3|head-n1|awk'{print$2,$3,$11}'`pid=`echo$pid_cpu|awk'{print$1}'`cpu=`echo$pid_cpu|awk'{print$2}'`cmd=`echo$pid_cpu|awk'......
  • 农业遥感大数据预警技术*省工程实验室
    1.农业遥感大数据预警技术*省工程实验室针对遥感大数据不确定性建模、多源信息融合、机器学习及数据挖掘方法、平台建设等问题,开展了遥感大数据在农业方面的技术研究及应用,加快高校与企业的技术成果向现实生产力转化,提升社会服务和产业持续发展能力。 天空地一体......
  • 瑞熙贝通高校智慧实验室安全培训考试平台v3.0
    随着科技的不断发展,实验室安全培训考试平台已经成为保障实验室安全的重要工具。该平台通过在线培训、模拟考试和实时监控等功能,为实验室工作人员提供全面的安全知识和技能培训,有效降低实验室事故的发生率。本系统包括学习、练习测试、考试三大功能模块及相关管理功能,共有安全通识、......
  • 心脏发泡实验怎么做,危险吗
    心脏发泡实验怎么做,危险吗姚园副主任医师心血管内科武汉大学人民医院三甲|全国第40去咨询 百度健康内容审核团队优选心脏发泡实验不危险,操作方法如下:做发泡试验时,患者仰卧于检查床上,医生在其肘部静脉留置一输液用套管针,当患者做Valsalva动作(即深吸......
  • 阿里云服务器告警提示挖矿,怎么办
    前言最近我们团队为了研究数据湖相关的技术,在阿里云服务中购买了云服务器,但是突然被告警提示被挖矿,而且要在一定期限内解决挖矿问题,否则就会被关停服务。本篇记录了我们处理挖矿告警的过程,仅供参考。一、服务器为什么会被告警挖矿?云服务器中被恶意安装了脚本,然后脚本运行占用......
  • 震惊!!!核算中心实验小学的大教练突然宣布惊天秘闻……
    本周日\(8:00\sim12:00\)比赛?与直升有关?惊Σʕ̯•͡˔•̯᷅"ʔ。所以是复习性质的鲜花。从头开始吧!:线段树这是一个数据结构:区修区查。是:\______________________01______________________/||\__________02__________/\__________03____......
  • eNSP模拟实验——OSPF基本配置
    1.利用eNSP搭建网络拓扑,并对三个主机进行基础配置,包括IP地址、子网掩码、网关。配置完成后,全选启动设备。如果启动设备速度过慢,可以一个一个启动。其中,所有路由器选择AR2220,所有接口的掩码地址统一配置成255.255.255.0。 2.配置三个路由器各自物理接口的IP地址,其中每个路由......
  • 基于WEB的开放性实验室管理系统
    现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本开放性实验室管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事......
  • 实验三Spark 读取文件系统的数据
    Spark读取文件系统的数据(1)在spark-shell中读取Linux系统本地文件“/home/hadoop/test.txt”,然后统计出文件的行数;(2)在spark-shell中读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;(3)编写独立应用程序,读取HDFS系统文件“/u......
  • 从0到1:实验室设备借用小程序开发笔记
    概论实验室设备借用小程序,适合各大高校,科技园区,大型企业集团的实验室设备借用流程,通过数字化的手段进一步提升相关单位设备保障水平,规范实验室和设备管理,用户通过手机小程序扫描设备的二维码,可以方便快捷的提交个人资料,办理借用手续,从而大大提高了工作效率功能规划1.设备清单:展......