无论风暴将我带到什么岸边,我都将以主人的身份上岸目录一、Solidity的单位 1.货币Ether2.时间单位Time二、地址的形成三、以太坊的账户1.内部账户(简称CA)2.外部账户(简称EOA)3.内部账户和外部账户的比较 4.判断是内部账户还是外部账户的方法四、消息调用和余额查询五、交易1.公钥和私钥的区别2.交易的小知识 六、Soliditythis和msg.sender、msg.value的用法七、Solidity的转账函数1.transfer()2.send()3.call()4.transfer、send、call的区别和用法八、Solidity接收函数九、Solidity回退函
这一篇文章主要介绍solidity中的两个重要变量类型:数组(array)和结构体(struct)。数组是一种数据结构,它是存储同类元素的有序集合。数组中的特定元素由索引访问,索引值从0开始。例如,声明一个数组变量,如numbers,可以使用numbers[0]、numbers[1]和…,数字[99]表示单个变量。数组(Array)是solidity常用的一种变量类型,用来存储一组数据(整数,字节,地址等等)。数组主要有两种固定长度数组和可变长度数组。要声明一个固定长度的数组,需要指定元素类型和数量,如下所示typearrayName [ arraySize ];这是一维数组。arraySiz
熟悉一门语言得从HelloWorld!开始,因为这是最简单的一个输出形式。我们先在contracts目录下建立一个helloworld.sol文件进入编辑//SPDX-License-Identifier:MITpragmasolidity>=0.4.220.9.0;contracthelloworld{uintpublicbalance;/**********Begin**********///函数名:sayHelloWorldfunctionsayHelloWorld()publicpurereturns(stringmemory){return("HelloWorld!");}/****
我们知道,合约结构包含 状态变量、函数、函数修改器(modifier)、事件(event)、结构体(struct)和枚举类型(enum)。在^0.8.4版本,合约结构增加了错误(error),为应对失败时,错误可以在revert中使用。与错误字符串相比,error花费更少的gas(即更便宜),并且允许编码额外的数据,还可以使用natspec注释形式。举个栗子,代码如下://SPDX-License-Identifier:MITpragmasolidity^0.8.4;///@dev没有足够的金额///@param_balance表示当前合约账户余额///@param_amount转账金额err
Solidity合约安全,常见漏洞(下篇)Solidity合约安全,常见漏洞(上篇)不安全的随机数目前不可能用区块链上的单一交易安全地产生随机数。区块链需要是完全确定的,否则分布式节点将无法达成关于状态的共识。因为它们是完全确定的,所以任何"随机"的数字都可以被预测到。下面的掷骰子函数可以被利用。contractUnsafeDice{functionrandomness()internalreturns(uint256){returnkeccak256(abi.encode(msg.sender,tx.origin,block.timestamp,tx.gasprice,blockhash(b
Solidity合约安全,常见漏洞(第三篇)ERC20代币问题如果你只处理受信任的ERC20代币,这些问题大多不适用。然而,当与任意的或部分不受信任的ERC20代币交互时,就有一些需要注意的地方。ERC20:转账扣费当与不信任的代币打交道时,你不应该认为你的余额一定会增加那么多。一个ERC20代币有可能这样实现它的转账函数,如下所示:contractERC20{//internallycalledbytransfer()andtransferFrom()//balanceandapprovalcheckshappeninthecallerfunction_transfer(addressfro
Solidity是一种用于编写智能合约的编程语言,它被广泛应用于以太坊区块链上的智能合约开发。在Solidity中,有两种函数修饰符,即“pure”和“view”,它们被用来指示函数的行为。这篇文章将深入探讨“pure”和“view”的含义,以及它们在Solidity中的应用。什么是“pure”函数“pure”是一种函数修饰符,它用于标识一个函数不会访问或修改合约的状态,并且不会与其他合约进行交互。在Solidity中,如果一个函数被声明为“pure”,则编译器将确保该函数仅依赖于其参数,并且不会在执行过程中改变任何状态。下面是一个简单的“pure”函数的例子:pragmasolidity^0
复合类型的数据包括:array(数组)、struct(结构体)和mapping(映射),其中array和struct也称为引用类型。复合类型数组(array)数组(array)是一种用于存储相同类型元素的集合,分为固定长度的静态数组和长度可变的动态数组。需要注意的是,数组中的元素类型不能是映射类型(mapping),因为映射类型本身就是一种复杂的数据结构,无法直接存储在数组中。uint[5]array1;//声明了一个长度为5的静态数组,用于存储无符号整数类型的数据uint[]array2;//声明了一个动态数组,它可以更具需要在运行是调整大小赋值:为静态数组赋值可以直接赋值也可以逐个赋值:直
Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里。在这里先介绍一下qt多线程的第一种实现方法,继承qthread并重写run函数。注意:QThread只有run函数是在新线程里的,其他所有函数都在QThread生成的线程里。如果QThread是在ui所在的线程里生成,那么QThread的其他非run函数都是和ui线程一样的,所以,QThread的继承类的其他函数尽量别要有太耗时的操作,要确保所有耗时的操作都在run函数里。下面给出通过重写run函数实现多线程的小例子。首先使用qt新建一个widget项目,然后在项
前言在配置好CubeMX之后,就是新建工程的开始了,那么首先我们需要一些准备,本片博客我们会很详细的介绍STM32CubeMX的基本使用和如何创建一个新的工程并且点亮LED灯在新建工程时,我们分为了具体流程1~7,如果您不想看每部分的讲解,直接按照流程操作即可,5分钟即可成功点亮LED灯前期准备:1、STM32硬件(我的是STM32G474RE)2、STM32CubeMX软件、IDE Keil(MDK-ARM)软件3、STM32G4xxHAL库 (可以在cubeMX中直接下载) 新建工程1在主界面选择File-->NewProject 或者直接点击ACCEETOMCUSELECTOR (此