以太坊(3)——智能合约

智能合约

首先明确一下几个说法(说法不严谨,为了介绍清晰才说的):

  1. 全节点==矿工

  2. 节点==账户

智能合约是基于Solidity语言编写的

59b8e8e139cc419398263cc0356ad673.png

学习Solidity语言可以到WFT学院官网(Hello from WTF Academy | WTF Academy),有初级和进阶课程

智能合约的结构

下面的函数的问题,在文章最后讨论

e2c62e87a61345b8a0e1ed5cb3436c09.png

上述是一个简单的智能合约的结构:

  1. 一个合约可以看作是一个类

  2. log通过emit触发事件在链上记录下来

  3. 构造函数是每个合约有且只有一个的,可以为空,只能在创建时调用一次

  4. 成员函数是部署合约后可以调用的,一般有关键字,modifier等限制权限

  5. 智能合约里的mapping不能遍历,只能存储它的地址集合,按照地址去查询

合约的调用

外部账户的调用

82d3a18bdaac4c9ab7add3032c1d7214.png

  1. 首先,要填写外部账户的地址,合约账户的地址

  2. 之后,需要填写函数接收的参数(之后细说)

  3. 一般部署和调用合约的编译器是Remix

一个合约中调用另一个合约的函数

直接调用

65aff94319cc4fccb0748568b9dd9547.png

  1. 合约B调用合约A的内容,A a = A(addr),addr指的是A的地址,该语句将这个地址转换成A合约的实例a,之后调用a里面的函数foo,使用ua接收返回值。

  2. 由于以太坊规定一个交易只能由外部账户调用,合约账户不能发起交易。因此只能当某个外部账户调用合约B的时候,才能触发B中的那个语句,进而调用A

  3. 这种调用方式下,如果A在运行过程中发生什么异常,会导致B合约的内容也连带回滚

call函数调用

b499e12b7be64b3ba655fb4492676d90.png

这种方式的调用,如果调用的合约(addr的实例)出现错误,C合约不会回滚,只会引起调用部分返回异常值,其余部分正常

代理调用

a23adff4497f4695ba90de59b3067141.png

这种调用不需要切换到被调用的合约环境中去执行,在当前合约的环境中执行(使用当前合约的属性等)

  1.  

fallback函数

注意,只有向合约账户转账时才有fallback函数的生成!!!

32aca3008d1341059af1ff1d50dfee8b.png

如果不需要调用函数或者调用函数错误时,Solidity编译器自动生成fallback函数,里面的payable函数也是自动添加的

注意:gas费是给记录你这笔交易矿工的(类似于BTC里面的交易手续费),不是给合约账户的!

合约节点会在以下情况下调用fallback函数:

  1. 未知函数调用: 当合约接收到一个未知的函数调用时,即调用合约中不存在的函数时,会触发fallback函数的执行。

  2. 以太币转账: 当以太币被直接发送到合约地址(即没有附带调用数据),这时会触发fallback函数的执行。

  3. 低级调用: 如果合约内部使用了calldelegatecall调用其他合约,并且调用的合约不存在对应的函数时,也会调用fallback函数。

错误处理

智能合约的调用具有原子性,即一个合约部分出错,整体回滚(这个和前面讲的addr调用不冲突,addr调用是使用一个判断语句将这个调用变成了一个返回值)

  1. gaslimit被耗完依旧不能实现,调用被回滚,而且gas费不退还

  2. assert()语句检查内部错误(类似于C语言)

  3. require()语句检查外部错误(比如msg.senter!=addr)

  4. revert()语句自动弹出错误(可用于if条件等)

注意:Solidity里面没有自定义报错类型try-catch

嵌套调用

一个合约调用另一个合约

如果向某个合约账户转账,虽然表面上你没有调用,但是编译器自动帮你生成了fallback函数,还是调用了!

智能合约的创建和运行

创建

  1. 外部账户发起转账到0x0地址中,转账金额为0

  2. 合约代码(编译成bytecode)放在data域中

  3. 支付给矿工gas,矿工将合约发布到区块链上,返回合约的地址(也就是智能合约的地址)

  4. 此时,智能合约就可以被所有人调用了

运行

智能合约运行在以太坊虚拟机EVM(Ethereum Virtual Machine)上

EVM是一个256位的WWC(Worldwide Computer),使用EVM提高了智能合约的可移植性

汽油费(gas)

