转载: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%...
【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
毕设工坊:专注于计算机毕业设计项目的交流与资源共享平台,涵盖各类技术文档、代码示例及实战经验分享,助力学子顺利完成学业挑战。
【window 可视化nvm管理node版本 nvm-desktop】
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
# 基于microbit编程语言的mymicrobit扩展插件项目 ## 项目简介 这是一个基于microbit编程语言的mymicrobit扩展插件项目。该项目旨在提供额外的功能和特性,以扩展microbit编程环境。通过此插件,用户可以轻松地在MakeCode环境中进行编程,实现对micro:bit设备的更多控制和功能实现。 ## 项目的主要特性和功能 1. 扩展性提供了丰富的积木块和代码库,允许用户轻松实现复杂的编程逻辑和功能扩展。 2. 图形化编程支持通过积木块形式的图形化编程,降低编程门槛,方便初学者快速上手。 3. 实时预览提供了积木块的实时预览功能,方便用户直观地了解代码块的逻辑和功能。 4. 与MakeCode无缝集成可以直接在MakeCode环境中导入和使用,无需额外的配置和安装。 ## 安装使用步骤
【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
项目资源包含:可运行源码+sql文件 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 项目具有较高的学习借鉴价值,也可拿来修改、二次开发。 有任何使用上的问题,欢迎随时与博主沟通,博主看到后会第一时间及时解答。 开发语言:Python 框架:django Python版本:python3.8 数据库:mysql 5.7 数据库工具:Navicat 开发软件:PyCharm 浏览器:谷歌浏览器
第三章-局域网-思维导图
内容概要:PT300机械故障综合模拟实验台由瓦仑尼安教学设备有限公司生产,旨在帮助用户深入了解振动特征知识及复杂转子振动频谱分析,实现精密振动分析和精准故障诊断。该实验台能模拟轴承故障、不平衡、不对中、设备松动、转子摩擦等多种机械故障现象,可进行不同转速下的轴承故障频率识别、转子静动平衡模拟试验、设备启停机测试等实验。设备采用高效节能ABB三相交流电动机,配备高精度转速控制和测量模块,确保运行稳定。此外,实验台还设有透明防震安全罩和互锁开关,保障实验安全。; 适合人群:高校师生、科研人员等需要学习或研究机械故障诊断相关理论知识和实践技能的人群。; 使用场景及目标:①用于高校等教育机构的教学,辅助学生理解机械故障诊断的理论知识和实践技能;②满足科研人员进行机械故障诊断算法验证、故障特征分析等科研需求。; 其他说明:PT300机械故障综合模拟实验台的每个部件均经过高精度加工,确保在不同振动状态下稳定运行。用户可根据期望分析特定部件的故障特征。设备尺寸为735mm(长)×310mm(宽)×350mm(高),保修一年,且提供免费操作指导服务。
【项目资源】: 适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
内容概要:本文详细介绍了使用COMSOL Multiphysics的弱形式接口对三维光子晶体进行数值模拟的方法和技巧。文章通过具体的代码示例,解释了如何构建光子晶体的介电常数分布、设置弱形式PDE、处理电磁场切向连续性、应用Floquet周期边界条件以及特征值求解等关键步骤。特别强调了弱形式接口相比传统物理场接口的优势,如灵活性和对复杂边界的处理能力。文中还分享了一些实用的经验和注意事项,如布洛赫边界条件的实现、特征值求解器参数的优化配置以及网格划分的技巧。 适合人群:具备一定电磁学和数值模拟基础的研究人员或工程师,尤其是对光子晶体仿真感兴趣的读者。 使用场景及目标:①理解并掌握COMSOL弱形式接口在光子晶体仿真中的应用;②学习如何通过弱形式设置处理复杂的电磁场问题;③提高对光子晶体能带结构和带隙特性的认识;④掌握特征值求解和网格划分的最佳实践。 阅读建议:由于本文涉及较多的具体代码和物理概念,建议读者在阅读过程中结合COMSOL软件进行实际操作,同时查阅相关电磁理论书籍以加深理解。此外,对于文中提到的一些具体参数设置和技巧,可以通过尝试不同的配置来巩固所学知识。
# 基于Arduino平台的INSPTComputacion2项目 ## 项目简介 INSPTComputacion2是一个基于Arduino平台的开发项目。该项目旨在通过Arduino的硬件和软件能力,实现一系列计算和交互功能。通过此项目,用户可以体验到Arduino在嵌入式系统、物联网和微控制器等领域的强大功能。 ## 项目的主要特性和功能 该项目的主要特性和功能包括但不限于以下几点 1. 嵌入式系统开发利用Arduino的硬件资源,开发嵌入式系统应用。 2. 物联网应用实现Arduino与物联网技术的结合,进行数据采集、传输和控制。 3. 交互设计通过Arduino实现人机交互,如按钮控制、LED显示等。 4. 数据处理利用Arduino进行数据处理和分析,如温度、湿度等环境数据的采集和处理。 ## 安装使用步骤 以下是在已下载本项目源码文件后的安装使用步骤 1. 确保已安装Arduino IDE软件。
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
Python数据结构-学习笔记
该系统展示了一个电影在线购票系统的结构图,系统分为前台和后台两部分。前台包括首页、影院信息、电影信息、电影资讯和个人中心等模块,主要面向普通用户,提供电影浏览、选座购票、个人账户管理等功能。后台部分由管理员通过后台模块进行操作,包括系统首页、用户管理、场次管理、时间段管理、影院信息管理、电影分类管理、电影信息管理、订单管理和个人中心等模块,用于系统的维护和管理,如用户信息维护、电影和影院信息更新、订单处理等。整个系统旨在为用户提供便捷的在线购票体验,同时确保后台管理的高效和有序。