竞赛选题 python区块链实现 - proof of work工作量证明共识算法

news2024/10/7 18:20:20

文章目录

  • 0 前言
  • 1 区块链基础
    • 1.1 比特币内部结构
    • 1.2 实现的区块链数据结构
    • 1.3 注意点
    • 1.4 区块链的核心-工作量证明算法
      • 1.4.1 拜占庭将军问题
      • 1.4.2 解决办法
      • 1.4.3 代码实现
  • 2 快速实现一个区块链
    • 2.1 什么是区块链
    • 2.2 一个完整的快包含什么
    • 2.3 什么是挖矿
    • 2.4 工作量证明算法:
    • 2.5 实现代码
  • 3 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

python区块链实现 - proof of work工作量证明共识算法

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

在这里插入图片描述

1 区块链基础

学长以比特币的结构向大家详解区块链的组成部分

1.1 比特币内部结构

  • previous hash(前一个区块的hash)
  • merkle root(默克尔树根节点,内部存储交易数据)
  • timestamp(当前区块生成的时间)
  • nonce(旷工计算hash值次数)

在这里插入图片描述

1.2 实现的区块链数据结构

  • index 当前第几个区块
  • timestamp 该区块创建时的时间戳
  • data 交易信息
  • previousHash 前一个区块的hash
  • hash 当前区块的hash

1.3 注意点

第一个区块叫做创世区块(genesis block),区块链创建的时候默认生产的这里用的是单纯的链表,不是用默克尔树存储

示例代码



    from hashlib import sha256
    //区块schema
    class Block:
         
        def __init__(self,index,timestamp,data,previousHash=""):
            
            self.index = index
            self.timestamp = timestamp
            self.data = data
            self.previousHash = previousHash
            self.hash = self.calculateHash()
            
        //计算当前区块的hashdef calculateHash(self):
            plainData = str(self.index)+str(self.timestamp)+str(self.data)
            return sha256(plainData.encode('utf-8')).hexdigest()
        
        def __str__(self):
            return str(self.__dict__)
     //区块链schema
    class BlockChain:
        //初始化的时候 创建 创世区块
        def __init__(self):
            self.chain = [self.createGenesisBlock()]
        //构建创世区块
        def createGenesisBlock(self):
            return Block(0,"01/01/2018","genesis block","0")
        //获取最后一个区块
        def getLatestBlock(self):
            return self.chain[len(self.chain)-1]
        //往区块链里面添加区块
        def addBlock(self,newBlock):
            newBlock.previousHash = self.getLatestBlock().hash
            newBlock.hash = newBlock.calculateHash()
            self.chain.append(newBlock)
        
        def __str__(self):
            return str(self.__dict__)    
        //校验区块链是不是有效的 有没有人被篡改
        def chainIsValid(self):
            for index in range(1,len(self.chain)):
                currentBlock = self.chain[index]
                previousBlock = self.chain[index-1]
                if (currentBlock.hash != currentBlock.calculateHash()):
                    return False
                if previousBlock.hash != currentBlock.previousHash:
                    return False
            return True


myCoin = BlockChain()
myCoin.addBlock(Block(1,"02/01/2018","{amount:4}"))
myCoin.addBlock(Block(2,"03/01/2018","{amount:5}"))

#print block info 打印区块链信息
print("print block info ####:")
for block in myCoin.chain:
    print(block)
#check blockchain is valid 检查区块链是不是有效的
print("before tamper block,blockchain is valid ###")
print(myCoin.chainIsValid())
#tamper the blockinfo  篡改区块2的数据
myCoin.chain[1].data = "{amount:1002}"
print("after tamper block,blockchain is valid ###")
print(myCoin.chainIsValid())


输出结果

print block info ####:
{'index': 0, 'timestamp': '01/01/2018', 'data': 'genesis block', 'previousHash': '0', 'hash': 'd8d21e5ba33780d5eb77d09d3b407ceb8ade4e5545ef951de1997b209d91e264'}
{'index': 1, 'timestamp': '02/01/2018', 'data': '{amount:4}', 'previousHash': 'd8d21e5ba33780d5eb77d09d3b407ceb8ade4e5545ef951de1997b209d91e264', 'hash': '15426e32db30f4b26aa719ba5e573f372f41e27e4728eb9e9ab0bea8eae63a9d'}
{'index': 2, 'timestamp': '03/01/2018', 'data': '{amount:5}', 'previousHash': '15426e32db30f4b26aa719ba5e573f372f41e27e4728eb9e9ab0bea8eae63a9d', 'hash': '75119e897f21c769acee6e32abcefc5e88e250a1f35cc95946379436050ac2f0'}
before tamper block,blockchain is valid ###
True
after tamper block,blockchain is valid ###
False

