2019-04-22

4354297443921806682861743161735094062
38632140595220392354280998614525578145353818029287874088356304829962854601866
pragma solidity ^0.5;

contract Ballot{
uint Publickey_n;

event e_get_pk(
    uint pk
);

event e_get_D(
    uint d
);
//voter
struct voter {
    uint vote;
}

//candidate
struct candidate {
    uint count;
    bool win;
}

//chairperson init voting
address chairperson;
mapping(address => voter) voters;
mapping(address => candidate) candidates;
address[] candidate_add;

constructor() public {
}

function initPk(uint pk) public {
    Publickey_n = pk;
    Publickey(pk);
    emit e_get_pk(pk);
}

function initVoter(address[] memory voter_address) public  {
    for (uint i=0;i<voter_address.length;i++){
        voters[voter_address[i]].vote = 1;
    }
}

//chu shi hua bei xuan zhe
function initCandidate(address[] memory candidate_address) public {
    for (uint i=0;i<candidate_address.length;i++){
        candidate_add.push(candidate_address[i]);
        candidates[candidate_address[i]].count = 0;
        candidates[candidate_address[i]].win = false;
    }
}

function vote(address candidate_address,uint Evote,uint r) public returns(uint){
    require(voters[msg.sender].vote > 0);
    Evote = E(Evote,r);
    uint e = Evote;
    if (candidates[candidate_address].count != 0)
        candidates[candidate_address].count = e_add(candidates[candidate_address].count,Evote);
    else 
        candidates[candidate_address].count = Evote;
    voters[msg.sender].vote = 0;
    return(e);
}

function votes(address[] memory candidate_address,uint[] memory Evotes,uint[] memory r) public {
    require(voters[msg.sender].vote > 0);
    for (uint i=0;i<candidate_address.length;i++){
        uint Evote = E(Evotes[i],r[i]);
        if (candidates[candidate_address[i]].count != 0)
            candidates[candidate_address[i]].count = e_add(candidates[candidate_address[i]].count,Evote);
        else 
            candidates[candidate_address[i]].count = Evote;
        voters[msg.sender].vote = 0;
    }
}

function tally(uint sk)  public returns(uint,address){
    uint winner_count;
    address winner;
    for (uint i=0;i<candidate_add.length;i++){
        uint Dcount = D(candidates[candidate_add[i]].count,sk);
        if (winner_count<D(candidates[candidate_add[i]].count,sk)){
            winner_count = Dcount;
            winner = candidate_add[i];
        }
    }
    return(winner_count,winner);
}

function getvote(uint i) public returns(uint) {
    return(candidates[candidate_add[i]].count);
}

int private x;
int private y;
uint public time;
uint _output;

uint Publickey_n_sq;
uint Publickey_g;     //G
event timeStamper(uint timestamp, address sender, uint _output);

/*Publickey*/
/*
    设置公钥
*/
function Publickey(uint _input) public {
    Publickey_n = uint(_input);
    Publickey_n_sq = Publickey_n * Publickey_n;
    //Publickey_g = Publickey_n + 1;
    Publickey_g = 2;
}

function gcd(int a,int b) public returns(int){ 
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    } else {
        int d = gcd(b,a%b);
        int temp = y;
        y = x-(a/b)*y;
        x = temp;
        return d;
    }
}
function getgcd_y() public returns(int){
    return y;
}

function init_x_y() public {
    x = 0;
    y = 0;
}

function invmod(uint a, uint p) public pure returns(uint){
    uint r;
    uint d;
    if (a == 0)
        revert('0 has no inverse mod this prime');
    r = a;
    d = 1;
    for(uint i=p; i<1000000; i++) {
        d = mulmod((p / r + 1), d, p);
        r = mulmod(d, a, p);
        if(r == 1) break;
    }
    return d;
}
/*  
    Modular exponent:
    c = b ^ e mod m
    Returns c.
*/
function modpow(uint _base, uint _exponent, uint _modulus) public pure returns(uint) {

uint result;
    result = 1;
    while(_exponent > 0){
        if((_exponent & 1) == 1) result = mulmod(result, _base, _modulus);
        _exponent = _exponent >> 1;
        _base = mulmod(_base, _base, _modulus);
    }
    return result;
}

