以太坊智能合约自动执行所有交易——这可能吗?

Ethereum smartcontract automatical transactions - is it possible?

我刚刚为 ICO 制作了智能合约,现在我需要实现以下功能:

1.User 向钱包发送了 ETH 数量

2.User 将一些代币存入他的钱包以换取自动发送的 ETH

我对所有这一切都很陌生,所以我想知道 - 如果不使用 smartcontract,是否可以自动(或仅在手动模式下?)本身,也许还有另一种方法可以做到这一点,比如从智能合约中获取事件和调用函数,使用某种 API 来自,例如 PHP 或 JS? 如果可能的话,我什么时候可以找到有关此的一些信息? 只找到几个这样的问题,没有答案。

这里是合约代码(主要取自here):

pragma solidity ^0.4.2;
contract owned {
  address public owner;

  function owned() {
    owner = msg.sender;
  }

  modifier onlyOwner {
    if (msg.sender != owner) return;
    _;
  }

  function transferOwnership(address newOwner) onlyOwner {
    owner = newOwner;
  }
}

contract tokenRecipient { function receiveApproval(address _from, uint256 
_value, address _token, bytes _extraData); }

contract token {
/* Public variables of the token */
string public standard = 'Token 0.1';
string public name;
string public symbol;
uint8 public decimals;
uint256 public totalSupply;

/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;

/* This generates a public event on the blockchain that will notify clients 
*/
event Transfer(address indexed from, address indexed to, uint256 value);

/* Initializes contract with initial supply tokens to the creator of the 
contract */
function token(
    uint256 initialSupply,
    string tokenName,
    uint8 decimalUnits,
    string tokenSymbol
    ) {
    balanceOf[msg.sender] = initialSupply;              // Give the creator 
    all initial tokens
    totalSupply = initialSupply;                        // Update total 
    supply
    name = tokenName;                                   // Set the name for 
    display purposes
    symbol = tokenSymbol;                               // Set the symbol 
    for display purposes
    decimals = decimalUnits;                            // Amount of 
    decimals for display purposes
}

/* Send coins */
function transfer(address _to, uint256 _value) {
    if (balanceOf[msg.sender] < _value) return;           // Check if the 
sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]) return; // Check for 
overflows
    balanceOf[msg.sender] -= _value;                     // Subtract from 
the sender
    balanceOf[_to] += _value;                            // Add the same to 
the recipient
    Transfer(msg.sender, _to, _value);                   // Notify anyone 
listening that this transfer took place
}

/* Allow another contract to spend some tokens in your behalf */
function approve(address _spender, uint256 _value)
    returns (bool success) {
    allowance[msg.sender][_spender] = _value;
    return true;
}

/* Approve and then communicate the approved contract in a single tx */
function approveAndCall(address _spender, uint256 _value, bytes _extraData)
    returns (bool success) {    
    tokenRecipient spender = tokenRecipient(_spender);
    if (approve(_spender, _value)) {
        spender.receiveApproval(msg.sender, _value, this, _extraData);
        return true;
    }
}

/* A contract attempts to get the coins */
function transferFrom(address _from, address _to, uint256 _value) returns 
(bool success) {
    if (balanceOf[_from] < _value) return;                 // Check if the 
 sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]) return;  // Check for 
 overflows
    if (_value > allowance[_from][msg.sender]) return;   // Check allowance
    balanceOf[_from] -= _value;                          // Subtract from 
 the sender
    balanceOf[_to] += _value;                            // Add the same to 
 the recipient
    allowance[_from][msg.sender] -= _value;
    Transfer(_from, _to, _value);
    return true;
}

/* This unnamed function is called whenever someone tries to send ether to 
it */
function () {
    return;     // Prevents accidental sending of ether
}
}

contract MyAdvancedToken is owned, token {

uint256 public sellPrice;
uint256 public buyPrice;

mapping (address => bool) public frozenAccount;

/* This generates a public event on the blockchain that will notify clients 
*/
 event FrozenFunds(address target, bool frozen);

 /* Initializes contract with initial supply tokens to the creator of the 
 contract */
function MyAdvancedToken(
    uint256 initialSupply,
    string tokenName,
    uint8 decimalUnits,
    string tokenSymbol
) token (initialSupply, tokenName, decimalUnits, tokenSymbol) {}

/* Send coins */
function transfer(address _to, uint256 _value) {
    if (balanceOf[msg.sender] < _value) return;           // Check if the 
sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]) return; // Check for 
overflows
    if (frozenAccount[msg.sender]) return;                // Check if frozen
    balanceOf[msg.sender] -= _value;                     // Subtract from 
the sender
    balanceOf[_to] += _value;                            // Add the same to 
the recipient
    Transfer(msg.sender, _to, _value);                   // Notify anyone 
listening that this transfer took place
}


/* A contract attempts to get the coins */
function transferFrom(address _from, address _to, uint256 _value) returns 
(bool success) {
    if (frozenAccount[_from]) return;                        // Check if 
frozen            
    if (balanceOf[_from] < _value) return;                 // Check if the 
sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]) return;  // Check for 
overflows
    if (_value > allowance[_from][msg.sender]) return;   // Check allowance
    balanceOf[_from] -= _value;                          // Subtract from 
the sender
    balanceOf[_to] += _value;                            // Add the same to 
the recipient
    allowance[_from][msg.sender] -= _value;
    Transfer(_from, _to, _value);
    return true;
}

function mintToken(address target, uint256 mintedAmount) onlyOwner {
    balanceOf[target] += mintedAmount;
    totalSupply += mintedAmount;
    Transfer(0, this, mintedAmount);
    Transfer(this, target, mintedAmount);
}

function freezeAccount(address target, bool freeze) onlyOwner {
    frozenAccount[target] = freeze;
    FrozenFunds(target, freeze);
}

function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner {
    sellPrice = newSellPrice;
    buyPrice = newBuyPrice;
}

function buy() payable {
    uint amount = msg.value / buyPrice;                // calculates the 
amount
    if (balanceOf[this] < amount) return;               // checks if it has 
enough to sell
    balanceOf[msg.sender] += amount;                   // adds the amount to 
buyer's balance
    balanceOf[this] -= amount;                         // subtracts amount 
from seller's balance
    Transfer(this, msg.sender, amount);                // execute an event 
reflecting the change
}

function sell(uint256 amount) {
    if (balanceOf[msg.sender] < amount ) return;        // checks if the 
sender has enough to sell
    balanceOf[this] += amount;                         // adds the amount to 
owner's balance
    balanceOf[msg.sender] -= amount;                   // subtracts the 
amount from seller's balance
    if (!msg.sender.send(amount * sellPrice)) {        // sends ether to the 
seller. It's important
        return;                                         // to do this last 
to avoid recursion attacks
    } else {
        Transfer(msg.sender, this, amount);            // executes an event 
reflecting on the change
    }               
}
}

请原谅我的愚蠢和糟糕的英语:)

非常感谢。

其实我没明白你说的automatically是什么意思。但我认为你想为每个向你的合约发送 ETH 的人发送代币,而不需要调用 buy 方法。至少那是我为 Jincor Pre ICO and you can check the code on Github 所做的 您可以通过添加到您的合同 MyAdvancedToken 来实现这一点: ```

 function () payable {
        buy();
    }

``` 对不起,如果我没有很好地收到您的消息。

当以太币到达合约地址函数时

function() payable {..}

叫了。

您可以在合约中定义此函数并使用globally available variables: msg.value - 以太币的数量(wei 的数量) msg.sender - 发送以太币的地址