Contract-Design

智能合約創建和執行的基礎知識和工作流程

  • June 15, 2018

我對智能合約如何在內部工作感到困惑。

我讀過這個:

https ://blog.zeppelin.solutions/the-hitchhikers-guide-to-smart-contracts-in-ethereum-848f08001f05

TLTR:有一個智能合約“ProofOfExistence”將某個字元串的雜湊值保存到數組中的範例

contract ProofOfExistence3 {
 mapping (bytes32 => bool) private proofs;
 // store a proof of existence in the contract state
 function storeProof(bytes32 proof) {
   proofs[proof] = true;
 }
 // calculate and store the proof for a document
 function notarize(string document) {
   var proof = proofFor(document);
   storeProof(proof);
 }
 // helper function to get a document's sha256
 function proofFor(string document) constant returns (bytes32) {
   return sha256(document);
 }
 // check if a document has been notarized
 function checkDocument(string document) constant returns (bool) {
   var proof = proofFor(document);
   return hasProof(proof);
 }
 // returns true if proof is stored
 function hasProof(bytes32 proof) constant returns(bool) {
   return proofs[proof];
 }
}

我的問題:

1)**當我部署該契約時會發生什麼?**就乙太坊區塊鏈而言。程式碼保存在乙太坊網路的新區塊中?我的意思是在比特幣中,我們將一些 BTC 從一個地址發送到另一個地址,並且該資訊保存在一個新塊中。乙太坊和智能合約有什麼類似之處嗎?

  1. 部署智能合約是否有任何成本?

  2. 我如何使用該合約?假設我想檢查那裡是否存在某個字元串,我該怎麼做?如果我想保存一個新字元串,也一樣。從智能合約執行某些功能(並獲得結果)的工作流程是什麼?

  3. 我們是否需要 ETH 來執行智能合約上的某些功能?為什麼?執行區塊鏈(不部署)時發生了什麼?

我知道這些回复可能有點長,但我很確定對於像我這樣的許多新手來說會是一個很好的參考:)

  1. 發送 tx 以創建一個新賬戶,一個儲存在世界狀態中的合約賬戶(這是賬戶和賬戶狀態的映射)。這創建了一個合約儲存,我們的智能合約的字節碼被儲存/引用。塊包含目前狀態的根雜湊、塊中的交易和交易收據(以及其他一些東西)。
  2. 部署合約確實需要花費 gas,至少 32 000(CREATE Opcode)。這個數量會根據部署時執行的字節碼和建構子的大小而增加。
  3. 有幾種不同的方法。您可以使用 geth 控制台並通過 RPC 與之互動。或者使用 truffle framework 和 truffle console ,它給你一個 web3 實例。可以呼叫任何公共/外部的合約方法。還有一些可用的庫,如 web3js 或 ethersjs,可以使用您最喜歡的 JS 框架(如 react、vue 或 angular)建構客戶端應用程序。
  4. 我們需要為每筆交易支付 gas(這是少量的乙太幣)。如果我們呼叫合約,我們會將 calldata 添加到我們的交易中。這包含我們要在合約上呼叫的編碼函式和參數(將帶有呼叫數據的交易發送到合約地址)。每個操作都會消耗特定數量的 gas,因此根據邏輯的複雜性,gas 成本可能會增加。該氣體用於支付處理您的交易(執行呼叫)的節點。Gas 的存在主要是為了避免垃圾郵件和圖靈停機問題(區塊有 Gas 限制)。

乙太坊白紙和黃紙是一個非常好的起點。另外:https ://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369

引用自:https://ethereum.stackexchange.com/questions/51279