智能合约的根本性质: 智能合约在本质上时一个合约,合同,或者叫契约。其他的性质:1,不可变性:契约不能随意改变,定约,修约,废约。
EVM总是单线程执行,没有并发,是排队顺序执行的。
智能合约执行机制:1,节点的一侧是交易,transaction,另一侧是EVM。2,block是顺序生成(广播,共识,确认),transacction也是顺序生成。3,transaction被确认之后,触发EVM的执行(flashloan)。
函数可见性:三个纬度分别是合约外部,本合约,子合约。public:完全可见。 private:对本合约可见,其他不可见。 internal:对继承子合约可见(java protected)。默认是public。
交易属性:1,(transacction)默认是写操作:全网广播,共识确认。如果不是写操作,意味着区块链状态没有变化。2,view:合约状态读操作。3:与合约状态无关的函数。
一个写方法是不能直接返回值给客户端的。
address:
1,地址有两种形式 a,address: 保存一个20字节的地址。b,adress payable: 可支付的地址,有成员函数transfer和send。2,允许从address payable到address的隐式转换,反过来必须显示转换payable(<address>)。3,地址还可以显示转换为uint160,bytes20。
合约类型:
1,每一个contract定义都有他自己的类型。2,合约可以隐式转换为它的父合约。
3,合约可以显示转换为adress。比如:MyContract c; address add = address(c);
4,合约不支持任何运算符。5,声明一个合约类型的局部变量(MyContract c),则可以调用该合约的函数。
5,可以使用new创建一个新合约。
合约间调用:
一:通过import引入被调用函数所在合约的定义。调用者需持有被调用合约的地址。将地址重载为被调用合约,调用它的函数。
二:利用接口的调用
1,调用者须持有被调用合约的地址。
2,调用者自己定义一个接口,其中的函数的signatur(函数的定义)与被调用者的相应函数相同。
3,将地址重载为这个接口,调用调的函数。
这个特点极为重要,应用广泛。solidity语言允许这样做,对于java来说,被调用合约必须实现这个接口,否则重载会抛出异常。从这一点上看,solidity的类型相对要弱,但也更灵活,这一点与rust相当。
只能合约执行机制:
合约函数的上下文变量:
1,外部账号调用函数时,函数的背后都对应着交易transaction。
2,内部函数调用另一个合约时,也是用于一个类似于transaction的数据结构去调用的,这个结构叫message。msg.sender:address; msg.data; msg.value:eth。
3,一次外部账号对合约的调用,可能引发一系列合约之间的调用;所有这些调用,背后是一个block,一个transaction。
4,直接被外部账号调用的那个函数,transaction和message是同一的。
5,调用跨合约时,产生新的message。
6,合约内部的调用,背后是一个message,message没有变化。
7,transaction, internal transaction(就是合约和合约之间的调用,产生了message2)。