1.4 区块链的核心-工作量证明算法

上面学长介绍了区块链的基本结构,我在之前的基础上来简单实现一下工作量证明算法(proof of
work),在介绍pow之前先思考一下为什么要工作量证明算法,或者再往前想一步为什么比特币如何解决信任的问题?

1.4.1 拜占庭将军问题

比特币出现之前就有了拜占庭将军问题,主要思想是,如何在分布式系统环境里去相信其他人发给你的信息?

一组拜占庭将军分别各率领一支军队共同围困一座城市。为了简化问题,将各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军分处城市不同方向,他
系统的问题在于,将军中可能出现叛徒,他们不仅可能向较为糟糕的策略投票,还可能选择性地发送投票信息。假设有9位将军投票,其中1名叛徒。8名忠诚的将军中出现了4人投进攻,4人投撤离的情况。这时候叛徒可能故意给4名投进攻的将领送信表示投票进攻,而给4名投撤离的将领送信表示投撤离。这样一来在4名投进攻的将领看来,投票结果是5人投进攻,从而发起进攻;而在4名投撤离的将军看来则是5人投撤离。这样各支军队的一致协同就遭到了破坏。

在这里插入图片描述

1.4.2 解决办法

拜占庭将军问题主要问题是,中间人可以拦截消息,进行修改;上述的那些士兵可以理解成比特币中的一些节点,不是所有节点拿到消息后都是可以直接处理的,先去解决一个数学问题,就是工作量证明,只有拥有特定的计算能力解决了问题之后才能去修改或者校验(验证,打包,上链)。

在这里插入图片描述
上图就是简单的工作量证明算法流程,一串数字后面有个x,x之前的数可以理解成交易数据,然后需要找到一个x,让整个数的hash值的开头有n个0,如果hash是很均匀的话,那么生成的hash值每一位为0或者1都是等可能的,所以前n个都为0的概率就是2的n次方/2的hash值位数,上图给出了如果hash值是5个bit的情况下的所有可能

1.4.3 代码实现



    from hashlib import sha256
    import time
    class Block:
         
        def __init__(self,index,timestamp,data,previousHash=""):
            
            self.index = index
            self.timestamp = timestamp
            self.data = data
            self.previousHash = previousHash
            self.nonce = 0 //代表当前计算了多少次hash计算
            self.hash = self.calculateHash()


        def calculateHash(self):
            plainData = str(self.index)+str(self.timestamp)+str(self.data)+str(self.nonce)
            return sha256(plainData.encode('utf-8')).hexdigest()
        #挖矿 difficulty代表复杂度 表示前difficulty位都为0才算成功
        def minerBlock(self,difficulty):
            while(self.hash[0:difficulty]!=str(0).zfill(difficulty)):
                self.nonce+=1
                self.hash = self.calculateHash()
        
        def __str__(self):
            return str(self.__dict__)


    class BlockChain:
        
        def __init__(self):
            self.chain = [self.createGenesisBlock()]
            self.difficulty = 5
    
        def createGenesisBlock(self):
            return Block(0,"01/01/2018","genesis block")
        
        def getLatestBlock(self):
            return self.chain[len(self.chain)-1]
        #添加区块前需要 做一道计算题😶,坐完后才能把区块加入到链上
        def addBlock(self,newBlock):
            newBlock.previousHash = self.getLatestBlock().hash
            newBlock.minerBlock(self.difficulty)
            self.chain.append(newBlock)

        def __str__(self):
            return str(self.__dict__)    
        
        def chainIsValid(self):
            for index in range(1,len(self.chain)):
                currentBlock = self.chain[index]
                previousBlock = self.chain[index-1]
                if (currentBlock.hash != currentBlock.calculateHash()):
                    return False
                if previousBlock.hash != currentBlock.previousHash:
                    return False
            return True
           

    myCoin = BlockChain()
    
    # 下面打印了每个区块挖掘需要的时间 比特币通过一定的机制控制在10分钟出一个块 
    # 其实就是根据当前网络算力 调整我们上面difficulty值的大小,如果你在
    # 本地把上面代码difficulty的值调很大你可以看到很久都不会出计算结果
    startMinerFirstBlockTime = time.time()
    print("start to miner first block time :"+str(startMinerFirstBlockTime))
    
    myCoin.addBlock(Block(1,"02/01/2018","{amount:4}"))
    
    print("miner first block time completed" + ",used " +str(time.time()-startMinerFirstBlockTime) +"s")
    
    startMinerSecondBlockTime = time.time()
    
    print("start to miner first block time :"+str(startMinerSecondBlockTime))
    
    myCoin.addBlock(Block(2,"03/01/2018","{amount:5}"))
    
    print("miner second block time completed" + ",used " +str(time.time()-startMinerSecondBlockTime) +"s\n")
    
    #print block info
    print("print block info ####:\n")
    for block in myCoin.chain:
        print("\n")
        print(block)
        
    #check blockchain is valid
    print("before tamper block,blockchain is valid ###")
    print(myCoin.chainIsValid())
    
    #tamper the blockinfo
    myCoin.chain[1].data = "{amount:1002}"
    print("after tamper block,blockchain is valid ###")
    print(myCoin.chainIsValid())