//加密  {(g**m mod n*n)*(r**n mod n*n)}mod n*n
function E(uint m,uint r) public view returns(uint) {
    return mulmod(modpow(Publickey_g,m,Publickey_n_sq),modpow(r,Publickey_n,Publickey_n_sq),Publickey_n_sq);
}

//解密 
function D(uint c,uint sk) public returns(uint) {
    init_x_y;
    if (y<0) y += int(Publickey_n);
    gcd(int(Publickey_n),int((modpow(Publickey_g,sk,Publickey_n_sq)-1)/Publickey_n));
    uint res = mulmod(((modpow(c,sk,Publickey_n_sq)-1)/Publickey_n),uint(y),Publickey_n);
    emit e_get_D(res);
    return res;
}

function D1(uint c,uint sk) public returns(uint) {
    return ((modpow(c,sk,Publickey_n_sq)-1)/Publickey_n);
    //gcd(int(Publickey_n),int((modpow(c,sk,Publickey_n_sq)-1)/Publickey_n));
    //return mulmod(((modpow(c,sk,Publickey_n_sq)-1)/Publickey_n),uint(y),Publickey_n);
}

function D2(uint c,uint sk) public returns(uint) {
    return ((modpow(Publickey_g,sk,Publickey_n_sq)-1)/Publickey_n);
    //return mulmod(((modpow(c,sk,Publickey_n_sq)-1)/Publickey_n)/((modpow(Publickey_g,sk,Publickey_n_sq)-1)/Publickey_n),1,Publickey_n);
}

function e_add(uint a, uint b) public returns(uint) {
        /*Add one encrypted uinteger to another*/
  emit timeStamper(time, msg.sender, mulmod(a, b, Publickey_n_sq));
  return mulmod(a, b, Publickey_n_sq);
}

function e_add_const(uint a, uint n, uint _input_Publickey) public returns(uint) {
        /*Add constant n to an encrypted uinteger*/
  Publickey(_input_Publickey);
  emit timeStamper(time, msg.sender, mulmod(a, modpow(Publickey_g, n, Publickey_n_sq), Publickey_n_sq));
  return mulmod(a, modpow(Publickey_g, n, Publickey_n_sq), Publickey_n_sq);
}

function e_mul_const(uint a, uint n, uint _input_Publickey) public returns(uint) {
        /*Multiplies an encrypted uinteger by a constant*/
        Publickey(_input_Publickey);
        emit timeStamper(time, msg.sender, modpow(a, n, Publickey_n_sq));
        return modpow(a, n, Publickey_n_sq);
}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 实验三 二叉树遍历(递归算法和非递归算法) 一.实验目的 1.掌握二叉树的存储结构与基本操作 2.掌握二叉树的遍历...
    落幕12阅读 966评论 0 1
  • 通天塔的怪物数值设计分为两部分:1.生命值--主要用来卡玩家升级,玩家需要拥有足够的输出,在规定时间内打完怪物血量...
    李宏阳Leo阅读 862评论 0 1
  • 当你喜欢一个女生的时候,你会付出你的所有,和我好像。 1.文本相似度计算——文本向量化 1.前言 在自然语言处理过...
    T_129e阅读 459评论 0 0
  • 1. 这是个什么词? 词:proximity 英英释义:nearness in distance or time ...
    静美的秋阅读 181评论 0 0
  • 三剑客老大之awk 创建测试环境 三剑客小切磋 awk过滤 环境 显示第二列以 i 结尾的行 显示第二列以i结尾的...
    七两三_e13f阅读 190评论 0 0