自己写了个冒泡排序练手。
内容如下:
from util import if_else
from Compiler import types
def maopao(a):
print_ln("hello: %s", a.reveal())
n = len(a)
@for_range(n)
def _(i):
@for_range(n)
def _(j):
@if_((a[i] > a[j]).reveal())
def _():
# print_ln("!!!")
tmp = a[i]
a[i] = a[j]
a[j] = tmp
return a
n = 5
a = Array(n, sfix)
@for_range_opt(n)
def _(i):
a[i] = sfix.get_input_from(0)
d = maopao(a)
print_str("%s", d.reveal())
print_ln('Data receive success !!')
程序解释:
首先定义了一个函数,都是python语法,实现冒泡排序
然后指定数组大小n=5。定义一个sfix类型的数组a。sfix指安全的定点数(Secret fixed-point number represented as secret integer.)。
通过for循环将参与方的数据写入数组a。其中,get_input_from(0),0代表参与方的编号(ID)(这里是0号)。
注意for循环的写法,跟python语法还是有区别的。
冒泡排序流程就不解释了,大家都懂。注意一个坑:
在if条件语句里不可以写
a[i] > a[j]
要写:
(a[i] > a[j]).reavel()
否则会出错。原因暂时不知道(我也是初学者)。猜测,他们的比较结果不是一个单值,而是一个类或者元组之类的东西,必须通过调用reavel才能返回他们的值。
程序编译与执行:
1. 程序编译:merge_and_sort是程序文件名,源代码放在Programs/Source/中
./compile.py -B 32 merge_and_sort
2. 生成证书与密钥文件,建立安全的通道:在这个程序里只有一方参与计算。
Scripts/setup-ssl.sh 1
3. 输入参与方的数据:数据存储在d0.dat文件里,这里是五个数,代表一个数组。
cat testData_gp/d0.dat > Player-Data/Input-P0-0
4. 执行程序:
./semi-party.x -N 1 -p 0 merge_and_sort