Accum TrustedAccum::TEEaccum(Stats &stats, Nodes nodes, Vote<Void, Cert> votes[MAX_NUM_SIGNATURES]) { View v = votes[0].getCData().getView(); View highest = 0; Hash hash = Hash(); std::set<PID> signers; for(int i = 0; i < MAX_NUM_SIGNATURES && i < this->qsize; i++) { Vote<Void, Cert> vote = votes[i]; CData<Void, Cert> data = vote.getCData(); Sign sign = vote.getSign(); PID signer = sign.getSigner(); Cert cert = data.getCert(); bool vd = verifyCData(stats, nodes, data, sign); bool vc = verifyCert(stats, nodes, cert); if(data.getPhase() == PH1_NEWVIEW && data.getView() == v && signers.find(signer) == signers.end() && vd && vc) { if(DEBUG1) { std::cout << KMAG << "[" << this->id << "]" << "inserting signer" << KNRM << std::endl; } signers.insert(signer); if(cert.getView() >= highest) { highest = cert.getView(); hash = cert.getHash(); } } else { if(DEBUG1) { std::cout << KMAG << "[" << this->id << "]" << "vote:" << vote.prettyPrint() << KNRM << std::endl; } if(DEBUG1) { std::cout << KMAG << "[" << this->id << "]" << "not inserting signer (" << signer << ") because:" << "check-phase=" << std::to_string(data.getPhase() == PH1_NEWVIEW) << "(" << data.getPhase() << "," << PH1_NEWVIEW << ")" << ";check-view=" << std::to_string(data.getView() == v) << ";check-notin=" << std::to_string(signers.find(signer) == signers.end()) << ";verif-data=" << std::to_string(vd) << ";verif-cert=" << std::to_string(vc) << KNRM << std::endl; } } } bool set = true; unsigned int size = signers.size(); std::string text = std::to_string(set) + std::to_string(v) + std::to_string(highest) + hash.toString() + std::to_string(size); Sign sign(this->priv,this->id,text); return Accum(v, highest, hash, size, sign); }
时间: 2024-04-17 18:29:53 浏览: 318
计算机图形学(修订版)附录A OpenGL函数简介
这段代码是一个函数定义,函数名为`TEEaccum`,返回类型为`Accum`。
函数接受以下参数:
- `Stats &stats`:一个`Stats`对象的引用。
- `Nodes nodes`:一个`Nodes`对象。
- `Vote<Void, Cert> votes[MAX_NUM_SIGNATURES]`:一个最大长度为`MAX_NUM_SIGNATURES`的`Vote<Void, Cert>`数组。
函数的主要功能是根据给定的投票数组,计算并返回一个`Accum`对象。
函数内部的操作如下:
- 通过取第一个投票的视图号,获取变量`v`的值。
- 初始化变量`highest`为0,表示最高视图号。
- 初始化变量`hash`为一个空的`Hash`对象。
- 创建一个空的`std::set<PID>`来存储签名者。
- 使用循环遍历投票数组中的每个投票,最多遍历`MAX_NUM_SIGNATURES`次或者当前队列大小(`qsize`)次。
- 对于每个投票,获取其关联的数据对象和签名对象。
- 验证数据对象和签名对象的有效性,如果通过验证,则继续进行下一步操作。
- 如果数据对象的阶段为`PH1_NEWVIEW`,且视图号与变量`v`相等,且签名者不在已存在的签名者集合中,并且数据对象和证书对象都通过了验证,则执行以下操作:
- 将签名者插入到签名者集合中。
- 如果证书对象的视图号大于等于当前最高视图号,则更新最高视图号为证书对象的视图号,同时更新`hash`为证书对象的哈希值。
- 否则,输出调试信息,指示为什么不将签名者插入到集合中。
- 检查签名者集合是否为空,并将结果保存到变量`set`中。
- 计算签名者集合的大小,并保存到变量`size`中。
- 将一些相关的信息转换为字符串,并使用私钥和节点ID创建一个签名对象`sign`。
- 返回一个`Accum`对象,该对象包含视图号`v`、最高视图号`highest`、哈希值`hash`、签名者集合的大小`size`以及生成的签名对象`sign`。
该函数的作用是根据给定的投票数组计算并返回一个累加对象,用于在TEE环境中验证和累加投票。
阅读全文