原因

图灵完备的语言,需要避免死循环导致的停机

数据结构

调用合约的人支付,相当于是把停机问题推给了调用方

be3eecdb2d8e4fc6b6cfeb8d2127dd6c.png

GasLimit就是调用方此次调用这个合约能接受的最大汽油量,可以在Remix部署时填写

GasLimit * Price 计算出的是花掉的最大汽油费

Payload就是data域

gas的价格是由调用者选择的,价格高的更容易被矿工写入区块。

  1. 往往代码功能简单的汽油费低,代码复杂的汽油费高。

  2. 存储状态变量汽油费高,仅读取状态变量免费

调用过程

  1. 当一个全节点收到一个调用的时候,它首先计算出调用花费的最大汽油费

  2. 将这笔最大汽油费从发起账户中扣掉。

  3. 然后根据实际执行的情况算出实际花费的汽油费,剩下的退回去,不够的话合约回滚gas耗完不退

数据结构

区块头

GasLimit

实际消耗gas的上限!

BTC每个区块最大不能超过1M,主要是带宽因素

  1. 由于ETH矿工的gas费收益是很可观的,防止他为了多收钱把巨量的的交易包含进去,影响传输速率,也要进行限制,

  2. 但是因为智能合约Solidity的结构复杂(循环和调用),往往大小不能完全反映复杂程度,因此就使用最大gas费的方式限制

GasUsed

实际消耗的汽油费

每个区块发布的时候,矿工可以对gaslimit进行微调,上下不超过1/1024

三树

合约调用的时间应该在发布区块前还是发布区块后?

先执行,后挖矿。原因是执行完合约之后,“三树”的信息会改变,而区块头包含的是三树的根哈希值。只有得到根哈希值之后才可以组合数据,尝试nonce值!

本质上,汽油费是为了补偿矿工执行合约消耗的资源。但是对于没有挖到区块的矿工,他们的验证没有补偿的,这会不会导致那些矿工不去验证发布的区块,就默认发布的是对的。如果这样的话就会严重影响区块链的安全性!

节点不验证了怎么办?

如果它不执行不验证,就无法更新三树,之后它组装区块的时候算出的根哈希值是错的,挖出区块的nonce值被其他区块验证为不合法!环环相扣了属于是。

我还是不验证,直接抄!

这种做法类似于矿池的做法,一个全节点进行验证,其他矿工只负责计算哈希值。

但是如果你不是这个矿池的成员,你敢不敢相信它发布的三树根哈希是正确的呢?要知道挖矿的3Ether收益可是远远大于gas费的,矿工不愿意冒着辛辛苦苦挖出区块作废的奉劝去节省验证的花销。

执行错误的交易要不要发布?

要,这样依旧可以扣除他的汽油费,获得你的收益

智能合约是否支持多线程(多核并行处理)?

