什麼觸發交易記錄在區塊鏈上?
我是區塊鏈開發的新手。我試圖了解交易在何處、何時以及如何發送到區塊鏈進行記錄。
這是我正在研究的範常式式碼:
pragma solidity ^0.4.21; import "./EIP20Interface.sol"; contract EIP20 is EIP20Interface { uint256 constant private MAX_UINT256 = 2**256 - 1; mapping (address => uint256) public balances; mapping (address => mapping (address => uint256)) public allowed; /* NOTE: The following variables are OPTIONAL vanities. One does not have to include them. They allow one to customise the token contract & in no way influences the core functionality. Some wallets/interfaces might not even bother to look at this information. */ string public name; //fancy name: eg Simon Bucks uint8 public decimals; //How many decimals to show. string public symbol; //An identifier: eg SBX function EIP20( uint256 _initialAmount, string _tokenName, uint8 _decimalUnits, string _tokenSymbol ) public { balances[msg.sender] = _initialAmount; // Give the creator all initial tokens totalSupply = _initialAmount; // Update total supply name = _tokenName; // Set the name for display purposes decimals = _decimalUnits; // Amount of decimals for display purposes symbol = _tokenSymbol; // Set the symbol for display purposes } function transfer(address _to, uint256 _value) public returns (bool success) { require(balances[msg.sender] >= _value); balances[msg.sender] -= _value; balances[_to] += _value; emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars return true; } function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { uint256 allowance = allowed[_from][msg.sender]; require(balances[_from] >= _value && allowance >= _value); balances[_to] += _value; balances[_from] -= _value; if (allowance < MAX_UINT256) { allowed[_from][msg.sender] -= _value; } emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars return true; } function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } function approve(address _spender, uint256 _value) public returns (bool success) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars return true; } function allowance(address _owner, address _spender) public view returns (uint256 remaining) { return allowed[_owner][_spender]; } }
這段程式碼在哪裡將交易發送到區塊鏈?是傳遞函式中的事件嗎?
非常感謝你的幫助!
一切(無例外)都始於由外部擁有的賬戶 (EOA) 簽署的交易。
簽名的交易被發送到網路並包含在一個塊中。塊建立規範的交易順序。(同行發現、八卦和探勘。)
當區塊到達時,節點會處理有序交易。要部署該合約,首先,它被編譯(開發人員完成,鏈下)成 ByteCode,這是本機可執行格式。ByteCode 類似於已編譯的彙編器,但“CPU”和其他問題不是由處理器/硬體/平台定義的。相反,它們在乙太坊協議中被定義為邏輯指令。如果有幫助,它被建模為具有單個堆棧的堆棧機器。
通過發送交易來部署合約:
- 精心設計了一種特定的方式來包含部署本身的指令(基本上是一個包裝器,其中包括前導碼和要傳遞給建構子的任何參數,如果有的話)。
- 定址到地址 0x0,也就是空地址。
正確形成的創建交易將:
- 將參數傳遞給建構子並執行它
- 如果建構子沒有中止,那麼…
- 將字節碼部署到確定性地址
他們這樣做是因為 ByteCode(記住包裝器)告訴 EVM,驗證區塊鏈的每個節點都會看到這是唯一可能發生的事情。因此,每個人都會同意在某個地址存在與該字節碼的合約。
這一行:
餘額
$$ msg.sender $$= _initialAmount;
說 msg.sender 是部署後唯一擁有任何令牌的使用者,因此他們是唯一可以做任何重要事情的簽名者。其他人的餘額為 0,因為在映射中沒有明確寫入他們的插槽(每個可能的地址)。
Msg.sender 可以
- 將函式、say
transfer
和參數(例如,收件人和金額,它們是 uint 和地址)放入 msg.data。- 解決它
to
的契約- 簽字
- 發送到網路
當交易被探勘時,網路將處理
function transfer()
這些輸入。網路本身關注低級問題,例如:
- 簽名了嗎?
- 是否正確形成?
- 之前發生了什麼?(挖礦與交易順序有關)
契約涉及應用程序級別的問題,例如:
- 發件人是否有足夠的令牌?
要求(餘額
$$ msg.sender $$>= _value);
- 會計:
餘額
$$ msg.sender $$-= _值;餘額$$ _to $$+= _值;
客戶可能對此感興趣嗎?
發出傳輸(msg.sender,_to,_value);
如果 msg.sender 是另一個契約,有什麼要對其他契約說的嗎?
返回真;
如果一切正常,發送的代幣將從發送者的餘額中減去,添加到接收者的餘額中,將發出一個事件,函式將返回 true。
希望能幫助到你。
您粘貼的程式碼是用於創建智能合約的程式碼。這是一個在乙太坊區塊鏈內部執行的程序,區塊鏈的使用者可以與智能合約進行互動。合約所做的一切都發生在區塊鏈內部。
現在,如果我只是將該程式碼(或任何其他用於創建智能合約的程式碼)複製粘貼到某個編輯器,那麼顯然它只是一段程式碼,僅此而已。然後我必須將其編譯為字節碼並向包含字節碼數據的區塊鏈發出交易。該交易通過稱為節點的區塊鏈客戶端中繼到區塊鏈。
因此,您提供的程式碼不包含有關契約如何實際部署到區塊鏈的任何資訊 - 有各種工具可以做到這一點(例如 Truffle)。