FiscoBcos使用Go调用合约
环境: fisco2.8.0
go 1.17
go-sdk 1.0.0
solidity 0.4.25
前言
请提前启动好四个fisco节点。
请准备好一个属于此fisco节点的账户私钥【待会调用合约和部署合约会用到】
此文章将讲解 官方文档使用gosdk部署helloworld合约并调用其方法 合约开发样例
官网提示
Golang, 版本需不低于1.13.6,本项目采用go module进行包管理。具体可查阅Using Go Modules,环境配置
FISCO BCOS 2.2.0+, 需要提前运行 FISCO BCOS 区块链平台,可参考安装搭建
Solidity编译器,默认0.4.25版本
gosdk的拉取
# 拉取代码
git clone https://github.com/FISCO-BCOS/go-sdk.git# 若因为网络问题导致长时间无法执行上面的命令,请尝试以下命令:
git clone https://gitee.com/FISCO-BCOS/go-sdk.git
root@192-168-19-133:/usr/project/goproject# ll
drwxr-xr-x 17 root root 4096 11月 16 10:29 go-sdk/
go-sdk的tag版本
root@192-168-19-133:/usr/project/goproject/go-sdk# git show
commit d1a8411d0e7600e2ece7c50c6da523ee52f32a45 (HEAD -> master, tag: v1.0.0, origin/master, origin/HEAD)
Merge: 5ca92a0 797900f
Author: XingQiang Bai <bxq2011hust@qq.com>
Date: Thu May 12 17:22:46 2022 +0800Merge pull request #148 from FISCO-BCOS/release-v1.0.0Release v1.0.0
创建 helloworld的项目
我选择不跟官网的步骤,不在go-sdk目录进行创建,选择在gopath的工作目录下面进行项目创建【这样比较方便管理】
root@192-168-19-133:/usr/project/goproject# mkdir helloworld
然后进行go项目初始化
root@192-168-19-133:/usr/project/goproject/helloworld# go mod init helloworld
go: creating new go.mod: module helloworld
然后在helloworld目录下,编写一个HelloWorld.sol的合约
pragma solidity>=0.4.24 <0.6.11;contract HelloWorld {string value;constructor() public {value = "你好,golang!";}function get() public view returns (string memory) {return value;}function set(string v) public {value = v;}
}
进行安装solc编译器
在helloworld项目下执行此命令,需要用到在go-sdk里面的下载编译器脚本文件, go-sdk的目录需要根据各自的实际情况来选择
bash /usr/project/goproject/go-sdk/tools/download_solc.sh -v 0.4.25 # 它会做链接到当前目录下
root@192-168-19-133:/usr/project/goproject/helloworld# bash /usr/project/goproject/go-sdk/tools/download_solc.sh -v 0.4.25
Downloading solc 0.4.25 solc-linux.tar.gz from https://github.com/FISCO-BCOS/solidity/releases/download/v0.4.25/solc-linux.tar.gz
==============================================================
[INFO] os : linux
[INFO] solc version : 0.4.25
[INFO] solc location : ./solc-0.4.25
==============================================================
[INFO] ./solc-0.4.25 --version
solc, the solidity compiler commandline interface
Version: 0.4.25+commit.46d177ad.mod.Linux.g++
root@192-168-19-133:/usr/project/goproject/helloworld# ll
总用量 12
drwxr-xr-x 2 root root 4096 11月 16 10:46 ./
drwxrwxrwx 8 root root 4096 11月 16 10:38 ../
-rw-r--r-- 1 root root 294 11月 16 10:43 HelloWorld.sol
lrwxrwxrwx 1 root root 29 11月 16 10:46 solc-0.4.25 -> /root/.fisco/solc/solc-0.4.25*
生成abi,bin文件
使用solc 进行编译 命令的意思是,根据HelloWorld.sol生成abi,bin文件到当前目录下
root@192-168-19-133:/usr/project/goproject/helloworld# ./solc-0.4.25 --bin --abi -o ./ ./HelloWorld.sol #
root@192-168-19-133:/usr/project/goproject/helloworld# ll
总用量 20
drwxr-xr-x 2 root root 4096 11月 16 10:49 ./
drwxrwxrwx 8 root root 4096 11月 16 10:38 ../
-rw-r--r-- 1 root root 375 11月 16 10:49 HelloWorld.abi
-rw-r--r-- 1 root root 2010 11月 16 10:49 HelloWorld.bin
-rw-r--r-- 1 root root 294 11月 16 10:43 HelloWorld.sol
lrwxrwxrwx 1 root root 29 11月 16 10:46 solc-0.4.25 -> /root/.fisco/solc/solc-0.4.25*
构建go-sdk的代码生成工具abigen
该工具用于将 abi 和 bin 文件转换为 go 文件
进入go-sdk目录,编译生成abigen工具 [会生成一个abigen的二进制文件]
root@192-168-19-133:/usr/project/goproject/go-sdk# go build ./cmd/abigen/
root@192-168-19-133:/usr/project/goproject/go-sdk# ll | grep abigen
-rwxr-xr-x 1 root root 21519720 11月 16 11:33 abigen*
若 上面步骤报错:可以在go-sdk目录执行此命令,把依赖重新下载导入一下
go mod tidy
然后将此文件复制到helloworld项目,[此abigen可以复用,以后想用abigen,直接复制就可以了,不需要再去go-sdk里再编译]
cp -r abigen ../helloworld/`
编译生成go文件
在helloworld目录下执行命令编译
./abigen --bin ./HelloWorld.bin --abi ./HelloWorld.abi --pkg helloworld --type HelloWorld --out ./HelloWorld.go
命令的意思是使用bin,abi文件在当前目录下 生成一个包为helloworld ,类型为HelloWorld的HelloWorld.go文件
root@192-168-19-133:/usr/project/goproject/helloworld# ll
drwxrwxrwx 4 root root 4096 11月 16 11:36 ./
drwxrwxrwx 8 root root 4096 11月 16 11:35 ../
-rwxrwxrwx 1 root root 21519720 11月 16 11:37 abigen*
-rwxrwxrwx 1 root root 531 11月 16 11:06 config.toml*
-rw-r--r-- 1 root root 1970 11月 16 11:31 go.mod
-rwxrwxrwx 1 root root 375 11月 16 10:49 HelloWorld.abi*
-rwxrwxrwx 1 root root 2010 11月 16 10:49 HelloWorld.bin*
-rwxrwxrwx 1 root root 13739 11月 16 11:03 HelloWorld.go*
-rwxrwxrwx 1 root root 294 11月 16 10:43 HelloWorld.sol*
lrwxrwxrwx 1 root root 29 11月 16 10:46 solc-0.4.25 -> /root/.fisco/solc/solc-0.4.25*
准备部署合约的相关文件
拷贝 config.toml 并修改配置
将 go-sdk目录下config.toml拷贝到helloworld目录下
cp -r ../go-sdk/config.toml .
拷贝节点的sdk文件目录到helloworld目录下【根据自己的机子存放情况来执行命令】
拷贝账户私钥到helloworld目录下【前言有说明】
当前目录存在的文件
root@192-168-19-133:/usr/project/goproject/helloworld# ll
总用量 21120
drwxrwxrwx 4 root root 4096 11月 16 12:41 ./
drwxrwxrwx 8 root root 4096 11月 16 11:35 ../
-rwxrwxrwx 1 root root 21519720 11月 16 11:37 abigen*
-rwxrwxrwx 1 root root 249 11月 16 11:05 admin.pem* ## 私钥
-rwxrwxrwx 1 root root 531 11月 16 11:06 config.toml* ## 配置文件
-rw-r--r-- 1 root root 1970 11月 16 11:31 go.mod # go mod文件
-rwxrwxrwx 1 root root 375 11月 16 10:49 HelloWorld.abi*
-rwxrwxrwx 1 root root 2010 11月 16 10:49 HelloWorld.bin*
-rwxrwxrwx 1 root root 13739 11月 16 11:03 HelloWorld.go*
-rwxrwxrwx 1 root root 294 11月 16 10:43 HelloWorld.sol*
drwxrwxrwx 2 root root 4096 11月 16 11:03 sdk/ # 节点连接证书
lrwxrwxrwx 1 root root 29 11月 16 10:46 solc-0.4.25 -> /root/.fisco/solc/solc-0.4.25*
修该config.toml
[Network]
#type rpc or channel
Type="channel"
# 三个节点证书,使用相对路径
CAFile="./sdk/ca.crt"
Cert="./sdk/sdk.crt"
Key="./sdk/sdk.key"
# if the certificate context is not empty, use it, otherwise read from the certificate file
# multi lines use triple quotes
CAContext=''''''
KeyContext=''''''
CertContext=''''''[[Network.Connection]]
NodeURL="127.0.0.1:20200" # 节点的地址
GroupID=1 # 群组id
# [[Network.Connection]]
# NodeURL="127.0.0.1:20200"
# GroupID=2[Account]
# only support PEM format for now
KeyFile="./admin.pem" #使用什么账户调用合约[Chain]
ChainID=1 #链id
SMCrypto=false # 费国密[log]
Path="./"
编写部署合约的go文件 并部署
在helloworld目录下创建cmd文件夹,在cmd文件夹下创建一个main.go文件
代码如下
package mainimport ("fmt""log""helloworld" //导入本地项目helloworld"github.com/FISCO-BCOS/go-sdk/client""github.com/FISCO-BCOS/go-sdk/conf"
)func main(){configs, err := conf.ParseConfigFile("config.toml") //读取config.toml文件if err != nil {log.Fatal(err)}config := &configs[0]client, err := client.Dial(config) //加载配置文件,生成client进行相关链操作if err != nil {log.Fatal(err)}address, tx, instance, err := helloworld.DeployHelloWorld(client.GetTransactOpts(), client) // 调用hellowrold的部署合约方法if err != nil {log.Fatal(err)}fmt.Println("contract address: ", address.Hex()) // 合约的地址fmt.Println("transaction hash: ", tx.Hash().Hex()) //此次部署合约的交易hash_ = instance
}
然后在helloworld目录下执行依赖包导入命令
go mod tidy
如果导入失败了,可以复制go-sdk的go.mod和go.sum文件,修改好项目名,进行go mod tidy
还有确保GO111MODULE是on
此时项目的目录
root@192-168-19-133:/usr/project/goproject/helloworld# ll
总用量 21120
drwxrwxrwx 4 root root 4096 11月 16 12:50 ./
drwxrwxrwx 8 root root 4096 11月 16 11:35 ../
-rwxrwxrwx 1 root root 21519720 11月 16 11:37 abigen*
-rwxrwxrwx 1 root root 249 11月 16 11:05 admin.pem*
drwxrwxrwx 2 root root 4096 11月 16 12:47 cmd/
-rwxrwxrwx 1 root root 531 11月 16 12:42 config.toml*
-rw-r--r-- 1 root root 1970 11月 16 11:31 go.mod
-rw-r--r-- 1 root root 46323 11月 16 11:31 go.sum
-rwxrwxrwx 1 root root 375 11月 16 10:49 HelloWorld.abi*
-rwxrwxrwx 1 root root 2010 11月 16 10:49 HelloWorld.bin*
-rwxrwxrwx 1 root root 13739 11月 16 11:03 HelloWorld.go*
-rwxrwxrwx 1 root root 294 11月 16 10:43 HelloWorld.sol*
drwxrwxrwx 2 root root 4096 11月 16 11:03 sdk/
lrwxrwxrwx 1 root root 29 11月 16 10:46 solc-0.4.25 -> /root/.fisco/solc/solc-0.4.25*
在helloworld 文件夹下执行命令 go run cmd/main.go
root@192-168-19-133:/usr/project/goproject/helloworld# go run cmd/main.go
contract address: 0xA2132f9E796F954f4483A7078a357114F54D2f1B
transaction hash: 0x741fe11c3f1da7ad2ca43deb3b7045c170ce43aa5b3581bdfbf86a6fc323e331
然后就获得了部署合约的地址,部署成功
编写get/set方法的go文件,并调用
根据官网的例子,在helloworld文件夹下创建contract文件夹,并在在contract文件夹下编写go文件helloworld_set_get.go文件
package mainimport ("fmt""log""helloworld" //导入本地项目helloworld"github.com/FISCO-BCOS/go-sdk/client""github.com/FISCO-BCOS/go-sdk/conf""github.com/ethereum/go-ethereum/common"
)func main() {configs, err := conf.ParseConfigFile("config.toml") //读取配置文件if err != nil {log.Fatal(err)}config := &configs[0] client, err := client.Dial(config) //加载配置文件,生成clientif err != nil {log.Fatal(err)}// load the contractcontractAddress := common.HexToAddress("0xA2132f9E796F954f4483A7078a357114F54D2f1B") // 这里请放入刚刚部署的合约地址,注意,是你自己的机子部署的地址instance, err := helloworld.NewHelloWorld(contractAddress, client) //根据地址和client生成helloworld合约对象if err != nil {log.Fatal(err)}helloworldSession := &helloworld.HelloWorldSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()} //根据合约对象和client的call和transact进行实例化一个合约通信对象 helloworldSessionvalue, err := helloworldSession.Get() // 调用get方法if err != nil {log.Fatal(err)}fmt.Println("value :", value)value = "Hello, Hello,Hello"tx, receipt, err := helloworldSession.Set(value) // 调用set方法if err != nil {log.Fatal(err)}fmt.Printf("tx sent: %s\n", tx.Hash().Hex()) //调用set方法的交易hashfmt.Printf("transaction hash of receipt: %s\n", receipt.GetTransactionHash()) //调用set方法的交易hash ,与上面的hash是一样,只是存在不同的地方而已
}
执行go文件,在helloworld目录下
go run contract/helloworld_set_get.go
结果
root@192-168-19-133:/usr/project/goproject/helloworld# go run contract/helloworld_set_get.go
value : 你好,golang!
tx sent: 0x5a49ac1b48ebe717c75cbeb3a3144a031db8cfd5a0cdf7c38a151a87f1454583
transaction hash of receipt: 0x5a49ac1b48ebe717c75cbeb3a3144a031db8cfd5a0cdf7c38a151a87f1454583
结语
相较于fisco的java-sdk ,go-sdk的使用起来还是比较困难,因为webase也集成了java-sdk,一键就能导出所有所需要的java项目文件。
若有空,我将讲解如果结合goweb的框架,集成fisco和使用go文件调用合约,生成web项目【我比较倾向讲解beego框架】。
相关文章:
FiscoBcos使用Go调用合约
环境: fisco2.8.0 go 1.17 go-sdk 1.0.0 solidity 0.4.25 前言 请提前启动好四个fisco节点。 请准备好一个属于此fisco节点的账户私钥【待会调用合约和部署合约会用到】 此文章将讲解 官方文档使用gosdk部署helloworld合约并调用其方法 合约开发样例 官网提示 G…...
自然语言处理(NLP)-spacy简介以及安装指南(语言库zh_core_web_sm)
spacy 简介 spacy 是 Python 自然语言处理软件包,可以对自然语言文本做词性分析、命名实体识别、依赖关系刻画,以及词嵌入向量的计算和可视化等。 1.安装 spacy 使用 “pip install spacy" 报错, 或者安装完 spacy,无法正…...
CTF-PWN-tips
文章目录 overflowscanfgetreadstrcpystrcat Find string in gdbgdbgdb peda Binary ServiceFind specific function offset in libc手工自动 Find /bin/sh or sh in library手动自动 Leak stack addressFork problem in gdbSecret of a mysterious section - .tlsPredictable …...
《Effective C++》条款21
必须返回对象时,别妄想返回其reference 如果你的运算符重载函数写成了返回reference的形式: class A { public:A(int a,int b):x(a),y(b){}friend const A& operator*(const A& a, const A& b); private:int x;int y; }; const A& opera…...
决策树,sql考题,30个经典sql题目
大数据: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学&#x…...
【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
关于Java中的深拷贝与浅拷贝
Java中的深拷贝和浅拷贝是针对对象和数组等引用数据类型的复制操作。 浅拷贝(Shallow Copy): 对于基本数据类型,浅拷贝直接复制其值。对于引用数据类型,浅拷贝只复制对原对象的引用,而不是复制对象本身。因…...
13.真刀实枪做项目---博客系统(页面设计)
文章目录 1.预期效果1.1博客列表页效果1.2博客详情页效果1.3博客登陆页效果1.4博客编辑页效果 2.实现博客列表页2.1实现导航栏2.2实现版心2.3实现个人信息2.4实现博客列表2.5博客列表页完整代码 3.实现博客正文页3.1引入导航栏3.2引入版心3.3引入个人信息3.4实现博客正文3.5博客…...
VScode 配置用户片段
文件->首选项->配置用户片段->新建全局用户片段 后续就可以通过vv3来直接生成下面的代码 {// Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // description. Add comma separated ids of the l…...
Fedora 项目近日发布了 Fedora Linux 39
导读几经推迟之后,Fedora 项目近日发布了 Fedora Linux 39,这是红帽公司赞助的面向大众的 GNU/Linux 发行版的最新稳定版本,采用了最新的技术和开源应用程序。 Fedora Linux 39 由 Linux 内核 6.5 支持,并提供了一些最新的桌面环境…...
Uniapp连接iBeacon设备——实现无线定位与互动体验(理论篇)
目录 前言: 一、什么是iBeacon技术 二、Uniapp连接iBeacon设备的准备工作 硬件设备: 三、Uniapp连接iBeacon设备的实现步骤 创建Uniapp项目: 四、Uniapp连接iBeacon设备的应用场景 室内导航: 五、Uniapp连接iBeacon设备的未来…...
GCD:异步同步?串行并发?一文轻松拿捏!
GCD 文章目录 GCD进程线程进程与线程的关系进程与线程的区别 任务(执行的代码)队列线程与队列的关系 队列任务**同步执行任务(sync)**辅助方法**异步执行任务(async)**总结栅栏任务迭代任务 队列详细属性QoSAttributes…...
学习c#的第十七天
目录 C# 异常处理 异常的原因 System.Exception 类 如何处理异常 常见的异常类 throw 语句 throw 表达式 try 语句 try-catch 语句 try-finally 语句 try-catch-finally 语句 when 异常筛选器 异步和迭代器方法中的异常 C# 异常处理 C # 中的异常提供了结构化、统…...
龙芯 操作系统选择和安装
龙芯3a5000及之后的cpu底层架构已经从mips64el改为了loongarch64 所以这里分了2种来说明,分别对应3a4000之前的和3a5000之后的 龙芯的系统安装难点在于操作系统的选取和引导 一、烧录工具 制作安装盘使用常规的烧录工具是不行滴,会提示没有\boot\initrd…...
【开源】基于JAVA的智能停车场管理系统
项目编号: S 005 ,文末获取源码。 \color{red}{项目编号:S005,文末获取源码。} 项目编号:S005,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系…...
使用IDEA 将Eclipse java工程转为maven格式
使用IDEA 将Eclipse java工程转为maven格式 ①使用idea打开项目,在项目根目录下右键选择 Add Framework Support 选择 maven ,引入maven ②找到项目中的.classpath文件或者lib目录 根据.classpath文件或者lib目录中列举的jar包名,将其依次手…...
CCF CSP认证 历年题目自练Day47
题目 试题编号: 201712-3 试题名称: Crontab 时间限制: 10.0s 内存限制: 256.0MB 样例输入 3 201711170032 201711222352 0 7 * * 1,3-5 get_up 30 23 * * Sat,Sun go_to_bed 15 12,18 * * * have_dinner 样例输出 201711170…...
LeetCode Hot100之十:239.滑动窗口最大值
题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 提示: 1 < nums.length < 10^5 -10^4 < nums[i…...
x264、x265、OpenH264 简要对比
一: x264、x265、OpenH264,都是开源代码库;二: H264(MPEG-4/AVC)、H265(HEVC),是视频编码格式。是视频标准; H264(MPEG-4/AVC) 简称: H264 或 AVC; H265(HEVC) 简称: H265 …...
二维码智慧门牌管理系统升级解决方案:门牌聚合,让管理更便捷!
文章目录 前言一、传统门牌管理系统的瓶颈二、地图门牌聚合展示的优势三、地图门牌聚合展示的实现方法四、智慧门牌管理系统的未来发展 前言 随着城市的发展和建设,对于地址信息的管理变得越来越重要。而智慧门牌管理系统作为管理地址信息的重要工具,其…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