输出

在这里插入图片描述

2 快速实现一个区块链

2.1 什么是区块链

区块链是一个不可变得,有序的被称之为块的记录链,它们可以包含交易、文件或者任何你喜欢的数据,但最重要的是,它们用hash连接在一起。

2.2 一个完整的快包含什么

一个索引,一个时间戳,一个事物列表,一个校验, 一个前快的散链表

2.3 什么是挖矿

挖矿其实非常简单就做了以下三件事:

1、计算工作量证明poW
2、通过新增一个交易赋予矿工(自已)一个币
3、构造新区块并将其添加到链中

2.4 工作量证明算法:

使用该算法来证明是如何在区块上创建和挖掘新的区块,pow的目标是计算出一个符合特定条件的数字,这个数字对于所有人而言必须在计算上非常困难,但易于验证,这就是工作证明背后的核心思想计算难度与目标字符串需要满足的特定字符串成正比。

2.5 实现代码



    import hashlib
    import json
    import requests
    from textwrap import dedent
    from time import time
    from uuid import uuid4
    from urllib.parse import urlparse
    from flask import Flask, jsonify, request
    
    class Blockchain(object):
        def __init__(self):
            ...
            self.nodes = set()
            # 用 set 来储存节点,避免重复添加节点.
            ...
            self.chain = []
            self.current_transactions = []
    
            #创建创世区块
            self.new_block(previous_hash=1,proof=100)
    
        def reister_node(self,address):
            """
            在节点列表中添加一个新节点
            :param address:
            :return:
            """
            prsed_url = urlparse(address)
            self.nodes.add(prsed_url.netloc)
    
        def valid_chain(self,chain):
            """
            确定一个给定的区块链是否有效
            :param chain:
            :return:
            """
            last_block = chain[0]
            current_index = 1
    
            while current_index<len(chain):
                block = chain[current_index]
                print(f'{last_block}')
                print(f'{block}')
                print("\n______\n")
                # 检查block的散列是否正确
                if block['previous_hash'] != self.hash(last_block):
                    return False
                # 检查工作证明是否正确
                if not self.valid_proof(last_block['proof'], block['proof']):
                    return False
    
                last_block = block
                current_index += 1
            return True

        def ressolve_conflicts(self):
            """
            共识算法
            :return:
            """
            neighbours = self.nodes
            new_chain = None
            # 寻找最长链条
            max_length = len(self.chain)
    
            # 获取并验证网络中的所有节点的链
            for node in neighbours:
                response = requests.get(f'http://{node}/chain')
    
                if response.status_code == 200:
                    length = response.json()['length']
                    chain = response.json()['chain']
    
                    # 检查长度是否长,链是否有效
                    if length > max_length and self.valid_chain(chain):
                        max_length = length
                        new_chain = chain
    
            # 如果发现一个新的有效链比当前的长,就替换当前的链
            if new_chain:
                self.chain = new_chain
                return True
            return False
    
        def new_block(self,proof,previous_hash=None):
            """
            创建一个新的块并将其添加到链中
            :param proof: 由工作证明算法生成证明
            :param previous_hash: 前一个区块的hash值
            :return: 新区块
            """
            block = {
                'index':len(self.chain)+1,
                'timestamp':time(),
                'transactions':self.current_transactions,
                'proof':proof,
                'previous_hash':previous_hash or self.hash(self.chain[-1]),
            }
    
            # 重置当前交易记录
            self.current_transactions = []
    
            self.chain.append(block)
            return block
    
        def new_transaction(self,sender,recipient,amount):
            # 将新事务添加到事务列表中
            """
            Creates a new transaction to go into the next mined Block
            :param sender:发送方的地址
            :param recipient:收信人地址
            :param amount:数量
            :return:保存该事务的块的索引
            """
            self.current_transactions.append({
                'sender':sender,
                'recipient':recipient,
                'amount':amount,
            })
    
            return  self.last_block['index'] + 1

        @staticmethod
        def hash(block):
            """
            给一个区块生成 SHA-256 值
            :param block:
            :return:
            """
            # 必须确保这个字典(区块)是经过排序的,否则将会得到不一致的散列
            block_string = json.dumps(block,sort_keys=True).encode()
            return hashlib.sha256(block_string).hexdigest()
    
        @property
        def last_block(self):
            # 返回链中的最后一个块
            return self.chain[-1]

        def proof_of_work(self,last_proof):
            # 工作算法的简单证明
            proof = 0
            while self.valid_proof(last_proof,proof)is False:
                proof +=1
            return proof
    
        @staticmethod
        def valid_proof(last_proof,proof):
            # 验证证明
            guess =  f'{last_proof}{proof}'.encode()
            guess_hash = hashlib.sha256(guess).hexdigest()
            return guess_hash[:4] =="0000"


    # 实例化节点
    app = Flask(__name__)
    
    # 为该节点生成一个全局惟一的地址
    node_identifier = str(uuid4()).replace('-','')
    
    # 实例化Blockchain类
    blockchain = Blockchain()
    
    # 进行挖矿请求
    @app.route('/mine',methods=['GET'])
    def mine():
        # 运行工作算法的证明来获得下一个证明。
        last_block = blockchain.last_block
        last_proof = last_block['proof']
        proof = blockchain.proof_of_work(last_proof)
    
        # 必须得到一份寻找证据的奖赏。
        blockchain.new_transaction(
            sender="0",
            recipient=node_identifier,
            amount=1,
        )
    
        # 通过将其添加到链中来构建新的块
        previous_hash = blockchain.hash(last_block)
        block = blockchain.new_block(proof,previous_hash)
        response = {
            'message': "New Block Forged",
            'index': block['index'],
            'transactions': block['transactions'],
            'proof': block['proof'],
            'previous_hash': block['previous_hash'],
        }
        return jsonify(response), 200
    
    # 创建交易请求
    @app.route('/transactions/new',methods=['POST'])
    def new_transactions():
        values = request.get_json()
    
        # 检查所需要的字段是否位于POST的data中
        required = ['seder','recipient','amount']
        if not all(k in values for k in request):
            return 'Missing values',400
    
        #创建一个新的事物
        index = blockchain.new_transaction(values['sender'], values['recipient'], values['amount'])
        response = {'message': f'Transaction will be added to Block {index}'}
        return jsonify(response), 201
    
    # 获取所有快信息
    @app.route('/chain',methods=['GET'])
    def full_chain():
        response = {
            'chain':blockchain.chain,
            'length':len(blockchain.chain),
        }
        return jsonify(response),200
    
    # 添加节点
    @app.route('/nodes/register',methods=['POST'])
    def  register_nodes():
        values = request.get_json()
        nodes = values.get('nodes')
        if nodes is None:
            return "Error: Please supply a valid list of nodes", 400
    
        for node in nodes:
            blockchain.register_node(node)
    
        response = {
            'message': 'New nodes have been added',
            'total_nodes': list(blockchain.nodes),
        }
        return jsonify(response), 201
    
    # 解决冲突
    @app.route('/nodes/resolve', methods=['GET'])
    def consensus():
        replaced = blockchain.resolve_conflicts()
    
        if replaced:
            response = {
                'message': 'Our chain was replaced',
                'new_chain': blockchain.chain
            }
        else:
            response = {
                'message': 'Our chain is authoritative',
                'chain': blockchain.chain
            }
    
        return jsonify(response), 200
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0',port=5000)

