以太坊学习笔记

以太坊学习笔记

一、SyntaxError: Functions are not allowed to have the same name as the contract. If you intend this to be a constructor, use “constructor(…) { … }” to define it.
0.4.22版本后将function name(此name与合约名相同)改为constructor
例如:contract hello{
function hello(){}
}
改为contract hello{
constructor(){}
}
构造函数constructor功能:初始化,用于定义初值,在部署合约时定义

二、assert and require
两个都是条件限制函数,assert表示里面的条件一定为真,为假就表示是我们内部的一个逻辑错误,就是说我们程序出错了,不允许为假。
require里面可以为假,假的也就是输入非法而已

三、bool类型
参考百度百科
布尔类型对象可以被赋予文字值true或者false,所对应的关系就是真与假的概念

布尔类型只有两个值,false 和 true。
通常用来判断条件是否成立。
如果变量值为 0 就是 false,否则为 true,布尔变量只有这两个值。
如:
  例1:bool pb= -1.5; // pb=true;
  例2:bool pt=0; // pt=false;

四、授权映射
mapping(address=>mapping(address=>uint)) public allowance;
调用allowance,第一个参数表示最内层地址给出的额度,他的余额;第二个参数???
allowance[address][address]

五、solidity中"^“与”>"的区别
“^” 表示高于设定版本,但不超过大版本
“>” 表示高于设定版本,可以超过大版本

pragma solidity >0.5.0; //表示大于0.5.0的所有版本,包括0.6.0及其以上的
pragma solidity ^0.5.0; //表示大于0.5.0小于0.6.0的版本

六、arr.push()的用法
将()内的东西加入到数组的末尾,得到新的数组。
测试链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/push

链接可在线测试push的用法,帮助理解其用法。

七、Expected a state variable declaration. If you intended this as a fallback function or a function to handle plain ether transactions, use the “fallback” keyword or the “receive” keyword instead. function () payable public {}

Warning: This contract has a payable fallback function, but no receive ether function. Consider adding a receive ether function.

当一个合约需要进行以太交易时,需要加两个函数
fallback () payable external {}
receive () payable external {}
显然,第一个是版本更新导致的错误,用fallback代替function。第二个警告是有fallback,就要加一个receive。

八、payable
constructor 上加payable ,表示想在合约部署的时候就要给合约转币。就是部署合约的同时给合约账户一些以太。
如果我们发起交易要给合约转币,这时候要加回退函数:
fallback () payable external {}
receive () payable external {}
函数中加payable表示是我们可以给他转币
进行纯转账时,会触发回退函数。当合约收到以太但没有数据,回退函数就会执行,这是回退函数需要加上payable。

九、remix中橘色表示是修改状态的,蓝色表示是不修改状态的
一个function我们加view那他就是蓝色不修改状态的,不加view或pure都认为他是修改状态的。
以remix中的ballot.sol为例:
在这里插入图片描述
对应函数与左边的颜色可以看出。

十、modifier的使用
和function有些类似。看例子:
adress public me
constructor() public {
me=msg.sender;
}
modifier aaa(){
require(msg.sender==me,“only me!”);
_;
}
函数调用时:
function bbb() public view aaa return(uint){
return 200;
}
例子只写了一部分,仅用于描述modifier的使用。
**modifier什么情况下使用:**在一个限制条件被多个地方引用时,即多个function中都需要同一个require限制时。

aaa为函数修改器的名字,{}内定义了我们的限制条件,require后面加了一个 _;,这个表示了调用这个的函数在这个位置执行,就是我们require语句后面执行。当然这个”_“除了放在require后面,也可以放前面,放前面我们就先执行函数体,然后再执行require。
require中,我们除了判断语句,还在后面加了一个类似于注释的语句only me!这是我们设置的报错语句。就是当不满足require时,返回这个语句。

十一、event
日志基础设施,用来记录,存为日志。可实现print的功能
事件是能方便地调用以太坊虚拟机日志功能的接口。
event调用必须用emit
官方例子:

pragma solidity ^0.4.21;
contract SimpleAuction {
    event HighestBidIncreased(address bidder, uint amount); // 事件

    function bid() public payable {
        // ...
        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
    }
}

十二、控制台常用命令
Javascript Console中常用命令:

personal.newAccount():创建账户;
personal.listAccounts:查看账户,同eth.accounts
personal.unlockAccount():解锁账户;
eth.accounts:枚举系统中的账户;
eth.getBalance():查看账户余额,返回值的单位是 Wei(Wei 是以太坊中最小货币面额单位,类似比特币中的聪,1 ether = 10^18 Wei);
eth.blockNumber:列出区块总数;
eth.getTransaction():获取交易;
eth.getBlock():获取区块;
miner.start():开始挖矿;
miner.stop():停止挖矿;
eth.coinbase:挖矿奖励的账户
web3.fromWei():Wei 换算成以太币;
web3.toWei():以太币换算成 Wei;
txpool.status:交易池中的状态;
admin.addPeer():连接到其他节点;
admin.nodeInfo:查看节点摘要信息

