Reed-Solomon Golang 测试

简介

纠删码
Reed-Solomon

测试

reedsolomon项目下有examples目录,使用里面的程序进行测试。
编译测试程序:

l@WIN10-901211241:reedsolomon$cd examples/
l@WIN10-901211241:examples$go build simple-encoder.go 
l@WIN10-901211241:examples$go build simple-decoder.go 

encode

simple-encoder 测试程序参数:

参数 解释
-data 指定数据块数量,默认为4
-par 指定冗余块数量,默认为2
-out 指定分割后文件存放目录
filename 输入数据的文件名

测试1

参数设置 -data 4 -par 6

l@WIN10-901211241:examples$./simple-encoder -data 4 -par 6 -out . input
Opening input
File split into 10 data+parity shards with 358 bytes/shard.
Writing to input.0
Writing to input.1
Writing to input.2
Writing to input.3
Writing to input.4
Writing to input.5
Writing to input.6
Writing to input.7
Writing to input.8
Writing to input.9
l@WIN10-901211241:examples$ls -l input*
-rwxrwxrwx 1 luxq luxq 1432 Jul 15 15:25 input
-rwxrwxrwx 1 luxq luxq  358 Jul 15 15:52 input.0
-rwxrwxrwx 1 luxq luxq  358 Jul 15 15:52 input.1
-rwxrwxrwx 1 luxq luxq  358 Jul 15 15:52 input.2
-rwxrwxrwx 1 luxq luxq  358 Jul 15 15:52 input.3
-rwxrwxrwx 1 luxq luxq  358 Jul 15 15:52 input.4
-rwxrwxrwx 1 luxq luxq  358 Jul 15 15:52 input.5
-rwxrwxrwx 1 luxq luxq  358 Jul 15 15:52 input.6
-rwxrwxrwx 1 luxq luxq  358 Jul 15 15:52 input.7
-rwxrwxrwx 1 luxq luxq  358 Jul 15 15:52 input.8
-rwxrwxrwx 1 luxq luxq  358 Jul 15 15:52 input.9

原始文件 input 长度为 1432,分割为4块,每块长 358,然后又生成了6个冗余块。
在Reed-Solomon 算法中,纠删码编码的前M块数据是文件原始数据,后N块数据是冗余数据。
手动拼接可以发现和原始数据一致。

l@WIN10-901211241:examples$cat input.0 input.1 input.2 input.3 > restore
l@WIN10-901211241:examples$md5sum restore input
0076c987f6cc5e98919b0b9403b12b5f  restore
0076c987f6cc5e98919b0b9403b12b5f  input

测试2

参数设置 -data 5 -par 4

l@WIN10-901211241:examples$./simple-encoder -data 5 -par 4 -out . input 
Opening input
File split into 9 data+parity shards with 287 bytes/shard.
Writing to input.0
Writing to input.1
Writing to input.2
Writing to input.3
Writing to input.4
Writing to input.5
Writing to input.6
Writing to input.7
Writing to input.8
l@WIN10-901211241:examples$ls -l input*
-rwxrwxrwx 1 luxq luxq 1432 Jul 15 15:25 input
-rwxrwxrwx 1 luxq luxq  287 Jul 15 15:33 input.0
-rwxrwxrwx 1 luxq luxq  287 Jul 15 15:33 input.1
-rwxrwxrwx 1 luxq luxq  287 Jul 15 15:33 input.2
-rwxrwxrwx 1 luxq luxq  287 Jul 15 15:33 input.3
-rwxrwxrwx 1 luxq luxq  287 Jul 15 15:33 input.4
-rwxrwxrwx 1 luxq luxq  287 Jul 15 15:33 input.5
-rwxrwxrwx 1 luxq luxq  287 Jul 15 15:33 input.6
-rwxrwxrwx 1 luxq luxq  287 Jul 15 15:33 input.7
-rwxrwxrwx 1 luxq luxq  287 Jul 15 15:33 input.8

原始文件 input 长度为 1432,分割为5块,由于长度不足所以会在第5个块填充3个字节0数据,每块长 287,然后又生成了4个冗余块。