代码弄好启动你的项目以后打开Postman 完成以下操作

在这里插入图片描述

学长通过请求 http://localhost:5000/mine进行采矿

在这里插入图片描述

3 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1868165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙面试心得

自疫情过后&#xff0c;java和web前端都进入了冰河时代。年龄、薪资、学历都成了找工作路上躲不开的门槛。 年龄太大pass 薪资要高了pass 学历大专pass 好多好多pass 找工作的路上明明阳关普照&#xff0c;却有一种凄凄惨惨戚戚说不清道不明的“优雅”意境。 如何破局&am…

修复:cannot execute binary file --- ppc64le 系统架构

前言&#xff1a; 修复node_exporter,引用pprof包&#xff0c;对源码编译后在 Linux 系统下执行程序运行时&#xff0c;发生了报错&#xff0c;报错信息&#xff1a;cannot execute binary file: Exec format error。 开始以为编译有问题&#xff0c;检查发现&#xff1b;该l…

正规的外盘期货开户指南避坑!

一&#xff1a;最正规最靠谱的外盘期货开户方式。那就是直开香港账户&#xff0c;需要基本证件、护照、境外卡等。 如果你满足以上条件&#xff0c;可以直接在香港外盘期货公司的营业部或线上官网开户。 优点&#xff1a;安全正规&#xff0c;银期转账。 缺点&#xff1a;保…