参考学习链接:http://sai628.com/2018-06-07-geth-console.html

十三、退出vi/vim模式
命令输入:Esc+:+wq/q/wq!/q!
!表示强制执行
wq保存并退出
q不保存退出编辑
!!!别忘了输入冒号

十四、solidity中view和pure的差别
版本更新时将constant分为view和pure,view表示可读不可写,pure更加严格,表示不可读不可写。

十五、以太坊私链搭建
预先装好需要的软件
首先,创建json文件,初始化创世区块
genesis.json:

{                                                                                                                          
"config": {                                                                                                                
"chainId": 123                                                                                                    
           },                                                                                                                       
"gasLimit": "0x8000000",                                                                                                
"difficulty": "0x2000",                                                                                                 
"alloc": {                                                                                                                    
"0x640CcA3baDE7c789306166cb47d1049740e99C28":{"balance":"10000000000000000000"}                                   
         } 
}

然后输入初始化命令

geth --dirdata . init genesis.json

最后输入启动命令

geth --dirdata . --networkid 123

networkid与json文件中的chainid保持一致

十六、在node控制台中,使用solc.compile()命令编译智能合约时报错的问题
报错信息:{“errors”:[{“component”:“general”,“formattedMessage”:"* Line 1, Column 1\n Syntax error: value, object or array expected.\n* Line 1, Column 2\n Extra non-whitespace after JSON value.\n",“message”:"* Line 1, Column 1\n Syntax error: value, object or array expected.\n* Line 1, Column 2\n Extra non-whitespace after JSON value.\n",“severity”:“error”,“type”:“JSONError”}]}
报错原因:由于安装的solc版本与.sol文件中的选择的编译器版本不匹配的问题

*迷惑点:我是使用的时web3@0.20.1和solc@0.6.12,.sol文件中为pragma solidity ^0.6.8;按理来说solc版本应该是匹配没问题的,但是依旧报同样的错误

最后解决方案: 最后没找到原因,我将安装的solc卸载,装了0.4.22版本的solc,编译通过。
感觉好像web3的版本和solc的版本之间也存在兼容问题,可能web3@0.20.1和solc@0.6.8不能同时使用。
感谢https://blog.csdn.net/Ye_zen/article/details/106588850

十七、solidity–enum

https://blog.csdn.net/tsyx/article/details/79500036
https://www.tryblockchain.org/Solidity-Type-Enum-%E6%9E%9A%E4%B8%BE.html

枚举类型是在Solidity中的一种用户自定义类型

enum是枚举,就是某个变量的值是能够列举的,比如,星期的话就每周1到7,月的话就1到12、而struct的话是对于某个变量是有很多数据类型构成一个总体的,比如学生这个变量,他需要学号,姓名,年龄,性别等等,这个时候就需要定义结构体了。

十八、view和pure
只要有了pure与view修饰符的函数,那么调用函数就不会消耗gas。而没有pure与view修饰的函数,如下面的change就会消耗gas。
view只可以修饰函数,不可以修饰变量。 pure只可以修饰函数。

十九、solidity mapping

例子:

contract MappingExample{
    mapping(address => uint) public balances;
    
    function update(uint amount) returns (address addr){
        balances[msg.sender] = amount;
        return msg.sender;
    }
}

mapping定义的变量balances,msg.sender视为balances的参数,得到余额

二十、storage和memory
状态变量(在函数之外声明的变量)默认为“storage”形式,并永久写入区块链;而在函数内部声明的变量默认是“memory”型的,它们函数调用结束后消失。

二十一、solidity中内置函数
在这里插入图片描述
在这里插入图片描述
以第一个图为准,第二个图参考。block.blockhash以弃用,改为blockhash

二十二、基本类型转换–显式转换

链接:https://learnblockchain.cn/docs/solidity/types/conversion.html
在这里插入图片描述
类型名后面直接加小括号就是强制转换了

二十三、assert() 、 require() 和 revert()
分析下例逻辑,就很明显了
在这里插入图片描述

二十四、solidity中indexed 参数
在这里插入图片描述

indexed参数只在events中使用,indexed使我们可以通过参数索引直接搜索到events。

二十五、web3.eth.sign 与 web3.personal.ecRecover

在geth客户端执行
在这里插入图片描述
二十六、

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值