特殊交易:合约注册

有一种特殊的带有data,没有value的交易。表示注册一个新的合约。合约登记交易被发送到一个特殊的目的地地址,即零地址。简而言之,合约注册交易中的+to+字段包含地址 0x0。该地址既不代表EOA(没有相应的私人/公共密钥对)也不代表合约。它永远不会花费ether或启动交易。它仅用作目的地,具有“注册此合约”的特殊含义。

尽管零地址仅用于合约注册,但它有时会收到来自各个地址的付款。对此有两种解释:无论是偶然的,导致ether的丧失,还是故意的_ ether燃烧_(见[burning_ether])。如果你想进行有意识的ether燃烧,你应该向网络明确你的意图,并使用专门指定的燃烧地址:

  1. 0x000000000000000000000000000000000000dEaD
Warning

发送至合约注册地址 0x0 或指定燃烧地址 0x0 … dEaD 的任何ether将变得不可消费并永远丢失。

合约注册交易不应包含ether value,只能包含合约编译字节码的data。此次交易的唯一影响是注册合约。

作为例子,我们可以发布 [intro] 中使用的 Faucet.sol。合约需要编译成二进制十六进制表示。这可以用Solidiy编译器完成。

  1. > solc --bin Faucet.sol
  2. ======= Faucet.sol:Faucet =======
  3. Binary:
  4. 6060604052341561000f57600080fd5b60e58061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e1a7d4d146041575b005b3415604b57600080fd5b605f60048080359060200190919050506061565b005b67016345785d8a00008111151515607757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151560b657600080fd5b505600a165627a7a72305820d276ddd56041f7dc2d2eab69f01dd0a0146446562e25236cf4ba5095d2ee802f0029

相同的信息也可以从Remix在线编译器获得。 现在我们可以创建交易。

  1. > src = web3.eth.accounts[0];
  2. > faucet_code = "0x6060604052341561000f57600080fd5b60e58061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e1a7d4d146041575b005b3415604b57600080fd5b605f60048080359060200190919050506061565b005b67016345785d8a00008111151515607757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151560b657600080fd5b505600a165627a7a72305820d276ddd56041f7dc2d2eab69f01dd0a0146446562e25236cf4ba5095d2ee802f0029"
  3. > web3.eth.sendTransaction({from: src, data: faucet_code, gas: 113558, gasPrice: 200000000000})
  4. "0x7bcc327ae5d369f75b98c0d59037eec41d44dfae75447fd753d9f2db9439124b"

不需要指定+to+参数,将使用默认的零地址。你可以指定 gasPrice 和 gas 限制。 一旦合约被开采,我们可以在etherscan区块浏览器上看到它。

Etherscan showing the contract successully mined

Figure 5. Etherscan showing the contract successully minded

你可以查看交易的接收者以获取有关合约的信息。

  1. > eth.getTransactionReceipt("0x7bcc327ae5d369f75b98c0d59037eec41d44dfae75447fd753d9f2db9439124b");
  2. {
  3. blockHash: "0x6fa7d8bf982490de6246875deb2c21e5f3665b4422089c060138fc3907a95bb2",
  4. blockNumber: 3105256,
  5. contractAddress: "0xb226270965b43373e98ffc6e2c7693c17e2cf40b",
  6. cumulativeGasUsed: 113558,
  7. from: "0x2a966a87db5913c1b22a59b0d8a11cc51c167a89",
  8. gasUsed: 113558,
  9. logs: [],
  10. logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  11. status: "0x1",
  12. to: null,
  13. transactionHash: "0x7bcc327ae5d369f75b98c0d59037eec41d44dfae75447fd753d9f2db9439124b",
  14. transactionIndex: 0
  15. }

在这里我们可以看到合约的地址。我们可以按照 将数据传输到EOA或合约 所示,从合约发送和接收资金。

  1. > contract_address = "0xb226270965b43373e98ffc6e2c7693c17e2cf40b"
  2. > web3.eth.sendTransaction({from: src, to: contract_address, value: web3.toWei(0.1, "ether"), data: ""});
  3. "0x6ebf2e1fe95cc9c1fe2e1a0dc45678ccd127d374fdf145c5c8e6cd4ea2e6ca9f"
  4. > web3.eth.sendTransaction({from: src, to: contract_address, value: 0, data: "0x2e1a7d4d000000000000000000000000000000000000000000000000002386f26fc10000"});
  5. "0x59836029e7ce43e92daf84313816ca31420a76a9a571b69e31ec4bf4b37cd16e"

过一段时间,这两个交易都可以在ethescan上看到

Etherscan showing the transactions for sending and receiving funds

Figure 6. Etherscan showing the transactions for sending and receiving funds