事务及事件信息传入智能合约后,合约资源集合中的资源状态会被更新,进而触发智能合约进行状态机判断。如果自动状态机中某个或某几个动作的触发条件满足,188智能合约1928系统开发8024,则由状态机根据预设信息选择合约动作自动执行。
基于区块链的智能合约包括事务处理和保存的机制,以及一个完备的状态机,用于接受和处理各种智能合约;并且事务的保存和状态处理都在区块链上完成。事务主要包含需要发送的数据;而事件则是对这些数据的描述信息。
function transfer(address to,uint256 value)public returns(bool){
//这里的msg.sender是调用transfer方法的人
_transfer(msg.sender,to,value);
return true;
}
function _transfer(address from,address to,uint256 value)internal{
require(to!=address(0));
//注意:using SafeMath for uint256可以被继承!
_balances[from]=_balances[from].sub(value);
_balances[to]=_balances[to].add(value);
emit Transfer(from,to,value);
}
}
//genAddress使用salt生成地址,算法与合约保持一致
func(svc*Service)genAddress(_salt int64)(common.Address,error){
cfg:=svc.cfg.Chain
creationCode,err:=hexutil.Decode(cfg.CreationCode)
if err!=nil{
return common.Address{},errors.Wrap(err,"Bad CreationCode")
}
contract:=common.HexToAddress(cfg.WalletFactory).Bytes()
byteCodeHash:=crypto.Keccak256Hash(
creationCode,
common.LeftPadBytes(contract,32),
)
salt:=big.NewInt(_salt)
hash:=crypto.Keccak256Hash(
[]byte{0xff},
contract,
common.LeftPadBytes(salt.Bytes(),32),
byteCodeHash.Bytes(),
)
var address common.Address
copy(address[:],hash.Bytes()[12:])
return address,err
}