关键字Internal和external的区别
- 可见性和可访问性:
internal
函数:这些函数只能在当前合约内部、其子合约或继承自该合约的其他合约中被调用。换句话说,它们对于合约的外部调用者来说是不可见的,只能通过合约内部的其他函数或合约之间的调用进行访问。external
函数:这些函数只能在合约外部被调用,即只能通过外部地址发送消息来触发。它们不能在当前合约内部的其他函数中被直接调用,除非是通过外部调用(例如,通过this.someExternalFunction()
)。
- 函数签名和调用机制:
internal
函数:由于它们在当前合约内部或子合约中可见,因此它们的调用通常不涉及函数签名的显式传递。调用是通过直接跳转到函数的入口标签来实现的。external
函数:由于它们仅从外部调用,因此它们由地址和函数签名组成。当外部地址发送一个消息调用时,它必须包含正确的函数签名,以便合约能够识别并调用相应的external
函数。
- 继承关系:
- 两者在继承关系中都有特定的行为。无论是
internal
还是external
函数,子类都可以继承它们并在需要时调用。但是,由于external
函数只能在合约外部被调用,因此子类不能在其内部直接调用继承的external
函数(除非通过外部调用)。
- 两者在继承关系中都有特定的行为。无论是
- 与状态变量的交互:
- 无论是
internal
还是external
函数,它们都可以与合约的状态变量进行交互(读取、修改等),这取决于函数的实现和所使用的其他修饰符(如view
、pure
等)。
- 无论是
- 默认值:
- 函数可见性默认为
public
。 - 状态变量可见性默认为
internal
external
修饰符只能用于函数,不能用于修饰状态变量。- 使用
internal
和private
修饰符时,需要注意它们对继承合约的可见性影响。 public
修饰符生成的函数通常用于提供合约的外部接口,而internal
和private
修饰符的函数则更多用于合约内部逻辑的处理。
- 函数可见性默认为
modifier onlyOwner()用途:
modifier
是一种特殊的函数,它用于修改其他函数的行为,而不需要修改那些函数的实际代码。修饰符(modifier)可以添加前置条件(在函数执行之前执行)、后置条件(在函数执行之后执行)或同时添加两者。
onlyOwner()
是一个常见的修饰符,用于确保只有合约的所有者(owner
)才能调用被该修饰符修饰的函数。当某个函数被 onlyOwner
修饰符修饰时,如果在调用该函数时调用者不是合约的所有者,那么函数会立即停止执行并抛出一个错误。
在我的理解中:这个modifier onlyOwner()类似java中面向切面编程,modifier用于“确定切点”用来执行onlyOwner事务("自我理解,有错误的话,多谢纠正")
now
返回类型
Unix时间传统用一个32位的整数进行存储。这会导致“2038年”问题,当这个32位的unix时间戳不够用,产生溢出。
Unix时间戳传统上使用32位整数存储,这是因为早期的系统和应用程序设计时内存和存储资源相对有限,32位整数足以覆盖一个相对宽泛的时间范围。32位整数能表示的数字范围是从-2^31到2^31-1,即大约从-21亿到21亿。
具体到Unix时间戳,它是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不包括闰秒。使用无符号整数存储时,32位能够表示的时间范围大约是从1970年到2038年1月19日03:14:07 UTC,这个时间点被称为“2038年问题”或“Y2038”。
now
这类函数获取,通常是64位整数或更大范围表示