Java - 程序员面试笔记记录 实现 - Part1

社招又来学习 Java 啦&#xff0c;这次选了何昊老师的程序员面试笔记作为主要资料&#xff0c;记录一下一些学习过程。 1.1 Java 程序初始化 Java 程序初始化遵循规则&#xff1a;静态变量优于动态变量&#xff1b;父类优于子类&#xff1b;成员变量的定义顺序&#xff1b; …

1. jenkins持续集成交付

jenkins持续集成交付 一、jenkins介绍二、jenkins的安装部署1、下载jenkins2、安装jenkins3、修改插件下载地址4、初始化jenkins 一、jenkins介绍 持续集成交付&#xff0c; CI/CD 偏开发、项目编译、部署、更新 二、jenkins的安装部署 1、下载jenkins [rootjenkins ~]# wge…

LLM 推理:Nvidia TensorRT-LLM 与 Triton Inference Server

随着LLM越来越热门&#xff0c;LLM的推理服务也得到越来越多的关注与探索。在推理框架方面&#xff0c;tensorrt-llm是非常主流的开源框架&#xff0c;在Nvidia GPU上提供了多种优化&#xff0c;加速大语言模型的推理。但是&#xff0c;tensorrt-llm仅是一个推理框架&#xff0…

算法设计与分析--分布式系统作业及答案

分布式系统 作业参考答案2.1 分析在同步和异步模型下&#xff0c;convergecast 算法的时间复杂性。2.2 G 里一结点从 pr 可达当且仅当它曾设置过自己的 parent 变量。2.3 证明 Alg2.3 构造一棵以 Pr 为根的 DFS 树。2.4 证明 Alg2.3 的时间复杂度为 O(m)。2.5 修改 Alg2.3 获得…

限域传质分离膜兼具高渗透性、高选择性特点 未来应用前景广阔

限域传质分离膜兼具高渗透性、高选择性特点 未来应用前景广阔 分离膜是一种具有选择性透过功能的薄层材料。限域传质分离膜是基于限域传质机制的分离膜&#xff0c;兼具高渗透性、高选择性的特点。限域传质是流体分子通过与其运动自由程相当传质空间的过程&#xff0c;流体分子…

网络安全 DVWA通关指南 Cross Site Request Forgery (CSRF)

DVWA Cross Site Request Forgery (CSRF) 文章目录 DVWA Cross Site Request Forgery (CSRF)DVWA Low 级别 CSRFDVWA Medium 级别 CSRFDVWA High 级别 CSRFDVWA Impossible 级别 CSRF CSRF是跨站请求伪造攻击&#xff0c;由客户端发起&#xff0c;是由于没有在执行关键操作时&a…

推荐一个shp修复工具

