# Get signature from tx data
# 从交易数据中获取签名
sig_v=~calldataload(0)sig_r=~calldataload(32)sig_s=~calldataload(64)# Get tx arguments
# 获取交易参数
tx_nonce=~calldataload(96)tx_to=~calldataload(128)tx_value=~calldataload(160)tx_gasprice=~calldataload(192)tx_data=string(~calldatasize()-224)~calldataload(tx_data,224,~calldatasize())# Get signing hash
# 获取签名哈希
signing_data=string(~calldatasize()-64)~mstore(signing_data,tx.startgas)~calldataload(signing_data+32,96,~calldatasize()-96)signing_hash=sha3(signing_data:str)# Perform usual checks
# 执行通常的检查
prev_nonce=~sload(-1)asserttx_nonce==prev_nonce+1assertself.balance>=tx_value+tx_gasprice*tx.startgasassert~ecrecover(signing_hash,sig_v,sig_r,sig_s)==<pubkeyhashhere># Update nonce
# 更新 nonce
~sstore(-1,prev_nonce+1)# Pay for gas
# 支付 gas
~send(MINER_CONTRACT,tx_gasprice*tx.startgas)# Make the main call
# 进行主要的调用
~call(msg.gas-50000,tx_to,tx_value,tx_data,len(tx_data),0,0)# Get remaining gas payments back
# 取回剩余的 gas 支付
~call(20000,MINER_CONTRACT,0,[msg.gas],32,0,0)
一种简单的策略是拥有一组正则表达式,将针对帐户的 to 地址进行检查,每个正则表达式对应于已知“安全”(在这种意义上,如果帐户具有该代码,并且涉及帐户余额、帐户存储和交易数据的特定检查通过,则如果该交易包含在区块中,矿工将获得报酬)的“标准帐户类型”,并挖掘和转发通过这些检查的交易。
一个例子是按如下方式检查:
检查 to 地址是否具有作为上述 Serpent 代码编译版本的代码,其中 <pubkey hash here> 替换为任何公钥哈希。
检查交易数据中的签名是否与该密钥哈希验证。
检查交易数据中的 gasprice 是否足够高
检查状态中的 nonce 是否与交易数据中的 nonce 匹配
检查帐户中是否有足够的以太币来支付费用
如果所有五个检查都通过,则转发和/或挖掘交易。
一种更宽松但仍然有效的策略是接受任何符合与上述相同通用格式的代码,仅消耗有限数量的 gas 来执行 nonce 和签名检查,并保证交易费用将支付给矿工。 另一种策略是,除了其他方法外,尝试处理任何要求低于 250,000 gas 的交易,并且仅当矿工在执行交易后的余额比执行交易前的余额适当高时才包括该交易。