转载:http://www.showmuch.com/article/article_120.html
前面讲了交易单,接下来讲讲交易单的类型和交易验证的实现细节。
交易的类型与验证
交易单(Transaction)目前被bitcoin分为3种:
- 按IP地址转账(Transfer)
- 按接收地址转账(Transfer)
- 造币(Generation)
通过前面对交易单的描述,我想大家应该已经知道,交易的验证是通过不断的追溯交易单来完成的。那么交易验证的细节是如何实现的,bitcoin的交易验证的实现细节是很意思的,它是通过脚本来实现验证的,这样bitcoin就实现了一个可被脚本扩展的行为,更加广义的”交易”,这可以保证足够的灵活性和可扩展,可以想象也许以后会有真正的分布式计算任务跑在上面作为一笔交易。因此要想讲清楚验证的细节,就不得不从脚本系统讲起了。
脚本系统
Bitcoin的脚本系统是使用类FORTH语言(FORTH在嵌入式设备中是我最喜欢的一种语言)实现的,FORTH系统是面向栈的“高级机器”语言,它兼具了高级语言的特性(面向WORD)和机器语言的高性能与小尺寸,唯一的缺点就是可读性不高,基本上可以把FORTH当一种高级的机器语言吧。Bitcoin在实现上做了许多简化和特殊实现,所以只能算是类FORTH的系统。
在FORTH系统中所有的命令(函数)都被称为单词(WORD),所有数据的处理都要压入数据栈上进行,所以FORTH被称为面向栈的语言。
比如 1和2相加,在FORTH系统中则是 1 2 +,数字 1,2 表示将它们压入到数据栈中(在FORTH解释器执行后实际指令会有OP_PUSH),+的操作则是将栈顶和次栈顶的数字取出并相加,并将结果压回数据栈。
Bitcoin的脚本系统的所有的操作指令(单词)见后面的附录,不是所有的操作指令都能被执行支持,因为安全上的考虑有的操作指令被禁止掉了,比如大多数的字符串操作和乘除运算。
在FORTH系统中一般会定义该系统是8位FORTH, 16位FORTH还是32/64位FORTH,这和数据栈的值长有关。在Bitcoin中的脚本系统使用的堆栈是用(vector<vector<unsigned char> >)来模拟的,它在数据栈的每一项都是以字符串的形式存放,它的数值是统一用CBigNum来运算的(读到这里应该明白为啥bitcoin会限制乘除运算了),每一次从数据栈中压入(CBigNum.getvch())或者取出数值(CastToBigNum(stacktop[-1]))都要进行一次转换。看着这样的实现,让我有点发怵,本能的不喜欢,怎么能把高效的FORTH搞成这个样子。Bitcoin的脚本系统与FORTH一样,有两个堆栈,一个数据栈,在Bitcoin中被称为main stack,一个返回栈,在Bitcoin中被称为alt stack(事实上在Bitcoin中将alt stack作为数据栈的中转而还没有作为FORTH意义上的返回栈). Bitcoin的脚本系统没有实现单词定义,流程跳转,循环控制(FOR, WHILE),对IF的实现非常丑陋。事实上我对Bitcoin的脚本实现不是十分认可,堆栈采用变长的数据值,直接将big number 作为opcode,导致每一次opcode执行开销无法控制,由于没有完整实现FORTH的控制指令,导致用trick的方式来实现IF指令,在bitcoin中也因此无法定义新的WORD。总之我很不喜欢bitcoin的这个脚本引擎实现(参见script.cpp)。
下一篇将接着介绍下和交易验证相关的几个操作符:OP_DUP, OP_HASH160, OP_EQUALVERIFY , OP_CHECKSIG 的功能,现在有点倦了。
enum opcodetype
{
// push value
OP_0=0,
OP_FALSE=OP_0,
OP_PUSHDATA1=76,
OP_PUSHDATA2,
OP_PUSHDATA4,
OP_1NEGATE,
OP_RESERVED,
OP_1,
OP_TRUE=OP_1,
OP_2,
OP_3,
OP_4,
OP_5,
OP_6,
OP_7,
OP_8,
OP_9,
OP_10,
OP_11,
OP_12,
OP_13,
OP_14,
OP_15,
OP_16,
// control
OP_NOP,
OP_VER,
OP_IF,
OP_NOTIF,
OP_VERIF,
OP_VERNOTIF,
OP_ELSE,
OP_ENDIF,
OP_VERIFY,
OP_RETURN,
// stack ops
OP_TOALTSTACK,
OP_FROMALTSTACK,
OP_2DROP,
OP_2DUP,
OP_3DUP,
OP_2OVER,
OP_2ROT,
OP_2SWAP,
OP_IFDUP,
OP_DEPTH,
OP_DROP,
OP_DUP,
OP_NIP,
OP_OVER,
OP_PICK,
OP_ROLL,
OP_ROT,
OP_SWAP,
OP_TUCK,
// splice ops
OP_CAT,
OP_SUBSTR,
OP_LEFT,
OP_RIGHT,
OP_SIZE,
// bit logic
OP_INVERT,
OP_AND,
OP_OR,
OP_XOR,
OP_EQUAL,
OP_EQUALVERIFY,
OP_RESERVED1,
OP_RESERVED2,
// numeric
OP_1ADD,
OP_1SUB,
OP_2MUL,
OP_2DIV,
OP_NEGATE,
OP_ABS,
OP_NOT,
OP_0NOTEQUAL,
OP_ADD,
OP_SUB,
OP_MUL,
OP_DIV,
OP_MOD,
OP_LSHIFT,
OP_RSHIFT,
OP_BOOLAND,
OP_BOOLOR,
OP_NUMEQUAL,
OP_NUMEQUALVERIFY,
OP_NUMNOTEQUAL,
OP_LESSTHAN,
OP_GREATERTHAN,
OP_LESSTHANOREQUAL,
OP_GREATERTHANOREQUAL,
OP_MIN,
OP_MAX,
OP_WITHIN,
// crypto
OP_RIPEMD160,
OP_SHA1,
OP_SHA256,
OP_HASH160,
OP_HASH256,
OP_CODESEPARATOR,
OP_CHECKSIG,
OP_CHECKSIGVERIFY,
OP_CHECKMULTISIG,
OP_CHECKMULTISIGVERIFY,
// expansion
OP_NOP1,
OP_NOP2,
OP_NOP3,
OP_NOP4,
OP_NOP5,
OP_NOP6,
OP_NOP7,
OP_NOP8,
OP_NOP9,
OP_NOP10,
// template matching params
OP_PUBKEYHASH = 0xfd,
OP_PUBKEY = 0xfe,
OP_INVALIDOPCODE = 0xff,
};
附录Bitcoin脚本系统单词列表
常量
常量就是用来把数据压入栈中的单词:
单词
虚拟指令(opcode)
输入
输出
Description
OP_0, OP_FALSE |
0 |
Nothing. |
0 |
压入数字0到栈中 |
N/A |
1-75 |
(special) |
data |
将紧随 opcode 的data数据 opcode个字节压入到堆栈。opcode兼作数据长度指示。 |
OP_PUSHDATA1 |
76 |
(special) |
data |
紧随该指令的下一个字节是被压入数据大小,然后是被压入数据 |
OP_PUSHDATA2 |
77 |
(special) |
data |
紧随该指令的两个字节是被压入数据大小,然后是被压入数据. |
OP_PUSHDATA4 |
78 |
(special) |
data |
紧随该指令的4个字节是被压入数据大小,然后是被压入数据. |
OP_1NEGATE |
79 |
无. |
-1 |
压入-1 |
OP_1, OP_TRUE |
81 |
无. |
1 |
压入1. |
OP_2-OP_16 |
82-96 |
无. |
2-16 |
2-16被压入. |
控制流
单词
Opcode
输入
输出
描述
OP_NOP |
97 |
无 |
无 |
空指令. |
OP_IF |
99 |
<expression> if [statements] [else [statements]] endif |
If 判断指令,取出栈顶值,如果栈顶值为1, 则if后面的语句被执行,否则else中的语句被执行。 |
OP_NOTIF |
100 |
<expression> ifnot [statements] [else [statements]] endif |
Ifnot 判断指令,取出栈顶值,如果栈顶值为0, 则if后面的语句被执行,否则else中的语句被执行。 |
OP_ELSE |
103 |
<expression> if [statements] [else [statements]] endif |
放置在 OP_IF 或OP_NOTIF 后的指令,当前面的条件不满足的时候执行 |
OP_ENDIF |
104 |
<expression> if [statements] [else [statements]] endif |
结束 if/else 执行块. |
OP_VERIFY |
105 |
True / false |
Nothing / False |
标记交易单无效 如果栈顶值不为真。当栈顶值为真,移除该栈顶值,否则保留该值。 |
OP_RETURN |
106 |
Nothing |
Nothing |
标记交易单无效. |
堆栈操作
Word
Opcode
Input
Output
Description
OP_TOALTSTACK |
107 |
x1 |
(alt)x1 |
从数据栈中弹出栈顶 数据,压入辅助栈。 |
OP_FROMALTSTACK |
108 |
(alt)x1 |
x1 |
从辅助栈弹出栈顶数据压入到数据栈 |
OP_IFDUP |
115 |
x |
x / x x |
如果栈顶非0则复制栈顶 |
OP_DEPTH |
116 |
Nothing |
<Stack size> |
获取堆栈数据个数 |
OP_DROP |
117 |
x |
Nothing |
丢弃栈顶数据. |
OP_DUP |
118 |
x |
x x |
复制栈顶数据. |
OP_NIP |
119 |
x1 x2 |
x2 |
丢弃次栈顶数据 |
OP_OVER |
120 |
x1 x2 |
x1 x2 x1 |
复制次栈顶数据到栈顶. |
OP_PICK |
121 |
xn … x2 x1 x0 <n> |
xn … x2 x1 x0 xn |
复制第n项数据到栈顶. |
OP_ROLL |
122 |
xn … x2 x1 x0 <n> |
… x2 x1 x0 xn |
将第n项数据移到栈顶. |
OP_ROT |
123 |
x1 x2 x3 |
x2 x3 x1 |
栈顶3项数据向左旋转. |
OP_SWAP |
124 |
x1 x2 |
x2 x1 |
栈顶2项数据交换. |
OP_TUCK |
125 |
x1 x2 |
x2 x1 x2 |
栈顶数据复制并插入到次栈顶数据前 |
OP_2DROP |
109 |
x1 x2 |
Nothing |
同 DROP,只是数据项是2项. |
OP_2DUP |
110 |
x1 x2 |
x1 x2 x1 x2 |
同 DUP,只是数据项是2项. |
OP_3DUP |
111 |
x1 x2 x3 |
x1 x2 x3 x1 x2 x3 |
同 DUP,只是数据项是3项. |
OP_2OVER |
112 |
x1 x2 x3 x4 |
x1 x2 x3 x4 x1 x2 |
同 OVER,只是数据项是2项. |
OP_2ROT |
113 |
x1 x2 x3 x4 x5 x6 |
x3 x4 x5 x6 x1 x2 |
同 ROT,只是数据项是2项. |
OP_2SWAP |
114 |
x1 x2 x3 x4 |
x3 x4 x1 x2 |
同 SWAP,只是数据项是2项. |
字符串处理
字符串处理的大多数指令都被禁止了。
Word
Opcode
Input
Output
Description
OP_CAT |
126 |
x1 x2 |
out |
Concatenates two strings. [禁止] |
OP_SUBSTR |
127 |
in begin size |
out |
Returns a section of a string. [禁止]
|
OP_LEFT |
128 |
in size |
out |
Keeps only characters left of the specified point in a string. [禁止]
|
OP_RIGHT |
129 |
in size |
out |
Keeps only characters right of the specified point in a string. [禁止]
|
OP_SIZE |
130 |
in |
in size |
返回字符串长度 |
位运算
Word
Opcode
Input
Output
Description
OP_INVERT |
131 |
in |
out |
Flips all of the bits in the input. [禁止]
|
OP_AND |
132 |
x1 x2 |
out |
Boolean and between each bit in the inputs. [禁止]
|
OP_OR |
133 |
x1 x2 |
out |
Boolean or between each bit in the inputs. [禁止]
|
OP_XOR |
134 |
x1 x2 |
out |
Boolean exclusive or between each bit in the inputs. [禁止]
|
OP_EQUAL |
135 |
x1 x2 |
True / false |
Returns 1 if the inputs are exactly equal, 0 otherwise. |
OP_EQUALVERIFY |
136 |
x1 x2 |
True / false |
Same as OP_EQUAL, but runs OP_VERIFY afterward. |
数学运算
Word
Opcode
Input
Output
Description
OP_1ADD |
139 |
in |
out |
1 is added to the input. |
OP_1SUB |
140 |
in |
out |
1 is subtracted from the input. |
OP_2MUL |
141 |
in |
out |
The input is multiplied by 2. [禁止]
|
OP_2DIV |
142 |
in |
out |
The input is divided by 2. [禁止]
|
OP_NEGATE |
143 |
in |
out |
The sign of the input is flipped. |
OP_ABS |
144 |
in |
out |
The input is made positive. |
OP_NOT |
145 |
in |
out |
If the input is 0 or 1, it is flipped. Otherwise the output will be 0. |
OP_0NOTEQUAL |
146 |
in |
out |
Returns 1 if the input is 0. 0 otherwise. |
OP_ADD |
147 |
a b |
out |
a is added to b. |
OP_SUB |
148 |
a b |
out |
b is subtracted from a. |
OP_MUL |
149 |
a b |
out |
a is multiplied by b. [禁止]
|
OP_DIV |
150 |
a b |
out |
a is divided by b. [禁止]
|
OP_MOD |
151 |
a b |
out |
Returns the remainder after dividing a by b. [禁止]
|
OP_LSHIFT |
152 |
a b |
out |
Shifts a left b bits, preserving sign. [禁止]
|
OP_RSHIFT |
153 |
a b |
out |
Shifts a right b bits, preserving sign. [禁止]
|
OP_BOOLAND |
154 |
a b |
out |
If both a and b are not 0, the output is 1. Otherwise 0. |
OP_BOOLOR |
155 |
a b |
out |
If a or b is not 0, the output is 1. Otherwise 0. |
OP_NUMEQUAL |
156 |
a b |
out |
Returns 1 if the numbers are equal, 0 otherwise. |
OP_NUMEQUALVERIFY |
157 |
a b |
out |
Same as OP_NUMEQUAL, but runs OP_VERIFY afterward. |
OP_NUMNOTEQUAL |
158 |
a b |
out |
Returns 1 if the numbers are not equal, 0 otherwise. |
OP_LESSTHAN |
159 |
a b |
out |
Returns 1 if a is less than b, 0 otherwise. |
OP_GREATERTHAN |
160 |
a b |
out |
Returns 1 if a is greater than b, 0 otherwise. |
OP_LESSTHANOREQUAL |
161 |
a b |
out |
Returns 1 if a is less than or equal to b, 0 otherwise. |
OP_GREATERTHANOREQUAL |
162 |
a b |
out |
Returns 1 if a is greater than or equal to b, 0 otherwise. |
OP_MIN |
163 |
a b |
out |
Returns the smaller of a and b. |
OP_MAX |
164 |
a b |
out |
Returns the larger of a and b. |
OP_WITHIN |
165 |
x min max |
out |
Returns 1 if x is within the specified range (left-inclusive), 0 otherwise. |
加密相关
Word
Opcode
Input
Output
Description
OP_RIPEMD160 |
166 |
in |
hash |
The input is hashed using RIPEMD-160. |
OP_SHA1 |
167 |
in |
hash |
The input is hashed using SHA-1. |
OP_SHA256 |
168 |
in |
hash |
The input is hashed using SHA-256. |
OP_HASH160 |
169 |
in |
hash |
The input is hashed twice: first with SHA-256 and then with RIPEMD-160. |
OP_HASH256 |
170 |
in |
hash |
The input is hashed two times with SHA-256. |
OP_CODESEPARATOR |
171 |
Nothing |
Nothing |
All of the signature checking words will only match signatures to the data after the most recently-executed OP_CODESEPARATOR. |
OP_CHECKSIG |
172 |
sig pubkey |
True / false |
The entire transaction’s outputs, inputs, and script (from the most recently-executed OP_CODESEPARATOR to the end) are hashed. The signature used by OP_CHECKSIG must be a valid signature for this hash and public key. If it is, 1 is returned, 0 otherwise. |
OP_CHECKSIGVERIFY |
173 |
sig pubkey |
True / false |
Same as OP_CHECKSIG, but OP_VERIFY is executed afterward. |
OP_CHECKMULTISIG |
174 |
sig1 sig2 … <number of signatures> pub1 pub2 <number of public keys> |
True / False |
For each signature and public key pair, OP_CHECKSIG is executed. If more public keys than signatures are listed, some key/sig pairs can fail. All signatures need to match a public key. If all signatures are valid, 1 is returned, 0 otherwise. |
OP_CHECKMULTISIGVERIFY |
175 |
sig1 sig2 … <number of signatures> pub1 pub2 … <number of public keys> |
True / False |
Same as OP_CHECKMULTISIG, but OP_VERIFY is executed afterward. |
伪词(Pseudo-words)
下列词汇用于在内部使用,在脚本系统中实际上不存在的词。
Word
Opcode
Description
OP_PUBKEYHASH |
253 |
表示OP_HASH160 后的公开密钥散列 |
OP_PUBKEY |
254 |
表示一个公开密钥(可以被 OP_CHECKSIG). |
OP_INVALIDOPCODE |
255 |
|
保留词(Reserved words)
没有被定义的opcode被保留以后使用,如果在脚本中使用这些保留词,要么被忽略,要么使得交易无效。
Word
Opcode
When used…
OP_RESERVED |
80 |
Transaction is invalid |
OP_VER |
98 |
Transaction is invalid |
OP_VERIF |
101 |
Transaction is invalid |
OP_VERNOTIF |
102 |
Transaction is invalid |
OP_RESERVED1 |
137 |
Transaction is invalid |
OP_RESERVED2 |
138 |
Transaction is invalid |
OP_NOP1-OP_NOP10 |
176-185 |
The word is ignored.
|
分享到:
相关推荐
这种架构常用于文件分享、流媒体服务和虚拟货币交易等领域,如BitTorrent和Bitcoin。P2P网络的特性包括:负载均衡、容错性强、扩展性好。 3. **网站流量的P2P应用**:将P2P技术应用于网站流量,可以减少服务器负担...
外显子地位:项目信息:社区:Exonum是一个可扩展的开源框架,用于创建区块链应用程序。Exonum 可用于在几乎任何问题领域(包括金融科技、政府科技和法律科技)创建加密驱动的分布式账本。Exonum 框架面向创建许可...
该平台将充当有关加密货币开源项目的信息的金矿,共享知识,思想,教程和技巧。硬币:斜线代号:SLASH方块奖励:10点速成工作量证明算法:x11封锁时间:90秒最大硬币供应量:2100万PoS从区块开始:1 000矿井前:3%...
内容概要:本文详细探讨了利用NSGA2算法进行电力系统中储能系统的选址和定容优化,并结合熵权TOPSIS方法选择最优解。首先介绍了使用Matpower工具包进行潮流计算的基础步骤,随后深入讨论了储能系统引入后的复杂性和优化目标设定。文中展示了如何构建目标函数,包括储能的投资成本和系统电压偏差,并详细解释了NSGA2算法的具体实现,如种群初始化、交叉变异操作以及约束条件处理。最后,通过熵权法确定权重并应用TOPSIS方法对多个优化结果进行评估,选出综合性能最佳的储能配置方案。 适合人群:从事电力系统规划、优化算法研究的专业人士,尤其是对储能系统优化感兴趣的科研人员和技术开发者。 使用场景及目标:适用于需要解决电力系统中储能系统选址和定容问题的实际工程项目。主要目标是在满足系统稳定性要求的前提下,最小化储能系统的投资成本,提高系统的经济性和可靠性。 其他说明:文章提供了详细的代码片段和理论推导,帮助读者更好地理解和实施所提出的优化方法。此外,还提到了一些实际应用中的注意事项,如SOC约束处理、参数选择等,为后续的研究和应用提供了宝贵的实践经验。
基于python+pyqt5实现视频自动化下载、剪辑和上传系统源码+项目说明.zip 该项目是用脚本实现部分视频网站视频内容的自动化下载、剪辑以及上传,其中界面是用PyQT做的。 使用的浏览器驱动是undetected_chromedriver,可以跳过tiktok的机器人检查 使用的浏览器是91,版本:Google_Chrome_(64bit)_v91.0.4472.77 【功能】 自动从各种视频网站下载视频 支持视频剪辑和合集制作 支持自动上传视频到视频网站 技术栈 Python PyQT undetected_chromedriver
内容概要:本文详细介绍了西门子S7-1200双套三坐标6轴联动控制系统的开发与调试经验。主要内容涵盖双PLC通信机制、轴控制逻辑、安全联锁设计以及触摸屏程序绑定等方面。文中通过具体代码示例展示了如何利用SCL语言实现高效稳定的多轴联动控制,并分享了实际项目中的最佳实践和技术难点解决方案。此外,还讨论了程序结构优化、报警代码设计、数据块管理等关键环节,强调了模块化设计思想的应用及其带来的效率提升。 适合人群:从事工业自动化领域的工程师,尤其是熟悉西门子PLC编程的专业人士。 使用场景及目标:适用于需要进行复杂运动控制的自动化生产线,如汽车制造、电子装配等行业。主要目标是提高生产效率,确保设备运行的安全性和稳定性。 其他说明:文中提到的许多技术和方法不仅限于特定型号的PLC,对于其他品牌的控制器也有一定的借鉴意义。同时,提供的代码片段可以直接应用于类似项目中,帮助开发者快速搭建可靠的控制系统。
NFC Tools是一个应用程序,允许你在你的 NFC 标签和其他 RFID 兼容芯片上读取或写入或编程代码任务。NFC Tools PRO版本包括很多其他的附加功能,比如配置文件管理等。保存你的NFC标签或任务的配置文件,以便你以后重新使用它们。导出和导入很容易。NFC Tools PRO官方版允许你直接从现有的 NFC 标签导入你的记录或任务。 你可以很快编辑你的标签。此外还可以直接运行你的任务配置文件,不需要NFC 标签。
该资源为protobuf-6.30.1-py3-none-any.whl,欢迎下载使用哦!
内容概要:本文详细介绍了如何在FLAC3D中提取壳单元和衬砌单元的关键内力数据,如弯矩、轴力和剪力。针对壳单元,文中提供了具体的FISH命令和函数,展示了如何利用gp.extra属性提取弯矩,并强调了局部坐标系方向的重要性。对于衬砌单元,则介绍了专门的命令和注意事项,如使用liner组件提取轴力和剪力,以及如何处理弯矩数据。此外,还分享了一些实用的经验和技巧,如批量数据处理、单位换算、内力符号规则等。最后,提到了使用Python进行后处理的方法,将提取的数据转化为更直观的形式,便于进一步分析。 适合人群:从事岩土工程、隧道工程及相关领域的工程师和技术人员,尤其是对FLAC3D有一定基础的用户。 使用场景及目标:帮助用户掌握FLAC3D中壳单元和衬砌单元内力提取的具体方法,提高工作效率,确保数据分析的准确性。适用于需要进行结构内力分析、支护设计优化等项目的工程师。 其他说明:文章不仅提供了详细的命令和函数示例,还分享了许多实战经验和常见错误的规避方法,有助于初学者少走弯路。同时,强调了内力符号规则和单位换算的重要性,避免因疏忽导致的重大失误。
内容概要:本文详细介绍了ST公司发布的HL07:ST PMSM FOC电机控制资料包2.0的内容及其应用。资料包涵盖了ST芯片电机控制的全源代码、详细文档、多个工程源码、stm32库培训资料及例程源码。文中通过具体的代码示例,如GPIO初始化、PWM配置、ADC采样、Clarke变换、PID调节器、SVPWM生成等,深入剖析了电机控制的关键技术和优化技巧。此外,还揭示了一些隐藏的技术细节和调试技巧,如硬件同步、动态调整PID参数、电机参数自识别等。 适合人群:电机控制工程师、嵌入式开发人员、尤其是对STM32和FOC算法感兴趣的开发者。 使用场景及目标:帮助读者深入了解ST芯片电机控制的具体实现,掌握从硬件配置到算法优化的全过程,提高实际项目的开发效率和质量。适用于需要进行电机控制系统设计、调试和优化的工程项目。 其他说明:资料包中的代码和文档非常实用,提供了丰富的实战经验和优化建议,尤其适合初学者和有一定基础的研发人员。同时,文中提到的一些特殊技巧和注意事项有助于避免常见的开发陷阱,提升系统的稳定性和性能。
内容概要:文章探讨了2025年AI技术发展趋势及潜在的GPT级技术突破。首先回顾了GPT系列模型的发展历程及其对自然语言处理领域的深远影响。接着,通过介绍Geoffrey Hinton、李飞飞和张晨等AI领袖的观点,阐述了AI技术在实际应用场景中的挑战与机遇。文中详细描述了AI大模型的演进,包括多模态技术的发展、轻量化趋势以及可控性和可解释性的提升。此外,还介绍了AI计算力的革命性升级,如量子计算、云计算+AI和边缘AI的发展。最后,文章分析了AI在医疗、金融、教育、自动驾驶等行业的落地应用,并指出了面临的挑战与机遇,展望了未来的技术和社会影响。 适合人群:对AI技术感兴趣的从业者、研究人员、企业家及政策制定者。 使用场景及目标:①了解AI技术的最新进展和未来趋势;②探索AI技术在各行业的应用前景;③评估AI技术带来的挑战与机遇,为相关决策提供参考。 阅读建议:本文内容涵盖广泛,既有技术细节又有宏观展望,建议读者结合自身背景选择感兴趣的部分深入阅读,重点关注与自身行业或研究方向相关的章节。
内容概要:本文详细探讨了基于樽海鞘算法(SSA)优化的极限学习机(ELM)在回归预测任务中的应用,并与传统的BP神经网络、广义回归神经网络(GRNN)以及未优化的ELM进行了性能对比。首先介绍了ELM的基本原理,即通过随机生成输入层与隐藏层之间的连接权重及阈值,仅需计算输出权重即可快速完成训练。接着阐述了SSA的工作机制,利用樽海鞘群体觅食行为优化ELM的输入权重和隐藏层阈值,从而提高模型性能。随后分别给出了BP、GRNN、ELM和SSA-ELM的具体实现代码,并通过波士顿房价数据集和其他工业数据集验证了各模型的表现。结果显示,SSA-ELM在预测精度方面显著优于其他三种方法,尽管其训练时间较长,但在实际应用中仍具有明显优势。 适合人群:对机器学习尤其是回归预测感兴趣的科研人员和技术开发者,特别是那些希望深入了解ELM及其优化方法的人。 使用场景及目标:适用于需要高效、高精度回归预测的应用场景,如金融建模、工业数据分析等。主要目标是提供一种更为有效的回归预测解决方案,尤其是在处理大规模数据集时能够保持较高的预测精度。 其他说明:文中提供了详细的代码示例和性能对比图表,帮助读者更好地理解和复现实验结果。同时提醒使用者注意SSA参数的选择对模型性能的影响,建议进行参数敏感性分析以获得最佳效果。
内容概要:本文详细介绍了汇川PLC与基恩士PLC通过Ethernet/IP (EIP) 协议实现联机的方法及其应用场景。首先,文章解释了硬件配置,包括基恩士KV-7300 CPU搭配KV-EP21v以太网通信模块以及汇川AM-400系列PLC的网口连接。接下来,分别阐述了基恩士和汇川PLC的程序框架,涵盖初始化EIP通讯模块、设置IP地址、建立连接、数据映射及心跳检测机制等关键技术点。此外,文中提供了具体的代码示例和调试建议,如使用Wireshark抓包工具排查问题,并强调了数据同步、字节序转换、超时处理等方面需要注意的地方。最后,分享了一些实践经验,例如确保正确的IP地址分配、合理的缓冲区大小规划、良好的接地措施等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程有一定基础并希望深入了解不同品牌PLC间通讯机制的专业人士。 使用场景及目标:适用于需要将不同品牌PLC集成到同一个控制系统中的工业项目,旨在提高系统的灵活性和互操作性。通过掌握本文介绍的技术要点,可以有效减少因PLC品牌差异带来的兼容性和稳定性问题。 其他说明:文中不仅提供了理论指导,还结合实际案例进行了深入浅出的讲解,帮助读者更好地理解和应用相关技术。同时,针对可能出现的问题给出了预防和解决方案,使读者能够在实践中少走弯路。
内容概要:本文详细记录了作者将VESC项目的非线性磁链观测器移植到STM32F4开发板的过程。首先介绍了FOC技术和VESC源码的重要性和特点,然后重点阐述了非线性磁链观测器的实现方法及其核心代码。接着讨论了移植过程中遇到的技术难题,如实时性、稳定性、中断处理、电流采样等问题,并分享了解决这些问题的具体措施。最后展示了测试结果,证明了移植的成功以及观测器的良好性能。 适合人群:具有一定嵌入式开发经验的研发人员,特别是从事电机控制领域的工程师和技术爱好者。 使用场景及目标:适用于希望深入理解VESC源码和非线性磁链观测器的工作机制,掌握STM32F4平台上FOC算法实现的人群。目标是在实际项目中应用这些技术,提高电机控制系统的性能。 其他说明:文中提供了大量实用的代码片段和调试技巧,帮助读者更好地理解和解决问题。此外,作者还分享了一些个人经验和心得,增加了文章的趣味性和实用性。
移远EC20 Windows驱动 操作系统 - 桌面系统 - 移远EC20 Windows驱动
检证资料jianzhen.ppt
内容概要:本文档《ATK-DLRK3568嵌入式Qt开发实战V1.2》是正点原子出品的一份面向初学者的嵌入式Qt开发指南,主要内容涵盖嵌入式Linux环境下Qt的安装配置、C++基础、Qt基础、多线程编程、网络编程、多媒体开发、数据库操作以及项目实战案例。文档从最简单的“Hello World”程序开始,逐步引导读者熟悉Qt开发环境的搭建、常用控件的使用、信号与槽机制、UI设计、数据处理等关键技术点。此外,文档还提供了详细的项目实战案例,如车牌识别系统的开发,帮助读者将理论知识应用于实际项目中。 适合人群:具备一定Linux和C++基础,希望快速入门嵌入式Qt开发的初学者或有一定开发经验的研发人员。 使用场景及目标: 1. **环境搭建**:学习如何在Ubuntu环境下搭建Qt开发环境,包括安装必要的工具和库。 2. **基础知识**:掌握C++面向对象编程、Qt基础控件的使用、信号与槽机制等核心概念。 3. **高级功能**:理解多线程编程、网络通信、多媒体处理、数据库操作等高级功能的实现方法。 4. **项目实战**:通过具体的项目案例(如车牌识别系统),巩固
1、文件说明: Centos8操作系统tcl-tclxml-devel-3.2-26.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf tcl-tclxml-devel-3.2-26.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm
C盘清理bat脚本自动清理C盘垃圾文件
桶排