不支持,因为Solidity语言中不具有支持多线程的语句。原因是多核对于内存访问顺序不同的时候,会导致最终的结果不同,而以太坊需要的是状态机进入统一的确定的状态(Papers (zhenxiao.com)可以参考肖老师的论文

 

Receipt

d6994ffb7b3043429f67d40e0997db54.png

每个交易执行完形成一个收据(receipt),Status这个变量代表的是交易的状态

地址类型

b7fdd04dd9f04a2c8f3840acc3e61b96.png

 

address.balance: address的余额

address.transfer(金额):当前合约向address转入的金额

address.call:当前合约调用address

转账的方法

<address>.transfer(uint256 amount)//会导致连锁型回滚  gas少
<address>.send(uint256 amount)//返回false 不会会滚 gas少
<address>.call.value(uint256 amount)//本意不是专门为转账设计的 不会会滚  发送剩余的所有gas

 

智能合约的信息获取

通过智能合约可以得到区块链的信息

 

智能合约可以获取的调用信息

1f8ff0eeab914e0b88e6be5cd981836b.png

msg.sender和tx.origin的区别

3f4323d230ea42acba2d9afb33316945.png

上图中A账户调用C1合约中的f1函数,f1函数调用C2合约中的f2函数

则对于f2函数而言,msg.sender指的是C1,而tx.origin指的是A账户

智能合约的设计

不可篡改!

智能合约是不可篡改的,在发布之前一定要反复测试。

一旦发布就不可撤销,无法更改。可能会导致资金的永久锁死或者被黑客利用漏洞进行攻击!

测试的网址比如本地的truffle,ganache,测试网等等,确认完全没有问题再进行发布

后门?

不存在的,因为这与去中心化背道而驰

拍卖函数的修正

第一版问题

d8e37b313d294fa1aed59feb3fb2e64e.png

右侧最高出价的for循环有问题,都拿不到钱!

第二版

f3324640f9934ff8b0c406d6117cde5a.png

拆成两个函数,第一个允许竞拍的失败者取回自己的钱(只能取一次),第二个是将最高出价给卖家

BUG

eec0bf3c93ef4c6da1f4cac39f977a43.png

注意黑客合约的fallback函数(右侧最下面),当合约通过call函数调用时,调用fallback函数(忘记的话可以回顾一下上面的fallback函数部分)。因此,主合约的withdraw进入if语句的判断时,就会调用fallback函数给黑客转账,而fallback函数再次调用withdraw函数,形成循环(根本无法执行48行的清零语句)...

循环截至的条件:

  1. 合约存储的钱不足以支付下次转账

  2. 调用栈溢出

  3. gas费不足

这也是黑客的fallback函数里面if语句判断的条件!

第三版

4795ba5d915946c4a66cc6149880ecc1.png

先清零再转账,这遵循了和其他合约发生交互的编程模式: 先判断条件,再改变条件,最后交互!

第二版纠正

另一种方法就是不用call!

efa10973a6fa4310b902b797063e94b4.png

使用send和transfer都可以,因为发送出的汽油费只有2300个单位,不足以支撑再一次的调用,只够写一个log

The DAO

造成以太坊分裂的一次攻击

DAO:Decentralized Autonomous Organization 去中心化机构

致力于去中心化投资的公司——The DAO

运行原理

这个公司本质上是ETH上的一个智能合约,你想要投资就要把你的以太币发给这个合约,换取合约的D代币(简称)。要投资什么项目由大家投票决定,投票的权重按照所拥有的D代币分配,收益也是按照规定按比例分配。

取款

取款的方式使用split DAO。当取钱时,收回相应的代币,将对应的以太币打到子基金Chile DAO之中(这种做法也是给部分人投资小众项目拆分子基金用的,极端例子就是单个投资者成立子基金,也就是取钱)

拆分之前有7天的讨论期,用于商讨要不要拆出子基金以及要不要加入这个子基金

拆分后有28天的锁定期,子基金里的钱要28天以后才能取出来

历史事件

2016年开始众筹,引起很大关注,在一个月时间筹集到价值1.5亿美元的Ether(当时价格)

f7da2d4c963b4ebd9621155b84eb2130.png

这就违反了之前提到的先判断条件,再改变条件,最后交互!的编程原则,导致了黑客盗走价值5kw美元的资金

之后,社区发生意见的分歧,一方认为要回滚,利用28天的锁定期来防止黑客取走资金。另一方认为,合约的漏洞只是它自己的漏洞,不能因为一个合约的问题就违背以太坊的不可篡改性。

社区的开发者认为The DAO是too big to fail,垮掉会对以太坊造成毁灭性打击(以太币价格跳水),因此采取了回滚措施进行补救。

如何补救?

首先,以太坊开发团队想到的是一个软分叉方案:

锁定黑客账户:进行一次软件升级但凡与TheDAO相关的账户,不能进行任何交易(老认新,软分叉)。

问题是,当时规定,这些”非法“的账户发布交易,不能上链也不收取gas,因此引起了很多这种账户发布死循环攻击来骚扰矿工,矿工不堪重负,纷纷回滚这次软件的升级

由于软方案失败,所剩时间不多,团队只能采取硬分叉方案:

将所有的资金(要是只转黑客的,其他的相关帐户都可以利用这个BUG实现攻击)转入一个账户B,该账户的唯一作用就是——退钱!在第192W个区块强制将所有相关账户的钱转给账户B(新认老,固执节点不认可你没有人家账户签名就转账的操作)

分歧

很多节点认为,这种操作违背了去中心化的理念(以太坊团队说转走谁的钱就转走)因此以太坊团队发布两个合约进行投票,支持哪一种方案就把以太币投进那个合约。最后大多节点(按掌握资金数量分)选择硬分叉。

但是,另一方不认可这样的做法:

  1. 并非所有资金都参与投票了

  2. 大多数人支持的就一定对吗?

这些矿工挖出的旧链以太币被称为ETC

ETC

ETC(classic),指的是在旧链上挖矿产出的以太币,由于挖矿算力大幅削减,不乏投机者选择在这条链上进行挖矿,但是也有一部分矿工坚持挖矿是源自去中心化的信仰!尽管开始的前景并不被人看好,但是这条链依旧坚持至今。

3a91ce751a264ee9a9dca170d787e74b.png

2015年7月 Vitalik Buterin和以太坊基金会创建了第一个基于区块链的图灵完成智能合约平台。

2016年4月~6月 以太坊The DAO项目ICO以遭到黑客攻击告终

2016年7月20日 以太坊硬分叉实施,产生了ETH和ETC两条独立的区块链,ETC正式诞生

2016年8月 91,pool上线

2016年9月23日,微软加入对于ETC的支持

2016年10月17日,ETC第一个ICO项目ETCWIN

2016年10月,ETCFans上线

2016年12月24日,全球第一个以太坊原链社区交易所ETCWin上线

2017年4月27日,ETF基金会确定限产

2017年6月底,ETC发起支持零知识证明改进建议。

......

为了更好的管理这两条链,产生了新的数据标记——ChainID

Beauty Chain(美链)

背景介绍

美链(Beauty Chain)是一个部署在以太坊上的智能合约,有自己的代币BEC。

  1. ICO:Initial Coin Offering没有自己的区块链,代币的发行、转账都是通过调用智能合约中的函数来完成的

  2. 可以自己定义发行规则,每个账户有多少代币也是保存在智能合约的状态变量里

  3. ERC 20(Ethereum Request for Comments)是以太坊上发行代币的一个标准,规范了所有发行代币的合约应该实现的功能和遵循的接口

  4. 美链中有一个叫batchTransfer的函数,它的功能是向多个接收者发送代币,然后把这些代币从调用者的帐户上扣除

很多代币上线之前是依附在以太坊上的。

实现

650281b8b7134979b8eb8a65d58df961.png

接收者的数目最多20个

问题

uint amount = uint256(cnt) * _value

乘出的结果可能过大,出现溢出,即扣除的代币数字很小。也就是调用者转出的代币少,接收者依旧收到海量代币。也就是系统发行代币量凭空增多。

攻击细节

2fb6e1162197412fbca9efb0eed83969.png

202c50dc0fad4beaa0b7e40fcf969be7.png

每个黑客区块收到了很大一部分代币

反思

Is smart contract real smart?

智能合约,实际上只是一种改不了Bug的合同

不可篡改性是一个双刃剑

一方面增加了合约的公信力,

但另一方面发布后的软件很难进行修改。发现了安全漏洞,很难发布软分叉进行补救,或者阻止调用;哪怕发现了黑客,也很难冻结其账户

如果你是theDAO的用户,怎么补救?

使用重入攻击转走剩余的资金,之后再分给大家

Nothing is irrevocable

不要过度迷信区块链的不可篡改性,代码是死的,人是活的

比如美国宪法还有修正案,以及被推翻的修正案(禁酒令)

Solidity语言设计的问题

安全性问题

有人认为Solidity语言是反自然的。本质上,转账时调用fallback函数,也就给了被转账方再次调用合约的机会。这和正常情况下转账接收方是被动接收相违背,和常识不同。因此有人提议应该使用函数式的语言编写合约

语言表达能力

图灵完备的表达能力是不是太强了?BTC的语言表达能力太差,ETH写的程序又有些危险。能不能找一种适中的语言?

在日常生活中,我们使用自然语言编写合同,自然语言写出的一些合同也有纠纷,难道要写一套合同专用语言吗?实际上的解决方法是在模板的基础上编写合同,常用的智能合约会出现模板,会出现专门编写智能合约的机构......

相信智能合约终究会走向成熟!

透明性

中心化的公司很多是闭源的,把源代码当作是商业机密。去中心化的公司为了让大家达成共识,往往需要将代码开源(比如更新,查验等等)

开源的好处

  1. 增加合约的公信力

  2. 开源代码很多人审查,不容易出现漏洞?

Many Eyeball Fallacy

虽然很多人有权限看,但是大多人没动力看,看不懂或者看懂了找不出漏洞

涉及到财产安全的合约,要仔细检查漏洞。投资需谨慎,将资金投入在自己了解擅长的领域,不要孤注一掷天台见!

去中心化

What does decentralization mean?

去中心化不是说一切由代码决定,也要有人的参与。

去中心化不是说制定好的规则一定不能修改,而是规则的修改要按照去中心化的原则来完成。

分叉

存在分叉的选项,是民主的体现,因为在中心化的世界里,你只能接受!

这就像theDAO当时的子基金,或者像还在挖矿的ETC,亦或是创建以太坊的V神,他们愿意构造一个世界,不是少数服从多数,而是只要有想法,就可以走出自己的道路。

去中心化不等价于分布式

去中心化一定是分布式的,但是分布式如果是由一个组织管辖(或者占有绝对领导权),也不能叫去中心化。

分布式的系统是不同的机器做不同的事情,最后汇总成一个结果。本质目的是为了加速

状态机

而比特币和以太坊都是运行的一台状态机,付出巨大的代价使得系统维持一个一致的状态。状态机的本质目的是为了容错。space shuttle,stock exchange 等状态机多台计算机运行同一个状态,防止某台机器宕机的风险。状态机由于同步的需要,往往是机器越多,运行越慢,因此只有几台机器(本来就是防止某台宕机的,多了也没必要)

而向BTC,ETH这种上千台计算机的分布式状态机是两者的混合体,智能合约适用的不是分布式系统,智能合约是用来在互不相识的机器之间建立共识机制的控制性语言,而不是用于大规模云计算的。

溢出

Solidity 里的SafeMath有很对针对溢出的函数

c=a*b
assert(c/a==b)

不会存在像C语言的溢出

flag:对于智能合约审计和黑客游戏的内容之后会学习分享

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【智能优化算法】粒子群优化算法(PSO)【附python实现代码】

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

MOS 管的四种类型介绍

图3.3.1 中的 MOS 管属于 N 沟道增强型。这种类型的MOS管采用P型衬底&#xff0c;导电沟道是 N 型。在vC50时没有导电沟道&#xff0c;开启电压Vcs(u)为正。工作时使用正电源&#xff0c;同时应将衬底接源极或者接到系统的电位上。在图3.3.1给出的符号中&#xff0c;用D S间断开…

Spark在YARN上运行图解(资源调度+任务调度)及案例

前提&#xff1a;已经安装了spark集群&#xff0c;可参考上篇文章搭建&#xff1a;http://t.csdnimg.cn/UXBOp 一、Spark集群配置YARN 1、增加hadoop 配置文件地址 vim spark-env.sh 增加export HADOOP_CONF_DIR/usr/local/soft/hadoop-3.1.1/etc/hadoop 2、关闭虚拟内存 cd …

[杂项]优化AMD显卡对DX9游戏(天谕)的支持

目录 关键词平台说明背景RDNA 1、2、3 架构的显卡支持游戏一、 优化方法1.1 下载 二、 举个栗子&#xff08;以《天谕》为例&#xff09;2.1 下载微星 afterburner 软件 查看游戏内信息&#xff08;可跳过&#xff09;2.2 查看D3D9 帧数2.3 关闭游戏&#xff0c;替换 dll 文件2…

从0开始linux(3)——如何读写文件

欢迎来到博主的专栏——从0开始linux 博主ID&#xff1a;代码小豪 文章目录 创建普通文件用文本编辑器nano写入文件如何读取文件cat命令less命令head和tail 我们前面已经了解和如何操作文件&#xff0c;但是目前认识的文件类型分为两类&#xff0c;一类是目录文件、另一类是普通…

【数据结构】数据结构中的隐藏玩法——栈与队列

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

UE5 像素流web 交互2

进来点个关注不迷路谢谢&#xff01; ue 像素流交互多参数匹配 主要运用像素流的解析json 状态&#xff1a; 测试结果&#xff1a; 浏览器控制台&#xff1a; 接下来编写事件传递 关注下吧&#xff01;

webshell工具-冰蝎流量特征和加密方式

一、冰蝎原理 1.1 简介 冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端&#xff0c;由于通信流量被加密&#xff0c;传统的WAF、IDS 设备难以检测&#xff0c;给威胁狩猎带来较大挑战。冰蝎其最大特点就是对交互流量进行对称加密&#xff0c;且加密密钥是由随…

【颜色】windows自带画图中的颜色编辑

结论&#xff1a;颜色编辑中的色调、饱和度和亮度&#xff0c;是与HSL颜色空间保持一致。 如下图所示&#xff0c;他有色调、饱和度和亮度&#xff0c;其数值范围均为[0,240]。 首先我使用HSV进行模拟&#xff0c;发现效果和数值对不上。 因此改换HSL进行模拟&#xff0c;其数…

NodeJS安装并生成Vue脚手架(保姆级)

文章目录 NodeJS下载配置环境变量Vue脚手架生成Vue脚手架创建项目Vue项目绑定git 更多相关内容可查看 NodeJS下载 下载地址&#xff1a;https://nodejs.org/en 下载的速度应该很快&#xff0c;下载完可以无脑安装&#xff0c;以下记得勾选即可 注意要记住自己的安装路径&…

每日AIGC最新进展(10):符号音乐生成SYMPLEX、新型图像编辑数据集ReasonPix2Pix、角色一致性插画生成、高级的风格个性化扩散模型

Diffusion Models专栏文章汇总&#xff1a;入门与实战 SYMPLEX: Controllable Symbolic Music Generation using Simplex Diffusion with Vocabulary Priors http://arxiv.org/abs/2405.12666v1 本文介绍了一种新的符号音乐生成方法&#xff0c;名为SYMPLEX&#xff0c;它基于…

台湾省军事演习路径规划:A*算法在复杂地形中的应用

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

在MySQL中,Linux表同步到Windows,有大小写的就没同步的详细解决方案

在 Linux 系统上&#xff0c;文件名是区分大小写的&#xff0c;而在 Windows 系统上&#xff0c;文件名通常不区分大小写。导致在从 Linux 同步文件到 Windows 时&#xff0c;有些文件因为名称冲突而无法同步。为了有效解决这个问题&#xff0c;可以采取以下方法&#xff1a; …

1098: 堆的判断

解法&#xff1a; 堆是完全二叉树 用数组来存储 然后用定义判定 #include<iostream> #include<vector> using namespace std; int main() {int n;cin >> n;vector<int> vec(n);for (int i 0; i < n; i) cin >> vec[i];for (int i 0; i &…

【Linux】关于获取进程退出状态中的core dump标志补充

通过 wait/waitpid 可以获取子进程的退出状态, 从而判断其退出结果. 记录退出状态的 int 变量 status 的使用情况如下图所示: 如果是收到信号终止的话, 低 7 位为收到的终止信号, 而低第 8 位为 core dump 标志, core dump 标志有什么用呢? core dump 标志只存 0/1, 表示是否…

c#自动生成缺陷图像-添加新功能(可从xml直接提取目标数据,然后进行数据离线增强)--20240524

在进行深度学习时,数据集十分重要,尤其是负样本数据。 故设计该软件进行深度学习数据预处理,最大可能性获取较多的模拟工业现场负样本数据集。 该软件基于VS2015、.NETFrameWork4.7.2、OpenCvSharp1.0.0.0、netstandard2.0.0.0、SunnyUI3.2.9.0、SunnyUI.Common3.2.9.0及Ope…

ClickHouse实战处理(一):MergeTree表引擎

MergeTree作为家族系列最基础的表引擎&#xff0c;主要有以下特点&#xff1a; 存储的数据按照主键排序&#xff1a;创建稀疏索引加快数据查询速度。支持数据分区&#xff0c;可以通过PARTITION BY语句指定分区字段。支持数据副本。支持数据采样。 一、MergeTree分类和建表参…

python水果分类字典构建指南

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、理解需求 三、构建字典 1. 数据结构选择 2. 代码实现 3. 结果展示 四、总…

C++实现基础二叉搜索树(并不是AVL和红黑树)

本次实现的二叉搜索树并不是AVL数和红黑树&#xff0c;只是了解流程和细节。 目录 二叉搜索树的概念K模型二叉搜索树的实现二叉搜索树的架构insert插入find 查找中序遍历Inorder删除earse替换法的思路情况一 &#xff1a;假如要删除节点左边是空的。在左边时在右边时 情况二&a…

JavaScript-数组的增删改查

数组的操作一共有四种&#xff1a; 查询数组数据修改数组中元素的值数组添加新的数据删除数组中的元素 数组的初始化 有些编程语言的数组初始化是用{}包着的&#xff0c;而JS的数组初始化用[] let num[2,6,1,77,52,25,7]; 数组的查询 想要具体查询数组中的某个元素 可以用数…