l@WIN10-901211241:examples$cat input.0 input.1 input.2 input.3 input.4 > restore 
l@WIN10-901211241:examples$ls -l restore input
-rwxrwxrwx 1 luxq luxq 1432 Jul 15 15:25 input
-rwxrwxrwx 1 luxq luxq 1435 Jul 15 15:43 restore

测试3

参数设置 -data 3 -par 3,重复执行两次编码,查看编码的结果是否完全相同

l@WIN10-901211241:examples$./simple-encoder -data 3 -par 3 -out . input 
l@WIN10-901211241:examples$md5sum input*
0076c987f6cc5e98919b0b9403b12b5f  input
8b552e186349f17138b13115380e06a8  input.0
ec2696ca31e2fb44fc4e5145f4a4ba0f  input.1
c1b87d5e3a47b64375aa680e27e5126e  input.2
23b00199ea883baf56dd5237fe5d7200  input.3
a768cbeb3f6f4c74f1d4897e2e042137  input.4
42112dde5ae1f69497e481e3e9e139d7  input.5
l@WIN10-901211241:examples$rm input.*
l@WIN10-901211241:examples$./simple-encoder -data 3 -par 3 -out . input 
l@WIN10-901211241:examples$md5sum input*
0076c987f6cc5e98919b0b9403b12b5f  input
8b552e186349f17138b13115380e06a8  input.0
ec2696ca31e2fb44fc4e5145f4a4ba0f  input.1
c1b87d5e3a47b64375aa680e27e5126e  input.2
23b00199ea883baf56dd5237fe5d7200  input.3
a768cbeb3f6f4c74f1d4897e2e042137  input.4
42112dde5ae1f69497e481e3e9e139d7  input.5

输入相同的数据和参数,编码得到的数据也是相同的。

decode

simple-decoder 测试程序参数:

参数 解释
-data 指定数据块数量,默认为4
-par 指定冗余块数量,默认为2
-out 指定恢复后的文件名
filename.ext 输入数据块的文件名前缀

测试1

参数设置 -data 4 -par 6
期望:删除小于6个任意数据块可以恢复原始数据

极端情况,删除4个原始数据块 input.0 input.1 input.2 input.3

l@WIN10-901211241:examples$rm input.0 input.1 input.2 input.3 
l@WIN10-901211241:examples$./simple-decoder -data 4 -par 6 -out restore input
Opening input.0
Error reading file open input.0: no such file or directory
Opening input.1
Error reading file open input.1: no such file or directory
Opening input.2
Error reading file open input.2: no such file or directory
Opening input.3
Error reading file open input.3: no such file or directory
Opening input.4
Opening input.5
Opening input.6
Opening input.7
Opening input.8
Opening input.9
Verification failed. Reconstructing data
Writing data to restore
l@WIN10-901211241:examples$md5sum input restore 
0076c987f6cc5e98919b0b9403b12b5f  input
0076c987f6cc5e98919b0b9403b12b5f  restore

数据成功恢复.

测试2

参数设置 -data 5 -par 4
期望:删除小于4个任意数据块可以恢复原始数据

删除数据块 input.0 input.1 input.2

l@WIN10-901211241:examples$rm input.0 input.1 input.2 
l@WIN10-901211241:examples$./simple-decoder -data 5 -par 4 -out restore input
Opening input.0
Error reading file open input.0: no such file or directory
Opening input.1
Error reading file open input.1: no such file or directory
Opening input.2
Error reading file open input.2: no such file or directory
Opening input.3
Opening input.4
Opening input.5
Opening input.6
Opening input.7
Opening input.8
Verification failed. Reconstructing data
Writing data to restore

使用 vimdiff input restore 进行文件对比,可以发现恢复后的文件比原始文件在最后多了三个字节0数据,这个正是在encode时由于数据长度不够分片而填充的数据。

文件对比

注:算法在切片时填充了数据,最终恢复的数据包含了填充数据。调用方可以提前计算,对原始数据使用PKCS 进行填充,解码之后再去掉填充,达到完美的恢复效果。

你可能感兴趣的:(区块链)