From 7a02715fa655f26546798c26f38b6f0ce24612ed Mon Sep 17 00:00:00 2001 From: fqliao Date: Thu, 20 Mar 2025 17:19:46 +0800 Subject: [PATCH] add mpc dockerfile --- .../mpc/Dockerfile-wedpr-mpc-base-centos | 18 +++ .../mpc/Dockerfile-wedpr-mpc-base-ubuntu | 16 +++ .../mpc/build-mpc-base-centos-image.sh | 1 + .../mpc/build-mpc-base-ubuntu-image.sh | 1 + docker-files/mpc/config/.gitconfig | 11 ++ docker-files/mpc/config/CentOS-Base.repo | 43 ++++++ .../mpc/config/CentOS-SCLo-scl-rh.repo | 33 +++++ docker-files/mpc/config/CentOS-SCLo-scl.repo | 33 +++++ docker-files/mpc/config/mpc-node-conf.tar.gz | Bin 0 -> 3402 bytes docker-files/mpc/config/ssl_cert.tar.gz | Bin 0 -> 19477 bytes .../mpc/scripts/build-mpc-base-ubuntu.sh | 120 +++++++++++++++++ docker-files/mpc/scripts/build-mpc-base.sh | 123 ++++++++++++++++++ docker-files/mpc/scripts/wedpr-mpc-node.sh | 51 ++++++++ 13 files changed, 450 insertions(+) create mode 100644 docker-files/mpc/Dockerfile-wedpr-mpc-base-centos create mode 100644 docker-files/mpc/Dockerfile-wedpr-mpc-base-ubuntu create mode 100644 docker-files/mpc/build-mpc-base-centos-image.sh create mode 100644 docker-files/mpc/build-mpc-base-ubuntu-image.sh create mode 100644 docker-files/mpc/config/.gitconfig create mode 100644 docker-files/mpc/config/CentOS-Base.repo create mode 100644 docker-files/mpc/config/CentOS-SCLo-scl-rh.repo create mode 100644 docker-files/mpc/config/CentOS-SCLo-scl.repo create mode 100644 docker-files/mpc/config/mpc-node-conf.tar.gz create mode 100644 docker-files/mpc/config/ssl_cert.tar.gz create mode 100644 docker-files/mpc/scripts/build-mpc-base-ubuntu.sh create mode 100644 docker-files/mpc/scripts/build-mpc-base.sh create mode 100644 docker-files/mpc/scripts/wedpr-mpc-node.sh diff --git a/docker-files/mpc/Dockerfile-wedpr-mpc-base-centos b/docker-files/mpc/Dockerfile-wedpr-mpc-base-centos new file mode 100644 index 0000000..587dd84 --- /dev/null +++ b/docker-files/mpc/Dockerfile-wedpr-mpc-base-centos @@ -0,0 +1,18 @@ +FROM centos:7 + +ENV PPC_MPC_LIB=/data/app/wedpr/scripts/wedpr-mpc:/data/app/wedpr/scripts/wedpr-mpc/local/lib/:/usr/local/lib/ +ENV PPC_MPC_NO_GATEWAY_LIB=/data/app/wedpr/scripts/wedpr-mpc-no-gateway:/data/app/wedpr/scripts/wedpr-mpc-no-gateway/local/lib/:/usr/local/lib/ + +COPY ./config/mpc-node-conf.tar.gz /data/app/wedpr/scripts/ +COPY ./config/ssl_cert.tar.gz /data/app/wedpr/scripts/ +COPY ./config/CentOS-Base.repo /etc/yum.repos.d/ +COPY ./config/CentOS-SCLo-scl.repo /etc/yum.repos.d/ +COPY ./config/CentOS-SCLo-scl-rh.repo /etc/yum.repos.d/ +COPY ./config/.gitconfig /root/ +COPY ./scripts/build-mpc-base.sh /data/app/wedpr/scripts/ +COPY ./scripts/wedpr-mpc-node.sh /data/app/wedpr/scripts/ + +WORKDIR /data/app/wedpr + +RUN cd /data/app/wedpr/scripts/ && \ + bash build-mpc-base.sh diff --git a/docker-files/mpc/Dockerfile-wedpr-mpc-base-ubuntu b/docker-files/mpc/Dockerfile-wedpr-mpc-base-ubuntu new file mode 100644 index 0000000..d419eb3 --- /dev/null +++ b/docker-files/mpc/Dockerfile-wedpr-mpc-base-ubuntu @@ -0,0 +1,16 @@ +# FROM fiscoorg/wedpr-image:v3.0.0 +FROM ubuntu:22.04 + +ENV PPC_MPC_LIB=/data/app/wedpr/scripts/wedpr-mpc:/data/app/wedpr/scripts/wedpr-mpc/local/lib/:/usr/local/lib/ +ENV PPC_MPC_NO_GATEWAY_LIB=/data/app/wedpr/scripts/wedpr-mpc-no-gateway:/data/app/wedpr/scripts/wedpr-mpc-no-gateway/local/lib/:/usr/local/lib/ + +COPY ./config/mpc-node-conf.tar.gz /data/app/wedpr/scripts/ +COPY ./config/ssl_cert.tar.gz /data/app/wedpr/scripts/ +COPY ./config/.gitconfig /root/ +COPY ./scripts/build-mpc-base-ubuntu.sh /data/app/wedpr/scripts/ +COPY ./scripts/wedpr-mpc-node.sh /data/app/wedpr/scripts/ + +WORKDIR /data/app/wedpr + +RUN cd /data/app/wedpr/scripts/ && \ + bash build-mpc-base-ubuntu.sh diff --git a/docker-files/mpc/build-mpc-base-centos-image.sh b/docker-files/mpc/build-mpc-base-centos-image.sh new file mode 100644 index 0000000..4b66fcf --- /dev/null +++ b/docker-files/mpc/build-mpc-base-centos-image.sh @@ -0,0 +1 @@ +docker build -f Dockerfile-wedpr-mpc-base-centos -t fiscoorg/wedpr-mpc-base-centos:v3.0.0 . diff --git a/docker-files/mpc/build-mpc-base-ubuntu-image.sh b/docker-files/mpc/build-mpc-base-ubuntu-image.sh new file mode 100644 index 0000000..d757843 --- /dev/null +++ b/docker-files/mpc/build-mpc-base-ubuntu-image.sh @@ -0,0 +1 @@ +docker build -f Dockerfile-wedpr-mpc-base-ubuntu -t fiscoorg/wedpr-mpc-base-ubuntu:v3.0.0 . diff --git a/docker-files/mpc/config/.gitconfig b/docker-files/mpc/config/.gitconfig new file mode 100644 index 0000000..c0dfe50 --- /dev/null +++ b/docker-files/mpc/config/.gitconfig @@ -0,0 +1,11 @@ +[pager] + branch = false +[url "https://mirror.ghproxy.com/github.com"] +insteadOf = https://github.com +[http] + version = HTTP/1.1 + postBuffer = 524288000 +[https] + sslVerify = false +[core] + editor = vim diff --git a/docker-files/mpc/config/CentOS-Base.repo b/docker-files/mpc/config/CentOS-Base.repo new file mode 100644 index 0000000..5b74a07 --- /dev/null +++ b/docker-files/mpc/config/CentOS-Base.repo @@ -0,0 +1,43 @@ +# CentOS-Base.repo +# +# The mirror system uses the connecting IP address of the client and the +# update status of each mirror to pick mirrors that are updated to and +# geographically close to the client. You should use this for CentOS updates +# unless you are manually picking other mirrors. +# +# If the mirrorlist= does not work for you, as a fall back you can try the +# remarked out baseurl= line instead. +# +# + +[base] +name=CentOS-$releasever - Base - repo.huaweicloud.com +baseurl=https://repo.huaweicloud.com/centos/$releasever/os/$basearch/ +#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os +gpgcheck=1 +gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7 + +#released updates +[updates] +name=CentOS-$releasever - Updates - repo.huaweicloud.com +baseurl=https://repo.huaweicloud.com/centos/$releasever/updates/$basearch/ +#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates +gpgcheck=1 +gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7 + +#additional packages that may be useful +[extras] +name=CentOS-$releasever - Extras - repo.huaweicloud.com +baseurl=https://repo.huaweicloud.com/centos/$releasever/extras/$basearch/ +#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras +gpgcheck=1 +gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7 + +#additional packages that extend functionality of existing packages +[centosplus] +name=CentOS-$releasever - Plus - repo.huaweicloud.com +baseurl=https://repo.huaweicloud.com/centos/$releasever/centosplus/$basearch/ +#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus +gpgcheck=1 +enabled=0 +gpgkey=https://repo.huaweicloud.com/centos/RPM-GPG-KEY-CentOS-7 diff --git a/docker-files/mpc/config/CentOS-SCLo-scl-rh.repo b/docker-files/mpc/config/CentOS-SCLo-scl-rh.repo new file mode 100644 index 0000000..250d43c --- /dev/null +++ b/docker-files/mpc/config/CentOS-SCLo-scl-rh.repo @@ -0,0 +1,33 @@ +# CentOS-SCLo-rh.repo +# +# Please see http://wiki.centos.org/SpecialInterestGroup/SCLo for more +# information + +[centos-sclo-rh] +name=CentOS-7 - SCLo rh +baseurl=http://mirrors.aliyun.com/centos/7/sclo/$basearch/rh/ +#mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-rh +gpgcheck=1 +enabled=1 +gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo + +[centos-sclo-rh-testing] +name=CentOS-7 - SCLo rh Testing +baseurl=http://buildlogs.centos.org/centos/7/sclo/$basearch/rh/ +gpgcheck=0 +enabled=0 +gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo + +[centos-sclo-rh-source] +name=CentOS-7 - SCLo rh Sources +baseurl=http://vault.centos.org/centos/7/sclo/Source/rh/ +gpgcheck=1 +enabled=0 +gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo + +[centos-sclo-rh-debuginfo] +name=CentOS-7 - SCLo rh Debuginfo +baseurl=http://debuginfo.centos.org/centos/7/sclo/$basearch/ +gpgcheck=1 +enabled=0 +gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo diff --git a/docker-files/mpc/config/CentOS-SCLo-scl.repo b/docker-files/mpc/config/CentOS-SCLo-scl.repo new file mode 100644 index 0000000..6f962ed --- /dev/null +++ b/docker-files/mpc/config/CentOS-SCLo-scl.repo @@ -0,0 +1,33 @@ +# CentOS-SCLo-scl.repo +# +# Please see http://wiki.centos.org/SpecialInterestGroup/SCLo for more +# information + +[centos-sclo-sclo] +name=CentOS-7 - SCLo sclo +baseurl=http://mirrors.aliyun.com/centos/7/sclo/$basearch/sclo/ +#mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-sclo +gpgcheck=1 +enabled=1 +gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo + +[centos-sclo-sclo-testing] +name=CentOS-7 - SCLo sclo Testing +baseurl=http://buildlogs.centos.org/centos/7/sclo/$basearch/sclo/ +gpgcheck=0 +enabled=0 +gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo + +[centos-sclo-sclo-source] +name=CentOS-7 - SCLo sclo Sources +baseurl=http://vault.centos.org/centos/7/sclo/Source/sclo/ +gpgcheck=1 +enabled=0 +gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo + +[centos-sclo-sclo-debuginfo] +name=CentOS-7 - SCLo sclo Debuginfo +baseurl=http://debuginfo.centos.org/centos/7/sclo/$basearch/ +gpgcheck=1 +enabled=0 +gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo \ No newline at end of file diff --git a/docker-files/mpc/config/mpc-node-conf.tar.gz b/docker-files/mpc/config/mpc-node-conf.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6a17959d82aabe6e1479245425dc1151a92349a1 GIT binary patch literal 3402 zcmV-Q4Yl$giwFP!000001MOJZvZF|n&1b&iK290kE%s&1>VZv&9mFD`va&LE5UbeH z*EjcOR%KRZ_teaoW%Vrgm@t8#h;UbUC_D~P+oXpN-xtsh630Ja5Dvp6ynjRR{&};1 z!Uq_`U>Jo762m_1EQX^WUhwZ6*Bho`4EmRs4^hx>RS~p*hR^>&h+gv_1%HeB@w@qW zO)#CA6nRj4q{mixBaQvOoUO9ke293Swt$(Q|jbpC7BRw@<+b;pqp4O^)tCFCHS&QMbOfVUK=dG68?^#Ce?lmn&aqe#ySwuaWHfOA*8bCWRDPLr6^vLzw zjQT7>9TjqgZ2x|JR99AuQ!)4Xql+mKeZ7uNeP2R$!?jeSKE^vM<6*j(|OJVX2iq9znInZ5ypx5D02L=+s_n`-o!}fngj* zXS4E=mxV|#5X)G@kztHI0|Ijt?(yNV=4@@_skSBuM+AY~*Jw0D%4T=a z=(?}oM-rX{M++4Q#%@n(Qn(2zFdR-mFq{Bc*uWy#lxIDrjWNbg4(m_xjNNH)h+4`) zi?GZqjU26HAOe!;U<*d-o(&E}-QUm@K$ahW1m3m=LFd2SF8a;tUE_w`+E44&X=EoFc^x6+jBhjLD7t_spgn}KQgK<0A;ed zLy*13)U?ex>87}N3+gW~agh~cP}xP+1mn~ve|gy(3r$pXdD7QOGrl>&{zE6u*%g5I z67>z<_Wxn1zNY~EL;Z(;ssGSd{YMhS`~LrD;1Bd4e|*({DUvaZ#4?%Wo`^KOcnx3j zInJ62duvbXd|;Bbg}&BCDzJ;A#klV$(%k_Ay8^Q;%DJo@3!+A=)J^yKnd7o=I0Mj_ zt59Lr z{b|+G1A$pwQa>wWewfNGRutPa!vrf!0E9`oX@d$;%weuQmp+vyXdEQoz7d(Nrnx#8Dy=u#lT`zTpJ6K&4se zfr}yc3%ou2J|*HS%wo`yZ5+VqF^vs#*d>a?QyDMvxG$+tlMx&k2{)iGCXs(OK)ZuXd1UE?DdtEihAC?-ikSqU$FYPYGY0Y5URR_jR8y z#gUPTT(@aISsg>nlMhITyLi}W0UJn#PfHbW^mEusGnL6SmSKd~lLceX{m><7Of$ce$ouJS)ni+ax z?UmDGGYLktd#jUIFKRu=e0rS?wB^l6LavQnT6V>5zjG ziGe6i2B5`Y3QYymQ95@(T~*c0UybCHihZ14ag~Rui|8CNYU}`{cwSdR@cdDSsFhUu-152+?4O ze&#&A;#rCy&pDo>~Kcgqu**OSZ~TJoEbCas+t9 zz4Fi%>PfN#9MBe!zY@^dL1GmcD_KpI4l;Iuk8JLTzLf}xocr0%859u31p(Kny5VttJ+DG=}bH5 zv`+)eH5?ZH&f6A}6GC!}>ub#tQ!|@LcF`=9hdYAS%9>8FsV7W7DEEaMs39EJlKl`4 z02w2&MII~c<1Cj!Rb<+OR7vXWPuF%X?(71`o?ROfeM1!C>M;wMitBYhsc~2B41`xK z3I?^=kLTfqCfWsYQ_;>kBoP+s#K*bSIkAaZ1Wv~A;c`%n)2con4R;m#;g;ussnIvC z1f4;%G8YqtL86wSQ5leu&nL6+h}b5ft2emCIWSzOKA7W36yDQzZmkKzc?R^?bZN@6m zE5xQ~h=(k7x~J6ZfPtbKh~^dLH%Lvhq?*PjB|H}N+(R8*>O9N(qU++WQCbF5H2FP#tRJ&0h|Ecd`E4757DHS*zR$}wZ1SywV< zJ_NGIH~C!I`CzZLH(%^JwN=#X_=_Ub58o|rekeaPU|n=!6NT}Tgd|jx@fr%1?y}d< ghsSSf(Z9M*zT+M5c*i^5@qY<_2Z*RS{QxKc04xKotpET3 literal 0 HcmV?d00001 diff --git a/docker-files/mpc/config/ssl_cert.tar.gz b/docker-files/mpc/config/ssl_cert.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..8d961063f86538c62e2ada50d858b6d1f1ccb985 GIT binary patch literal 19477 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 literal 0 HcmV?d00001 diff --git a/docker-files/mpc/scripts/build-mpc-base-ubuntu.sh b/docker-files/mpc/scripts/build-mpc-base-ubuntu.sh new file mode 100644 index 0000000..6082ff1 --- /dev/null +++ b/docker-files/mpc/scripts/build-mpc-base-ubuntu.sh @@ -0,0 +1,120 @@ +#!/bin/bash + +set -e +LANG=en_US.UTF-8 + +LOG_INFO() { + local content=${1} + echo -e "\033[32m[INFO] ${content}\033[0m" +} + +LOG_ERROR() { + local content=${1} + echo -e "\033[31m[ERROR] ${content}\033[0m" +} + + +install_spdz_deps() { + # 安装基本依赖 + apt update + apt install -y wget dos2unix vim automake make yasm git libboost-dev libboost-thread-dev libssl-dev libtool m4 python3 texinfo yasm libgmp-dev libsodium-dev + # 安装特定版本的GCC(类似于CentOS中的devtoolset) + apt install -y software-properties-common + add-apt-repository ppa:ubuntu-toolchain-r/test + apt update + apt install -y g++-11 g++-11-multilib + + # 配置环境变量以使用新安装的GCC版本 + echo "export CC=/usr/bin/gcc-11" >> ~/.bashrc + echo "export CXX=/usr/bin/g++-11" >> ~/.bashrc + source ~/.bashrc + ln -sf /usr/bin/g++-11 /usr/bin/g++ + ln -sf /usr/bin/gcc-11 /usr/bin/gcc + g++ -v + + # 安装OpenSSL 1.1(类似于CentOS中的openssl11) + apt install -y openssl libssl-dev + # Ubuntu中不需要创建符号链接,因为软件包会自动处理版本问题 + # openssl rand -writerand /root/.rnd 命令在Ubuntu中同样适用 + openssl rand -writerand /root/.rnd +} + +cp_wedpr_node_script() { + dos2unix /data/app/wedpr/scripts/*.sh + chmod +x /data/app/wedpr/scripts/wedpr-mpc-node.sh + cp /data/app/wedpr/scripts/wedpr-mpc-node.sh /etc/init.d/ +} + +install_cmake(){ + cd /usr/local/lib/ + wget https://cmake.org/files/v3.21/cmake-3.21.4.tar.gz + tar -xf cmake-3.21.4.tar.gz + cd cmake-3.21.4 + g++-11 -v + ./configure + make -j4 + make install + rm -rf /usr/local/lib/cmake-3.21.4.tar.gz +} + +install_spdz() { + cd /data/app/wedpr/scripts/ + git clone https://github.com/WeDPR-Team/MP-SPDZ.git + cp -r MP-SPDZ wedpr-mpc-no-gateway + cp -r MP-SPDZ wedpr-mpc + + cd /data/app/wedpr/scripts/wedpr-mpc-no-gateway + git checkout ppc-2.0.0-no-gateway + do_compile_spdz + + + cd /data/app/wedpr/scripts/wedpr-mpc + git checkout ppc-2.0.0 + do_compile_spdz + + cd /data/app/wedpr/scripts + rm -rf MP-SPDZ +} + +do_compile_spdz(){ + echo CXX=g++ >> CONFIG.mine + echo AVX_OT=0 >> CONFIG.mine + # echo USE_NTL=1 > CONFIG.mine + make setup + sed -i "s/std::aligned_alloc/aligned_alloc/g" ./local/include/boost/asio/detail/memory.hpp + make -j4 replicated-ring-party.x + make -j4 hemi-party.x + make -j4 shamir-party.x + make -j4 mascot-party.x + make -j4 sy-rep-ring-party.x + strip mascot-party.x replicated-ring-party.x shamir-party.x hemi-party.x sy-rep-ring-party.x + + + mkdir Player-Data + tar xf /data/app/wedpr/scripts/ssl_cert.tar.gz + cp -r ssl_cert/* Player-Data/ + + rm -rf ./git ./GC ./Machines ./deps ./Math ./Processor ./FHEOffline ./OT ./Networking ./FHE ./ECDSA + rm -rf BMR ExternalIO Yao Utils bin doc Dockerfile Makefile License.txt README.md CHANGELOG.md azure-pipelines.yml setup.py Tools +} + +install_mpc_nodes() { + cd /data/app/wedpr/ + tar -xf wedpr-mpc-node.tar.gz + rm -rf wedpr-mpc-node.tar.gz + + chmod +x /data/app/wedpr/wedpr-mpc-node/wedpr-mpc + chmod +x /data/app/wedpr/wedpr-mpc-node/*.sh + dos2unix /data/app/wedpr/wedpr-mpc-node/*.sh +} + +install_spdz_deps +echo "install_spdz_deps ok" +cp_wedpr_node_script +echo "cp_wedpr_node_script ok" +install_cmake +echo "install_cmake ok" +install_spdz +echo "install_spdz ok" +#install_mpc_nodes +#echo "install_mpc_nodes ok" diff --git a/docker-files/mpc/scripts/build-mpc-base.sh b/docker-files/mpc/scripts/build-mpc-base.sh new file mode 100644 index 0000000..7ffec23 --- /dev/null +++ b/docker-files/mpc/scripts/build-mpc-base.sh @@ -0,0 +1,123 @@ +#!/bin/bash + +set -e +LANG=en_US.UTF-8 + +LOG_INFO() { + local content=${1} + echo -e "\033[32m[INFO] ${content}\033[0m" +} + +LOG_ERROR() { + local content=${1} + echo -e "\033[31m[ERROR] ${content}\033[0m" +} + +update_yum_repo() { + yum repolist + yum clean all + yum makecache + yum install epel-release -y + rm -rf /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo.rpmnew + rm -rf /etc/yum.repos.d/CentOS-SCLo-sclo.repo + yum repolist + yum clean all + yum makecache +} + + +install_spdz_deps() { + yum install epel-release wget dos2unix vim which automake make yasm git boost-devel boost-thread openssl-devel libtool m4 python3 texinfo yasm gmp-devel libsodium-devel -y + + yum -y install centos-release-scl + yum -y install devtoolset-11-gcc devtoolset-11-gcc-c++ devtoolset-11-binutils + echo "source /opt/rh/devtoolset-11/enable" >> ~/.bashrc + source ~/.bashrc + g++ -v + + yum -y install openssl11 + ln -s /usr/bin/openssl11 /usr/bin/openssl + openssl rand -writerand /root/.rnd +} + +cp_wedpr_node_script() { + dos2unix /data/app/wedpr/scripts/*.sh + chmod +x /data/app/wedpr/scripts/wedpr-mpc-node.sh + cp /data/app/wedpr/scripts/wedpr-mpc-node.sh /etc/init.d/ +} + +install_cmake(){ + cd /usr/local/lib/ + wget https://cmake.org/files/v3.21/cmake-3.21.4.tar.gz + tar -xf cmake-3.21.4.tar.gz + cd cmake-3.21.4 + g++ -v + ./configure + make -j4 + make install + rm -rf /usr/local/lib/cmake-3.21.4.tar.gz +} + +install_spdz() { + cd /data/app/wedpr/scripts/ + git clone https://github.com/WeDPR-Team/MP-SPDZ.git + cp -r MP-SPDZ wedpr-mpc-no-gateway + cp -r MP-SPDZ wedpr-mpc + + cd /data/app/wedpr/scripts/wedpr-mpc-no-gateway + git checkout ppc-2.0.0-no-gateway + do_compile_spdz + + + cd /data/app/wedpr/scripts/wedpr-mpc + git checkout ppc-2.0.0 + do_compile_spdz + + cd /data/app/wedpr/scripts + rm -rf MP-SPDZ +} + +do_compile_spdz(){ + echo CXX=g++ >> CONFIG.mine + echo AVX_OT=0 >> CONFIG.mine + # echo USE_NTL=1 > CONFIG.mine + make setup + sed -i "s/std::aligned_alloc/aligned_alloc/g" ./local/include/boost/asio/detail/memory.hpp + make -j4 replicated-ring-party.x + make -j4 hemi-party.x + make -j4 shamir-party.x + make -j4 mascot-party.x + make -j4 sy-rep-ring-party.x + strip mascot-party.x replicated-ring-party.x shamir-party.x hemi-party.x sy-rep-ring-party.x + + + mkdir Player-Data + tar xf /data/app/wedpr/scripts/ssl_cert.tar.gz + cp -r ssl_cert/* Player-Data/ + + rm -rf ./git ./GC ./Machines ./deps ./Math ./Processor ./FHEOffline ./OT ./Networking ./FHE ./ECDSA + rm -rf BMR ExternalIO Yao Utils bin doc Dockerfile Makefile License.txt README.md CHANGELOG.md azure-pipelines.yml setup.py Tools +} + +install_mpc_nodes() { + cd /data/app/wedpr/ + tar -xf wedpr-mpc-node.tar.gz + rm -rf wedpr-mpc-node.tar.gz + + chmod +x /data/app/wedpr/wedpr-mpc-node/wedpr-mpc + chmod +x /data/app/wedpr/wedpr-mpc-node/*.sh + dos2unix /data/app/wedpr/wedpr-mpc-node/*.sh +} + +update_yum_repo +echo "update_yum_repo ok" +install_spdz_deps +echo "install_spdz_deps ok" +cp_wedpr_node_script +echo "cp_wedpr_node_script ok" +install_cmake +echo "install_cmake ok" +install_spdz +echo "install_spdz ok" +#install_mpc_nodes +#echo "install_mpc_nodes ok" diff --git a/docker-files/mpc/scripts/wedpr-mpc-node.sh b/docker-files/mpc/scripts/wedpr-mpc-node.sh new file mode 100644 index 0000000..a36daaf --- /dev/null +++ b/docker-files/mpc/scripts/wedpr-mpc-node.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +LANG=en_US.UTF-8 + +mpc_work_dir=/data/app/wedpr/wedpr-mpc-node/ + +copy_wedpr_mpc_cert(){ + wedpr_mpc_cert_path=/data/app/wedpr/scripts/wedpr-mpc/Player-Data + wedpr_mpc_no_gateway_cert_path=/data/app/wedpr/scripts/wedpr-mpc-no-gateway/Player-Data + if [ ! -f ${mpc_work_dir}/conf/ca.crt ];then + cd /data/app/wedpr/scripts/ + tar xf mpc-node-conf.tar.gz + cp -r conf ${mpc_work_dir}/ + fi + if [ ! -f ${wedpr_mpc_cert_path}/P0.pem ];then + cd /data/app/wedpr/scripts/ + mkdir -p ${wedpr_mpc_cert_path} + mkdir -p ${wedpr_mpc_no_gateway_cert_path} + tar xf ssl_cert.tar.gz + cp -r ssl_cert/* ${wedpr_mpc_cert_path}/ + cp -r ssl_cert/* ${wedpr_mpc_no_gateway_cert_path}/ + fi +} + +wedpr_mpc_start() { + copy_wedpr_mpc_cert + cd ${mpc_work_dir} + bash start.sh +} + +wedpr_mpc_stop() { + cd ${mpc_work_dir} + bash stop.sh +} + +case "$1" in + start) + wedpr_mpc_start + ;; + stop) + wedpr_mpc_stop + ;; + restart) + wedpr_mpc_stop + wedpr_mpc_start + ;; + *) + echo "Usage: /etc/init.d/wedpr-mpc {start|stop|restart}" + exit 1 +esac +exit 0