def signup(username, password) -> Tuple[Audit, Signer_Impl]: try: signer = create_account(username, password) audit = Audit(username=username, password=password) audit.account_addr = str(signer.keypair.address) audit.account_pub = str(signer.keypair.public_key) audit.account_priv = str(signer.keypair.private_key) privkey, pubkey = gen_rsakey() audit.envelope_pub = pubkey audit.envelope_priv = privkey managementAddr = db.session.query(Contracts).filter( Contracts.name == "Management").first().addr call_contract(managementAddr, "Management", "addAudit", args=[ username, to_checksum_address(audit.account_addr), audit.envelope_pub, "" ], signer=signer) db.session.add(audit) db.session.commit() except Exception: traceback.print_exc() db.session.rollback() return None, None return audit, signer
def signup(username, password) -> Tuple[Enterprise, Signer_Impl]: try: signer = create_account(username, password) enterprise = Enterprise(username=username, password=password) contract_addr = deploy_contract("Enterprise", signer=signer) enterprise.contract_addr = contract_addr enterprise.account_addr = str(signer.keypair.address) enterprise.account_pub = str(signer.keypair.public_key) enterprise.account_priv = str(signer.keypair.private_key) privkey, pubkey = gen_rsakey() enterprise.envelope_pub = pubkey enterprise.envelope_priv = privkey managementAddr = db.session.query(Contracts).filter( Contracts.name == "Management").first().addr call_contract(managementAddr, "Management", "addEnterprise", args=[ username, to_checksum_address(enterprise.account_addr), to_checksum_address(enterprise.contract_addr), enterprise.envelope_pub, "" ]) db.session.add(enterprise) db.session.commit() except Exception: traceback.print_exc() db.session.rollback() return None, None return enterprise, signer
def add_engineer(): username = session.get("username", "") password = session.get("password", "") agency, signer = login(username, password) if agency is None: return redirect("/agency") if request.method == "GET": return render_template("agency2-1.html", is_login = True, agency = agency, username = username) ename = request.form.get("name") eid = request.form.get("id", "") efield = request.form.get("field", "") if ename is None: return render_template("agency2-1.html", is_login = True, agency = agency, username = username, fail_msg = "名称不能为空") try: EngineerListAddr = db.session.query(Contracts).filter(Contracts.name == "EngineerList").first().addr engineer = Engineer(username = ename, eid= eid, field= efield) call_contract(EngineerListAddr, "EngineerList", "addEngineer", args = [ename, eid, efield, "", agency.username], signer= signer) agency.engineers.append(engineer) db.session.add(engineer) db.session.add(agency) db.session.commit() except Exception: traceback.print_exc() return render_template("agency2-1.html", is_login = True, agency = agency, username = username, fail_msg = "添加失败") return render_template("agency2-1.html", is_login = True, agency = agency, username = username, succ_msg = "添加成功")
def audit_revoke(): username = session.get("username", "") password = session.get("password", "") audit, signer = login(username, password) if audit is None: return redirect("/audit") if request.method == "GET": return render_template("audit2-1.html", is_login=True, audit=audit, username=username) license_addr = request.form.get("license-addr", None) try: if license_addr is not None or license_addr != "": call_contract(license_addr, "License", "revokeLicense", args=[]) except Exception: traceback.print_exc() return render_template("audit2-1.html", is_login=True, fail_msg="撤销失败", audit=audit, username=username) return render_template("audit2-1.html", is_login=True, succ_msg="撤销成功", audit=audit, username=username)
def enterprise_evaluation(): username = session.get("username", "") password = session.get("password", "") enterprise, signer = login(username, password) if enterprise is None: return redirect("/enterprise") evaluation_addr = enterprise.evaluation_addr _, al, _, _ = count_numbers() if al < 3: return render_template("enterprise2.html", is_login=True, fail_msg="缺少足够的安评机构参与(至少3家安评机构)", enterprise=enterprise, username=username) if evaluation_addr is None: return render_template("enterprise2.html", is_login=True, fail_msg="缺少审查合约地址", enterprise=enterprise, username=username) try: managementAddr = db.session.query(Contracts).filter( Contracts.name == "Management").first().addr call_contract(evaluation_addr, "ReportEvaluation", "getAgencyList", args=[to_checksum_address(managementAddr)]) res = call_contract(evaluation_addr, "ReportEvaluation", "startEvaluation", signer=signer) ea_addr_list: List[str] = list(res[0]) except Exception: traceback.print_exc() return render_template("enterprise2.html", is_login=True, fail_msg="合约调用失败", enterprise=enterprise, username=username) result = [] for addr in ea_addr_list: ag = Agency.query.filter(Agency.contract_addr == addr).first() if ag is not None: result.append( (ag.username, addr, str(ag.envelope_pub, encoding="utf-8"))) # audit = random.choice(list(AuditList.values())) # result.append((audit.username, "")) return render_template("evaluation2.html", evaluation_addr=evaluation_addr, result=result)
def public_arbitrate(arbitrate_addr: str): username = session.get("username", "") password = session.get("password", "") audit, signer = login(username, password) if audit is None: return redirect("/audit") arbitrate_list = Arbitrate.query.all() arbirate = Arbitrate.query.filter(Arbitrate.addr == arbitrate_addr).first() if arbirate is None: return render_template("audit2-5.html", is_login=True, audit=audit, username=username, arbitrate_list=arbitrate_list, fail_msg="仲裁合约地址错误") try: managementAddr = Contracts.query.filter( Contracts.name == "Management").first().addr call_contract(arbitrate_addr, "Arbitrate", "getAuditList", args=[to_checksum_address(managementAddr)], signer=signer) res = call_contract(arbitrate_addr, "Arbitrate", "startAudition", signer=signer) name_list = list(res[0]) pub_list = list(res[1]) addr_list = list(res[2]) except Exception: traceback.print_exc() return render_template("audit2-5.html", is_login=True, audit=audit, username=username, arbitrate_list=arbitrate_list, fail_msg="仲裁合约查询失败") result = zip(name_list, addr_list, pub_list) return render_template("arbitrate2.html", is_login=True, audit=audit, username=username, result=result, arbitrate_addr=arbitrate_addr)
def credit(): is_login = check_login() if request.method == "GET": return render_template("credit2.html", is_login = is_login) name = request.form.get("name", None) if name is None or name == "": return render_template("credit2.html", is_login = is_login, fail_msg = "输入错误") ent_type = request.form.get("ent-type", None) if ent_type is None or ent_type not in ["agency", "engineer"]: return render_template("credit2.html", is_login = is_login, fail_msg = "实体类型错误") if ent_type == "engineer": ent = Engineer.query.filter(Engineer.username == name).first() else: ent = Agency.query.filter(Agency.username == name).first() if ent is None: return render_template("credit2.html", is_login = is_login, fail_msg = "未找到该实体") result = None try: if ent_type == "engineer": engineerListAddr = Contracts.query.filter(Contracts.name == "EngineerList").first().addr CreditAddr = Contracts.query.filter(Contracts.name == "Credit").first().addr # call_contract(engineerListAddr,"EngineerList","getCreditContractAddr", args = []) call_contract(engineerListAddr,"EngineerList","setCreditContractAddr", args = [to_checksum_address(CreditAddr)]) # call_contract(engineerListAddr,"EngineerList","getCreditContractAddr", args = []) call_contract(engineerListAddr, "EngineerList", "updateCredit", args = [ent.eid]) res = call_contract(engineerListAddr, "EngineerList", "getCredit", args = [ent.eid]) result = res[0] else: CreditAddr = Contracts.query.filter(Contracts.name == "Credit").first().addr call_contract(ent.contract_addr,"Agency","setCreditAddr", args = [to_checksum_address(CreditAddr)]) call_contract(ent.contract_addr, "Agency", "updateCredit", args = []) res = call_contract(ent.contract_addr, "Agency", "getCredit", args = []) result = res[0] except Exception: traceback.print_exc() return render_template("credit2.html", is_login = is_login, fail_msg = "查询失败") return render_template("credit2.html", is_login = is_login, succ_msg = "查询成功", result = result, name = name)
def agency_evaluation(): username = session.get("username", "") password = session.get("password", "") agency, signer = login(username, password) if agency is None: return redirect("/agency") if request.method == "GET": return render_template("agency2-3.html", is_login = True, agency = agency, username = username) eva_addr = request.form.get("eva-addr") eva_accept = request.form.get("eva-accept") # eva_deny = request.form.get("eva-deny") result = True if eva_accept is not None else False eng_list = request.form.get("eng-list", "") eng_list = [e for e in eng_list.split()] if eva_addr is None: return render_template("agency2-3.html", is_login = True, agency = agency, username = username, fail_msg = "缺少审查合约地址") try: if result: call_contract(agency.contract_addr, "Agency", "confirm", args = [to_checksum_address(eva_addr), eng_list], signer = signer) else: res = call_contract(agency.contract_addr, "Agency", "deny", args = [to_checksum_address(eva_addr), eng_list], signer = signer) arbitrate_addr = res[0] if "0x000000000000000" in arbitrate_addr: raise Exception(msg = "Error arbitrate contract address") app.logger.info(f"{arbitrate_addr}") arbitrate = Arbitrate(addr = arbitrate_addr) db.session.add(arbitrate) db.session.commit() # call_contract(agency.contract_addr, "Agency", "addBusiness", [[], f"审查:审查合约地址{eva_addr}"], signer = signer) except Exception: traceback.print_exc() return render_template("agency2-3.html", is_login = True, agency = agency, username = username, fail_msg = "调用合约失败") if result: return render_template("agency2-3.html", is_login = True, agency = agency, username = username, succ_msg = "审查通过") return render_template("agency2-3.html", is_login = True, agency = agency, username = username, succ_msg = "审查拒绝")
def enterprise_apply(): username = session.get("username", "") password = session.get("password", "") enterprise, signer = login(username, password) if enterprise is None: return redirect("/enterprise") ent_name = request.form.get("ent-name", "") rep_name = request.form.get("rep-name", "") ent_addr = request.form.get("ent-addr", "") ent_type = request.form.get("ent-type", "") ent_range = request.form.get("ent-range", "") try: enterprise = Enterprise.query.filter( Enterprise.username == username).first() enterprise.ent_name = ent_name enterprise.rep_name = rep_name enterprise.ent_addr = ent_addr enterprise.ent_type = ent_type enterprise.ent_range = ent_range db.session.add(enterprise) db.session.commit() call_contract(enterprise.contract_addr, "Enterprise", "setInformation", args=[ent_name, rep_name, ent_addr, ent_type, ent_range], signer=signer) except Exception: db.session.rollback() return render_template("enterprise2.html", is_login=True, fail_msg="添加信息失败", enterprise=enterprise, username=username) return render_template("enterprise2.html", is_login=True, succ_msg="添加信息成功", enterprise=enterprise, username=username)
def del_engineer(index: str): username = session.get("username", "") password = session.get("password", "") agency, signer = login(username, password) if agency is None: return redirect("/agency") try: EngineerListAddr = db.session.query(Contracts).filter(Contracts.name == "EngineerList").first().addr call_contract(EngineerListAddr, "EngineerList", "deleteAgency", args = [index], signer= signer) engineer = Engineer.query.filter(Engineer.eid == index).first() if engineer is not None: agency.engineers.remove(engineer) db.session.commit() except Exception: traceback.print_exc() return render_template("agency2-1.html", is_login = True, agency = agency, username = username, fail_msg = "删除失败") return render_template("agency2-1.html", is_login = True, agency = agency, username = username, succ_msg = "删除成功")
def search_report(): is_login = check_login() if request.method == "GET": return render_template("report2.html", is_login = is_login) name = request.form.get("name", None) msg = request.form.get("msg", None) if name is None or msg is None or name == "" or msg == "": return render_template("report2.html", is_login = is_login, fail_msg = "举报对象或关键词为空") audit = Audit.query.filter(Audit.username == name).first() if audit is None: return render_template("report2.html", is_login = is_login, fail_msg = "未找到该监管部门") try: AccusationAddr = Contracts.query.filter(Contracts.name == "Accusation").first().addr call_contract(AccusationAddr, "Accusation", "addAccusation", args = ["", msg ,"", name]) except Exception: traceback.print_exc() return render_template("report2.html", is_login = is_login, succ_msg = "举报合约执行失败") return render_template("report2.html", is_login = is_login, succ_msg = "举报成功,举报合约执行成功")
def license_handle(addr): is_login = check_login() try: res = call_contract(addr, "License", "getInfo", args = []) res2 = call_contract(addr, "License", "showInfo", args = []) except Exception: traceback.print_exc() return render_template("index2.html", is_login = is_login, fail_msg = "证书合约地址错误或合约调用失败", count = count_numbers()) res2 = list(res2) license_info = list(res) license_info.extend(res2) time_local = None try: time_local = time.localtime(license_info[5]/ 1000) except Exception: traceback.print_exc() if time_local is not None: license_info[5] = time.strftime("%Y-%m-%d %H:%M:%S", time_local) try: agency = Agency.query.filter(Agency.contract_addr == license_info[10]).first() license_info[10] = agency.username except Exception: traceback.print_exc() try: engineer_list = [] for e_eid in license_info[11]: engineer = Engineer.query.filter(Engineer.eid == e_eid).first() if engineer is not None: engineer_list.append(engineer.username) else: engineer_list.append(e_eid) license_info[11] = engineer_list except Exception: traceback.print_exc() return render_template("license2.html", is_login = is_login,license_info = license_info)
def enterprise_result(): username = session.get("username", "") password = session.get("password", "") enterprise, signer = login(username, password) if enterprise is None: return redirect("/enterprise") evaluation_addr = enterprise.evaluation_addr if evaluation_addr is None: return render_template("enterprise2.html", is_login=True, fail_msg="缺少审查合约地址", enterprise=enterprise, username=username) try: res = call_contract(evaluation_addr, "ReportEvaluation", "businessUpdate", args=[], signer=signer) license_addr = res[0] except Exception: return render_template("enterprise2.html", is_login=True, fail_msg="合约调用失败", enterprise=enterprise, username=username) if "0x0000000000" in license_addr: return render_template("enterprise2.html", is_login=True, fail_msg="证书暂未通过审查", enterprise=enterprise, username=username) enterprise.license_addr = license_addr db.session.add(enterprise) db.session.commit() return render_template("enterprise2.html", is_login=True, succ_msg="证书已上链", enterprise=enterprise, username=username)
def signup(username, password) -> Tuple[Agency, Signer_Impl]: try: signer = create_account(username, password) agency = Agency(username = username, password = password) contract_addr = deploy_contract("Agency", signer = signer) agency.contract_addr = contract_addr agency.account_addr = str(signer.keypair.address) agency.account_pub = str(signer.keypair.public_key) agency.account_priv = str(signer.keypair.private_key) privkey, pubkey = gen_rsakey() agency.envelope_pub = pubkey agency.envelope_priv = privkey managementAddr = db.session.query(Contracts).filter(Contracts.name == "Management").first().addr EngineerListAddr = db.session.query(Contracts).filter(Contracts.name == "EngineerList").first().addr creditAddr = db.session.query(Contracts).filter(Contracts.name == "Credit").first().addr call_contract(contract_addr, "Agency", "setEngListAddr", args = [to_checksum_address(EngineerListAddr)], signer = signer) call_contract(contract_addr, "Agency", "setCreditAddr", args = [to_checksum_address(creditAddr)], signer = signer) agency.engineer_list_addr = EngineerListAddr # call_contract2(managementAddr, "Management", "addAgency", # args = [ # username, # to_checksum_address(agency.account_addr), # to_checksum_address(agency.contract_addr), # agency.envelope_pub, "" ], signer = signer) call_contract(managementAddr, "Management", "addAgency", args = [ username, to_checksum_address(agency.account_addr), to_checksum_address(agency.contract_addr), agency.envelope_pub, ""], signer = signer) db.session.add(agency) db.session.commit() except Exception: traceback.print_exc() db.session.rollback() return None, None return agency, signer
def upload(): username = session.get("username", "") password = session.get("password", "") agency, signer = login(username, password) if agency is None: return redirect("/agency") if request.method == "GET": return render_template("agency2-2.html", is_login = True, agency = agency, username = username) ent_name = request.form.get("ent-name") eng_list = request.form.get("eng-list", "") eng_list = [e for e in eng_list.split()] data_hash = request.form.get("data-hash") if ent_name is None: return render_template("agency2-2.html", is_login = True, agency = agency, username = username, fail_msg = "缺少生产企业名称") _,_,aal,_ = count_numbers() if aal < 3: return render_template("agency2-2.html", is_login = True, agency = agency, username = username, fail_msg = "缺少足够的审查实体,至少需要3家审查实体") enterprise = Enterprise.query.filter(Enterprise.username == ent_name).first() if enterprise is None: return render_template("agency2-2.html", is_login = True, agency = agency, username = username, fail_msg = "生产企业名称错误") data_file = request.files.get("data-file") if data_file is None: return render_template("agency2-2.html", is_login = True, agency = agency, username = username, fail_msg = "缺少上传文件") if data_file.filename == "" : return render_template("agency2-2.html", is_login = True, agency = agency, username = username, fail_msg = "缺少上传文件") data_file_path = os.path.join(app.config["UPLOAD_FOLDER"], secure_filename(data_file.filename)) data_file.save(data_file_path) try: n = aal t = 3 key, shares = shamir_encode(t, n) enc_data_path = os.path.join(app.config["UPLOAD_FOLDER"], "enc-"+secure_filename(data_file.filename)) aes_encode(key, data_file_path, enc_data_path) data_file_addr = ipfs_client.add(enc_data_path) for i, audit in enumerate(Audit.query.all()): obj_data = IPFSObject(hash = data_file_addr["Hash"], name = secure_filename(data_file.filename), secret = shares[i][1].hex(), idx = shares[i][0]) audit.files.append(obj_data) db.session.add(obj_data) db.session.commit() except Exception as e: traceback(e) return render_template("agency2-2.html", is_login = True, agency = agency, username = username, succ_msg = "IPFS上传失败") try: res = call_contract(enterprise.contract_addr, "Enterprise", "update", args=[data_hash, data_file_addr["Hash"], to_checksum_address(agency.contract_addr), eng_list], signer = signer) enterprise.evaluation_addr = res[0] db.session.commit() res = call_contract(enterprise.evaluation_addr, "ReportEvaluation", "businessUpdate", args = [] , signer = signer) licenseAddr = res[0] enterprise.license_addr = licenseAddr db.session.commit() except Exception: traceback.print_exc() return render_template("agency2-2.html", is_login = True, agency = agency, username = username, succ_msg = "智能合约调用失败") return render_template("agency2-2.html", is_login = True, agency = agency, username = username, succ_msg = "添加成功")
def enterprise_upload(): username = session.get("username", "") password = session.get("password", "") enterprise, signer = login(username, password) if enterprise is None: return redirect("/enterprise") if request.method == "GET": return render_template("enterprise2-1.html", is_login=True, enterprise=enterprise, username=username) data_hash = request.form.get("data-hash") data_file = request.files.get("data-file") if data_file is None: return render_template("enterprise2-1.html", is_login=True, enterprise=enterprise, username=username, fail_msg="缺少上传文件") if data_file.filename == "": return render_template("enterprise2-1.html", is_login=True, enterprise=enterprise, username=username, fail_msg="缺少上传文件") data_file_path = os.path.join(app.config["UPLOAD_FOLDER"], secure_filename(data_file.filename)) data_file.save(data_file_path) try: _, _, n, _ = count_numbers() t = 3 key, shares = shamir_encode(t, n) enc_data_path = os.path.join( app.config["UPLOAD_FOLDER"], "enc-" + secure_filename(data_file.filename)) aes_encode(key, data_file_path, enc_data_path) data_file_addr = ipfs_client.add(enc_data_path) for i, audit in enumerate(Audit.query.all()): obj_data = IPFSObject(hash=data_file_addr["Hash"], name=secure_filename(data_file.filename), secret=shares[i][1].hex(), idx=shares[i][0]) audit.files.append(obj_data) db.session.add(obj_data) db.session.commit() except Exception as e: traceback(e) return render_template("enterprise2-1.html", is_login=True, enterprise=enterprise, username=username, succ_msg="IPFS上传失败") try: call_contract(enterprise.contract_addr, "Enterprise", "updateData", args=[data_hash, data_file_addr["Hash"]], signer=signer) except Exception as e: traceback(e) return render_template("enterprise2-1.html", is_login=True, enterprise=enterprise, username=username, succ_msg="智能合约调用失败") return render_template("enterprise2-1.html", is_login=True, enterprise=enterprise, username=username, succ_msg="添加成功")
def audit_check(): username = session.get("username", "") password = session.get("password", "") audit, signer = login(username, password) if audit is None: return redirect("/audit") if request.method == "GET": return render_template("audit2-6.html", is_login=True, audit=audit, username=username) arbitrate_addr = request.form.get("arbitrate-addr") arbitrate_accept = request.form.get("arbitrate-accept") # arbitrate_deny = request.form.get("arbitrate-deny") if arbitrate_addr is None: return render_template("audit2-6.html", is_login=True, audit=audit, username=username, fail_msg="仲裁合约地址错误") arbirate = Arbitrate.query.filter(Arbitrate.addr == arbitrate_addr).first() if arbirate is None: return render_template("audit2-6.html", is_login=True, audit=audit, username=username, fail_msg="仲裁合约地址错误") result = True if arbitrate_accept is not None else False try: if result: res = call_contract(arbitrate_addr, "Arbitrate", "confirm", signer=signer) app.logger.info(f"{res}") return render_template("audit2-6.html", is_login=True, audit=audit, username=username, succ_msg="仲裁通过") res = call_contract(arbitrate_addr, "Arbitrate", "deny", signer=signer) app.logger.info(f"{res}") return render_template("audit2-6.html", is_login=True, audit=audit, username=username, succ_msg="仲裁拒绝") except Exception: traceback.print_exc() return render_template("audit2-6.html", is_login=True, audit=audit, username=username, fail_msg="仲裁执行失败")