[Day 21] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
區塊鏈的智能合約運行機制
區塊鏈技術自比特幣誕生以來,便以其去中心化、安全性和透明性等特點引起了廣泛的關注和應用。而智能合約作為區塊鏈技術的一大創新,進一步擴展了區塊鏈的應用場景,使其不僅僅局限於數字貨幣,還可以應用於各種交易和協議的自動化執行。本文將詳細介紹區塊鏈的智能合約運行機制,並通過代碼實例展示其實際應用。
1. 智能合約的基本概念
智能合約是一種基於區塊鏈技術的自動執行協議,它將合同條款編寫成代碼,當觸發特定條件時,合約自動執行。智能合約具有以下特點:
- 自動執行:當條件滿足時,自動執行合約條款,無需人工干預。
- 去中心化:合約的執行依賴於區塊鏈網絡,無需第三方中介。
- 不可篡改:一旦部署到區塊鏈上,智能合約的代碼和數據不可更改,保障了合約的可信性。
2. 智能合約的運行機制
智能合約運行在區塊鏈的虛擬機上,例如以太坊的EVM(以太坊虛擬機)。當用戶發送交易觸發智能合約時,虛擬機負責執行合約代碼,並將執行結果寫入區塊鏈。智能合約的運行過程如下:
- 部署合約:將智能合約代碼部署到區塊鏈上,生成合約地址。
- 觸發合約:用戶通過交易調用合約的函數,觸發合約執行。
- 執行合約:區塊鏈節點在虛擬機上執行合約代碼,更新合約狀態。
- 記錄結果:執行結果和狀態變更被寫入區塊鏈,並廣播給所有節點。
3. 實例分析:使用Solidity編寫智能合約
Solidity是以太坊上最常用的智能合約編寫語言。下面是一個簡單的智能合約示例,展示如何編寫和部署一個簡單的投票合約。
代碼示例:簡單的投票合約
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract SimpleVoting {struct Candidate {uint id;string name;uint voteCount;}mapping(uint => Candidate) public candidates;mapping(address => bool) public voters;uint public candidatesCount;event VotedEvent(uint indexed candidateId);constructor() {addCandidate("Alice");addCandidate("Bob");}function addCandidate(string memory _name) private {candidatesCount++;candidates[candidatesCount] = Candidate(candidatesCount, _name, 0);}function vote(uint _candidateId) public {require(!voters[msg.sender], "You have already voted");require(_candidateId > 0 && _candidateId <= candidatesCount, "Invalid candidate");voters[msg.sender] = true;candidates[_candidateId].voteCount++;emit VotedEvent(_candidateId);}
}
代碼解釋:
- 合約聲明:
pragma solidity ^0.8.0;指定了Solidity編譯器版本。 - 結構體定義:定義了一個
Candidate結構體,包含候選人的ID、姓名和得票數。 - 映射和狀態變量:使用
mapping將候選人的ID映射到Candidate,並記錄已投票的用戶。candidatesCount記錄候選人數量。 - 事件:定義了一個
VotedEvent事件,用於記錄投票事件。 - 構造函數:合約部署時自動調用,添加兩個候選人。
- 添加候選人函數:
addCandidate函數添加候選人到candidates映射中。 - 投票函數:
vote函數檢查用戶是否已投票及候選人ID是否有效,更新投票記錄和候選人得票數,並觸發VotedEvent事件。
4. 智能合約的部署與調用
部署智能合約需要使用工具,如Remix IDE或Truffle框架。以下將展示如何在Remix IDE中部署和調用上述投票合約。
部署智能合約
- 打開Remix IDE:進入Remix IDE。
- 創建合約文件:在文件管理器中新建一個
.sol文件,將上述合約代碼粘貼進去。 - 編譯合約:點擊左側工具欄的編譯圖標,選擇合約文件,點擊編譯按鈕進行編譯。
- 部署合約:切換到部署選項卡,選擇編譯出的合約,點擊“Deploy”按鈕部署合約。
調用智能合約
- 檢查候選人:部署後,在“Deployed Contracts”下方展開合約,調用
candidates函數查看候選人信息。 - 投票:調用
vote函數,輸入候選人ID進行投票,並查看投票結果。
5. 智能合約的安全性考量
智能合約的安全性是關鍵問題,常見的安全性挑戰包括:
- 重入攻擊:攻擊者在合約函數執行過程中重複調用函數,造成不預期的結果。
- 溢出與下溢:數值計算中超出數據類型範圍,導致錯誤結果。
- 權限控制:未妥善控制合約函數的訪問權限,導致合約被惡意調用。
代碼示例:防止重入攻擊
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract SecureContract {mapping(address => uint) public balances;function deposit() public payable {balances[msg.sender] += msg.value;}function withdraw(uint _amount) public {require(balances[msg.sender] >= _amount, "Insufficient balance");// 使用checks-effects-interactions模式防止重入攻擊uint previousBalance = balances[msg.sender];balances[msg.sender] -= _amount;payable(msg.sender).transfer(_amount);require(balances[msg.sender] == previousBalance - _amount, "Balance mismatch");}
}
代碼解釋:
- 合約聲明:
pragma solidity ^0.8.0;指定了Solidity編譯器版本。 - 映射和存款函數:
deposit函數允許用戶存款,更新用戶餘額。 - 取款函數:
withdraw函數防止重入攻擊,先更新用戶餘額,再進行轉賬操作,最後檢查餘額是否正確。
6. 智能合約的實際應用場景
智能合約具有廣泛的應用場景,以下是幾個典型應用:
- 供應鏈管理:使用智能合約追踪產品的生產和運輸過程,確保透明度和可追溯性。
- 數字身份認證:智能合約實現去中心化的身份驗證,保護用戶隱私。
- 去中心化金融(DeFi):智能合約實現貸款、交易等金融服務,降低成本,提高效率。
代碼示例:去中心化金融(DeFi)中的貸款合約
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract DeFiLoan {struct Loan {uint amount;uint interest;address borrower;bool repaid;}mapping(uint => Loan) public loans;uint public loanCount;address public owner;event LoanCreated(uint loanId, uint amount, uint interest, address borrower);event LoanRepaid(uint loanId, uint amount, address borrower);constructor() {owner = msg.sender;}function createLoan(uint _amount, uint _interest) public {loanCount++;loans[loanCount] = Loan(_amount, _interest, msg.sender, false);emit LoanCreated(loanCount, _amount, _interest, msg.sender);}function repayLoan(uint _loanId) public payable {Loan storage loan = loans[_loanId];require(msg.sender == loan.borrower, "Only borrower can repay");require(!loan.repaid, "Loan already repaid");require(msg.value == loan.amount + loan.interest, "Incorrect amount");loan.repaid = true;payable(owner).transfer(msg.value);emit LoanRepaid(_loanId, msg.value, msg.sender);}
}
代碼解釋:
- 合約聲明:
pragma solidity ^0.8.0;指定了Solidity編譯器版本。 - 結構體定義:定義了一個
Loan結構體,包含貸款金額、利息、借款人地址和還款狀態。 - 映射和狀態變量:使用
mapping將貸款ID映射到Loan,記錄貸款信息。loanCount記錄貸款數量,owner記錄合約所有者。 - 事件:定義了兩個事件
LoanCreated和LoanRepaid,分別用於記錄貸款創建和還款事件。 - 創建貸款函數:
createLoan函數創建新貸款,更新貸款記錄,並觸發LoanCreated事件。 - 還款函數:
repayLoan函數檢查還款條件,更新貸款狀態,將還款金額轉給合約所有者,並觸發LoanRepaid事件。
結論
智能合約作為區塊鏈技術的重要組成部分,通過其自動執行、去中心化和不可篡改的特性,為各種應用場景提供了高效、安全的解決方案。無論是在供應鏈管理、數字身份認證還是去中心化金融領域,智能合約都展現了其巨大的潛力和應用價值。隨著技術的不斷進步,智能合約在更多領域中的應用將會更加廣泛和深入,為社會帶來更多的創新和變革。
相关文章:
[Day 21] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
區塊鏈的智能合約運行機制 區塊鏈技術自比特幣誕生以來,便以其去中心化、安全性和透明性等特點引起了廣泛的關注和應用。而智能合約作為區塊鏈技術的一大創新,進一步擴展了區塊鏈的應用場景,使其不僅僅局限於數字貨幣,還可以應用…...
使用ps给gif动图抠图
目录 导入gif图片 打开时间轴 选择图片 魔棒抠图-初步抠图 套索抠图-精准抠图 导入gif图片 打开时间轴 因为gif动图实际上多张图片实现的效果,所以如果要给gif抠图,就得挨个给每个时间线的图片抠图 点击窗口->时间轴 选择图片 在时间轴上选择要…...
pmp顺利通关总结
目录 一、背景二、总结三、过程 一、背景 人活着总是想去做一些事情,通过这些事情来证明自己还活着。 而我证明自己还会活着并且活得很好的方式和途径,是通过这些东西去让自己有一个明确的边界节点;借此知识来验证自己的学习能力。 我坚定认…...
未来的钥匙在于过去:学历史的真正意义,震惊!历史竟然是偶然的?从历史中寻找未来的方向!
我们自幼接受的教育是,学历史是为了相信历史是必然的。中国人民必然战胜日寇的侵略,解放思想和改革开放必定会发生,和平和发展必定是世界的主题,中国经济必定是高速增长…… 然而,在真正的历史学家眼中,历史…...
ES6自定义模块
在ES6中,我们可以使用 export 和 import 关键字来定义和使用自定义模块。 定义模块 导出(export) 命名导出(Named Exports): 使用 export 关键字来导出模块中的变量、函数、类等。例如: // ma…...
Windows页面错误(Page Fault)写几种c++会导致,此问题的例子
在C中,直接导致Windows页面错误(Page Fault)的情景较少直接由编程错误引发,页面错误更多是由操作系统在内存管理和虚拟内存机制中处理的。不过,某些编程错误可能导致访问违规,进而间接引起操作系统报告页面…...
AC7801时钟配置流程
一 默认配置 在启动文件中,已经对时钟进行了初始化,默认按外部8M晶振,配置系统时钟为48MHZ,APB为系统时钟的2分频,为24MHZ。在system_ac780x.c文件中,可以找到下面这个系统初始化函数,里面有Se…...
加密与安全_Java 加密体系 (JCA) 和 常用的开源密码库
文章目录 Java Cryptography Architecture (JCA)开源国密库国密算法对称加密(DES/AES⇒SM4)非对称加密(RSA/ECC⇒SM2)散列(摘要/哈希)算法(MD5/SHA⇒SM3) 在线生成公钥私钥对,RSA公私钥生成参考…...
读书笔记-《Spring技术内幕》(三)MVC与Web环境
前面我们学习了 Spring 最核心的 IoC 与 AOP 模块(读书笔记-《Spring技术内幕》(一)IoC容器的实现、读书笔记-《Spring技术内幕》(二)AOP的实现),接下来继续学习 MVC,其同样也是经典…...
k8s及常用对象简介
文章目录 一、k8s是什么应用程序早期部署形式容器的引入k8s的作用 二、k8s中的常用对象1、Node获取node信息 2、Namespacenamespace的使用 3、Pod生命周期pod的使用 4、DaemonSetDaemonSet的使用 5、Deployment创建deploy 6、ReplicaSet7、StatefulSet创建StatefulSet 8、更新操…...
HTTPS数字证书验证论述
1 概述 网络请求方式通常分为两种,分别是HTTP请求和HTTPS请求,其中HTTP的传输属于明文传输,在传输的过程中容易被人截取并且偷窥其中的内容,而HTTPS是一种在HTTP的基础上加了SSL/TLS层(安全套接层)的安全的…...
【高考志愿】地质资源与地质工程
目录 一、专业概述 1.1 专业定义 1.2 主要课程 1.3 专业培养目标 二、就业前景和考研方向 三、工作特点和挑战 四、如何培养核心竞争力 五、 地质资源与地质工程专业排名 六、结语 关于高考志愿选择地质资源与地质工程专业,以下是一些详细的介绍和参考信息…...
全网最佳硕士研究生复试简历模板
硕士研究生复试简历模板 ✨ 简介 提供了一个适用于国内硕士研究生复试的个人简历模板。该模板通过统一的“样式”形成规范的Word格式,是目前研究生复试的最佳简历模板之一。模板使用“华文中宋”字体,如您的电脑中未安装此字体,请提前安装。…...
Rocky Linux 9 系统OpenSSH CVE-2024-6387 漏洞修复
Rocky Linux 9系统 OpenSSH CVE-2024-6387 漏洞修复 1、漏洞修复2、修复思路3、修复方案3.1、方案一3.2、方案二 4、总结5、参考 1、漏洞修复 CVE-2024-6387:regreSSHion:OpenSSH 服务器中的远程代码执行(RCE),至少在…...
Sping源码(九)—— Bean的初始化(非懒加载)—mergeBeanDefinitionPostProcessor
序言 前几篇文章详细介绍了Spring中实例化Bean的各种方式,其中包括采用FactoryBean的方式创建对象、使用反射创建对象、自定义BeanFactoryPostProcessor以及构造器方式创建对象。 创建对象 这里再来简单回顾一下对象的创建,不知道大家有没有这样一个疑…...
labview技巧——AMC框架安装
AMC工具包的核心概念是队列,队列是一种先进先出(FIFO,First In First Out)的数据结构,适用于处理并发和异步任务。在LabVIEW中,队列可以用于在不同VI之间传递数据,确保消息的有序处理࿰…...
解锁分布式云多集群统一监控的云上最佳实践
作者:在峰 引言 在当今数字化转型加速的时代,随着混合云、多云多集群环境等技术被众多企业广泛应用,分布式云架构已成为众多企业和组织推动业务创新、实现弹性扩展的首选,分布式云容器平台 ACK One(Distributed Clou…...
学会拥抱Python六剑客,提高编程效率
在Python语言中,有六个强大的工具,它们被称为"Python六剑客"。而Python六剑客指的是Python中常用的六种功能强大且灵活的工具,它们分别是“切片(Slicing),推导列表(List Comprehensio…...
mysql 根据当前时间筛选某个时间范围内的数据
1.根据天数筛选 SELECT * FROM coupons WHERE NOW() BETWEEN start_time AND end_time; 在这个查询中,NOW()函数返回当前的日期和时间。BETWEEN操作符用于检查NOW()返回的当前时间是否在start_time和end_time之间(包括这两个时间)。 注意&a…...
Linux 常用指令详解
Linux 是一个强大而灵活的操作系统,掌握常用的 Linux 指令是使用和管理 Linux 系统的基础。本文将介绍一些常用的 Linux 指令,并附上 Vim 和 g 的常用指令说明,帮助你更好地进行开发和操作。 1. 基本文件操作指令 1.1 显示目录内容 ls常用…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