我们在《如何解决ArcGIS中数据显示乱码问题》一文中&#xff0c;为你分享过打开shp文件的乱码问题。 现在再为你分享一个shp文件的修复工具&#xff0c;你可以在文末查看该工具的领取方式。 shp文件修复工具 Shapefile&#xff08;简称SHP&#xff09;是Esri推出的一种广泛使…

新能源行业知识体系-------蒙西电网需求侧响应

新能源行业知识体系-------主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/139946830 目录 一、背景介绍二、需求响应电能量收益介绍三、超额回收需求响应减免收益介绍四、参与需求侧响应五、蒙西电力现货特点六、交易中…

好消息!终于解决了!Coze工作流错误中断问题终于得到解决!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 解决方案 📒📝 常见的工作流中断问题📝 好消息来了!⚓️ 相关链接 ⚓️📖 介绍 📖 大家是否曾经遇到过这样的问题:在Coze平台辛辛苦苦设计的一个工作流,尤其是流程非常复杂和长的情况下,只要中间一个环节出错,整…

红海云签约联东集团,引领产业园区领军企业人力资源数字化新范式

北京联东投资&#xff08;集团&#xff09;有限公司&#xff08;以下简称“联东集团”&#xff09;是集产业园区运营、模板钢结构和投资业务为一体的集团化公司。联东集团独创了产业聚合U模式&#xff0c;致力于打造产业集聚平台&#xff0c;服务于实体企业成长和地区经济发展。…

[SD必备知识18]修图扩图AI神器:ComfyUI+Krita加速修手抽卡,告别低效抽卡还原光滑细腻双手,写真无需隐藏手势

&#x1f339;大家好&#xff01;我是安琪&#xff01;感谢大家的支持与鼓励。 krita-ai-diffusion简介 在AIGC图像生成领域的迅猛发展下&#xff0c;当前的AI绘图工具如Midjourney、Stable Diffusion都能够近乎完美的生成逼真富有艺术视觉效果的图像质量。然而&#xff0c;针…

基于大语言模型的多意图增强搜索

随着人工智能技术的蓬勃发展&#xff0c;大语言模型&#xff08;LLM&#xff09;如Claude等在多个领域展现出了卓越的能力。如何利用这些模型的语义分析能力&#xff0c;优化传统业务系统中的搜索性能是个很好的研究方向。 在传统业务系统中&#xff0c;数据匹配和检索常常面临…

SpringMVC 请求参数接收

目录 请求 传递单个参数 基本类型参数传递 未传递参数 传递参数类型不匹配 传递多个参数 传递对象 后端参数重命名 传递数组 传递集合 传递JSON数据 JSON是什么 JSON的优点 传递JSON对象 获取URL中的参数 文件上传 在浏览器与程序进行交互时&#xff0c;主要分为…

互联网信息服务算法备案流程与要求

一、备案申请的办理流程 企业通过网信办的互联网信息服务算法备案系统&#xff08;https://beian.cac.gov.cn/#/index&#xff09;提交算法备案申请。填报信息包括三部分&#xff0c;分别是算法主体信息、产品及功能信息、算法信息。备案中比较重要的文件包括主体信息中的《落…

anaconda卸载过程中出现fail to run pre-unistall报错

问题&#xff1a; 在使用Uninstall-Anaconda3.exe卸载程序时&#xff0c;出现报错&#xff1a; 解决方案&#xff1a; 把文件夹移动到C盘用户文件夹后再运行卸载程序。即可正常运行程序。

精彩回顾 | 2024高通边缘智能创新应用大赛系列公开课

5月29日-6月6日&#xff0c;我们陆续开展了四场精彩绝伦的2024高通边缘智能创新应用大赛直播公开课。高通、阿加犀、广翼智联以及美格智能的业务领袖和行业大咖齐聚一堂&#xff0c;聚焦边缘智能&#xff0c;分享前沿技术、探讨创新应用&#xff0c;抢先揭秘比赛设备的核心特性…

<sa8650>QCX Usecase 使用详解— Spectra Studio-新建usecase

<sa8650>QCX Usecase 使用详解— Spectra Studio-新建usecase 一 前言二 创建usecaseTEST2.1 打开工程2.2 新建sa8650的usecaseTEST2.2.1 步骤1 添加Usecase2.2.2 步骤2 输入参数(参考UsecaseFFC)2.2.3 步骤3 创建 Pipeline2.2.4 步骤4 转换到本地2.2.5 添加usecaseID号三 使…