以太坊智能合約流程
① Truffle浠ュお鍧婂悎綰﹂儴緗叉暀紼嬫湁浜烘湁涔
Truffle灝辨槸涓栫晫綰т互澶鍧婂紑鍙戞嗘灦鍐呯疆鏅鴻兘銆佸悎綰︾紪璇戙佽繛鎺ャ佸紑鍙戝苟涓斾簩榪涘埗綆$悊蹇閫熷紑鍙戣嚜鍔ㄥ寲鍚堢害嫻嬭瘯鑴氭湰銆佸彲鎵╁睍鎬х殑閮ㄧ講騫朵笖榪佺Щ妗嗘灦閫傜敤浜庨儴緗插埌浠繪剰鏁伴噺鐨勫叕緗戝拰縐佺綉鐨勭綉緇滅$悊,涓哄悎綰﹂氫俊鎻愪緵浜や簰寮忔帶鍒跺彴鍒涘緩欏圭洰灝辨槸le浠ュお鍧婂悎綰﹂儴緗層俆ruffle init鐩褰曠粨鏋刢ontracts: 瀛樻斁鍚堢害migrations錛氬瓨鏀鵑儴緗茶剼鏈瑃est錛氭祴璇曟枃浠秚ruffle-config.js: 閰嶇疆鏂囦歡錛岄厤緗涓嶅悓緗戠粶鍒涘緩鍚堢害pragma solidity ^0.4.24;contract SimpleStorage{ uint storedData; function set(uint x) public{ storedData =x; } function get() public view returns (uint){ return storedData; }}緙栬瘧鍚堢害鐢熸垚 build/contract 緙栬瘧鏂囦歡truffle compile鎵ц岀紪璇戜箣鍚,浼氱敓鎴恇uild鏂囦歡澶,閲岄潰鍖呭惈 abi銆乥ytecode銆乶etwork閮ㄧ講鑴氭湰const SimpleStorage = artifacts.require("SimpleStorage");mole.exports = function(deployer) { deployer.deploy(SimpleStorage);};閮ㄧ講緗戠粶//浣犳墍瑕侀儴緗茬殑緗戠粶鐨勫悕瀛 ganacheNet: { host: "127.0.0.1", // Localhost (default: none) port: 7545, // Standard Ethereum port (default: none) network_id: "*", // Any network (default: none) },緇撴灉灞曠ずtruffle migrate --network ganacheNet姝ゆ椂浜ゆ槗宸茬粡浜х敓鍒癵anache閫氳繃 remix 嫻嬭瘯at address 鐢 ganache 閲岄潰鐨刢reate addressGit銆
鎴戜滑閫氳繃浠ヤ笂鍏充簬Truffle浠ュお鍧婂悎綰﹂儴緗叉暀紼嬫湁浜烘湁涔堝唴瀹逛粙緇嶅悗,鐩鎬俊澶у朵細瀵筎ruffle浠ュお鍧婂悎綰﹂儴緗叉暀紼嬫湁浜烘湁涔堟湁涓瀹氱殑浜嗚В,鏇村笇鏈涘彲浠ュ逛綘鏈夋墍甯鍔┿
② solidity 智能合約(3):使用truffle編譯部署及測試合約
先找源碼敲一遍,跑起來,後面慢慢講怎麼用solidity編寫以太坊智能合約。
這個文件編寫在 contracts 目錄下
這個文件在 migrations 目錄下
這個文件可以創建一個 test 目錄,然後放進去,我這里直接放在了根目錄,不太規范。
要編譯Truffle項目里的合約,請切換到項目工程所在根目錄,然後在終端中鍵入以下內容:
首次運行時,將編譯所有合約。 在後續運行中,Truffle將僅編譯自上次編譯以來有更改的合約。如果我們想覆蓋此行為,可以使用 --all 選項運行上面的命令。
編譯的目標文件 Artifacts 將放在 build/contracts/ 目錄中,相對於項目根目錄(如果該目錄不存在,將創建該目錄。)
這些 Artifacts 是Truffle內部工作的組成部分,它們在成功部署應用程序中起著重要作用。 不要去編輯這些文件,因為這些文件將被合約編譯和部署覆蓋。
編譯成功後
遷移腳本(JavaScript文件)可幫助我們將合約部署到以太坊網路。 這些文件負責暫存我們的部署任務,並且假設我們的部署需求會隨著時間的推移而發生變化。 隨著項目的發展,我們將創建新的遷移腳本,以進一步推動區塊鏈的發展。 先前運行的部署記錄通過特殊的 Migrations 遷移合約記錄在鏈上,詳細信息如下。
部署命令
要運行部署,請運行以下命令:
這將部署在項目的 migrations 目錄中的所有遷移文件。 最簡單的遷移只是一組管理部署腳本。 如果我們的遷移先前已成功運行,則 truffle migrate 將從上次運行的遷移開始執行,僅運行新創建的遷移。 如果不存在新的遷移, truffle migrate 將不會執行任何操作。 我們可以使用 --reset 選項從頭開始運行所有遷移。 對於本地測試,確保在執行 migrate 之前安裝並運行了 Ganache等 測試區塊鏈。
測試腳本中輸入數值 100 ,取出的數值為 64 (這個值是16進制格式,轉為十進制就是 100 ).
③ 浠ュお浠e竵鎬庝箞鏍峰彂
浠ュお浠e竵鎬庝箞鍙戣
浠ュお浠e竵鏄鍩轟簬浠ュお鍧婏紙Ethereum錛夊尯鍧楅摼鍙戣岀殑錛屼互涓嬫槸浠ュお浠e竵鐨勫彂琛岃繃紼嬶細
鍒涘緩浠e竵鍚堢害錛氫互澶鍧婂厑璁哥敤鎴峰壋寤鴻嚜瀹氫箟鐨勪唬甯侊紝榪欓渶瑕佺紪鍐欐櫤鑳藉悎綰︺傛櫤鑳藉悎綰︽槸涓孌典唬鐮侊紝鎻忚堪浜嗕唬甯佺殑鍙戣岄噺銆佸悕縐般佺﹀彿銆佽漿縐昏勫垯絳変俊鎮銆傚壋寤烘櫤鑳藉悎綰﹂渶瑕佷嬌鐢⊿olidity鎴栧叾浠栫紪紼嬭璦錛屼嬌鐢≧emix絳塈DE榪涜岀紪鍐欍佹祴璇曞拰閮ㄧ講銆
閮ㄧ講浠e竵鍚堢害錛氬綋鏅鴻兘鍚堢害緙栧啓瀹屾垚鍚庯紝闇瑕佸皢鍏墮儴緗插埌浠ュお鍧婂尯鍧楅摼涓娿傝繖涓榪囩▼闇瑕佷嬌鐢ㄤ互澶鍧婇挶鍖咃紙濡侻etamask錛夎繛鎺ヤ互澶鍧婅妭鐐癸紝娑堣椾竴瀹氱殑Gas璐圭敤銆傞儴緗叉垚鍔熷悗錛岃ヤ唬甯佸氨琚鍒涘緩騫跺瓨鍌ㄥ湪浠ュお鍧婄綉緇滀腑銆
鍙戣屼唬甯侊細浠e竵鐨勫彂琛岄噺鍙浠ュ湪鏅鴻兘鍚堢害涓榪涜屽畾涔夈備竴鑸鏉ヨ達紝鍙戣屼唬甯侀渶瑕佷竴瀹氱殑鏉′歡錛屽傚畬鎴愭煇涓浠誨姟銆佽幏寰楁煇涓濂栧姳銆佹姇璧勭瓑銆傚傛灉瑕佸悜鍏浼楀彂琛屼唬甯侊紝鍙浠ラ氳繃ICO錛圛nitialCoinOffering錛夌瓑鏂瑰紡榪涜岋紝榪欓渶瑕佺紪鍐欎唬甯佺櫧鐨涔︺佸埗瀹氫唬甯侀攢鍞璁″垝絳夈
綆$悊浠e竵錛氫唬甯佺殑綆$悊鍖呮嫭璁劇疆浠e竵鐨勭﹀彿銆佸悕縐般佹婚噺銆佸皬鏁頒綅鏁扮瓑淇℃伅錛屼互鍙婄$悊浠e竵鐨勮漿縐匯侀攢姣併佸喕緇撶瓑鍔熻兘銆傝繖浜涚$悊鍔熻兘涔熸槸鍦ㄦ櫤鑳藉悎綰︿腑榪涜屽畾涔夌殑銆
鎬諱箣錛屼互澶浠e竵鐨勫彂琛岄渶瑕佺紪鍐欐櫤鑳藉悎綰﹀苟灝嗗叾閮ㄧ講鍒頒互澶鍧婄綉緇滀腑錛岀劧鍚庡畾涔変唬甯佺殑鍙戣岄噺鍜岀$悊鍔熻兘錛屾渶鍚庨氳繃ICO鎴栧叾浠栨柟寮忓悜鍏浼楀彂琛屼唬甯併
④ 以太坊的智能合約
智能合約是運行在計算機裡面的,用於保證讓參與方執行承諾的代碼,般情況下,普通合約上記錄了甲方與乙方各方面的關系條款,並通常是通過法律強制執行或保護的,而「智能合約」則是用密碼或密鑰來執行關系。以更加直接的角度來理解的話,即「智能合約」的程序內容將同-開始大家一起設定好的那樣百分百執行,並且零差錯。
舉個例子,以太坊用戶可以使用智能合約在特定日期向朋友發送10個以太幣。在這種情況下,用戶可以操作創建一個合約,然後將程序推人該合約中進行特殊計算,以便它能夠執行所需的命令。而以太坊就是專門把精力集中在這件事上的這么一個平台。
比特幣是第一個支持「智能契約」的資源幣種,因為網路的價值在於把價值或數據從一個點或人轉移到另一個點或人身上。節點網路只在滿足某些條件時才會進行驗證,但是,比特幣僅限於貨幣用例。相反,以大坊取代了比特幣那種帶有不小限制性的編程語言,取而代之的是一種允許開發人員編寫自己程序的語言。以太坊允許開發人員編寫他們自己的「智能契約」,即「自主代理」或「自治代理」,正如ETH白皮書所稱的那樣。該編程語言是「圖靈完備」語言,這意味著它支持一組更廣泛的計算指令。智能合約能做些什麼呢?
1.「多簽名」賬戶功能,只有在一定比例的人同意時才能使用資金。這個功能經常用在與眾籌或募捐類似的活動中。
2.管理用戶之間所簽訂的協議。例如,一方從另一方購買保險服務3.為其他合同提供實用程序。
4.存儲有關應用程序的信息,如「域注冊信息」或「會員信息記錄」。概念有時候比較晦澀,我們舉一個募捐的智能合約的例子來幫助理解:假設我們想向全網用戶發起募捐,那就可以先定義一個智能賬戶,它有三個狀態:當前募捐總量,捐款目標和被捐贈人的地址,然後給它定義兩個函數:接收募捐函數和捐款函數。
接收募捐函數每次收到發過來的轉賬請求,先核對下發送者是否有足夠多的錢(EVM會提供發送請求者的地址,程序可以通過地址獲取到該人當前的區塊鏈財務狀況),然後每次募捐麗數調用時,都會比較下當前募捐總量跟捐款目標的比較,如果超過目標,就把當前收到的捐款全部發送到指定的被捐款人地址,否則的話,就只更新當前募捐總量狀態值。
捐款函數將所有捐款發送到保存的被捐贈人地址,並且將當前捐款總量清零。每一個想要募捐的人,用自己的ETH地址向該智能賬戶發起一筆轉賬,並且指明了要調用接受其募捐函數。於是我們就有一個募捐智能合約了,人們可以往裡面捐款,達到限額後錢會自動發送到指定賬戶,全世界的礦工都在為這個合約進行計算和擔保,不再需要人去盯著看有沒有被挪用,這就是智能合約的魅力所在。
⑤ 如何購買以太坊智能合約
可以兌換智能合約所代表的代幣,來對智能合約進行投資。
其實就和你買進OKB的操作差不多,只要有BTC或者USDT這些幣就夠了,然後幣幣交易區掛單買進,當然你也可以去玩合約交易。
⑥ 一學就會,手把手教你用Go語言調用智能合約
智能合約調用是實現一個 DApp 的關鍵,一個完整的 DApp 包括前端、後端、智能合約及區塊 鏈系統,智能合約的調用是連接區塊鏈與前後端的關鍵。
我們先來了解一下智能合約調用的基礎原理。智能合約運行在以太坊節點的 EVM 中。因此要 想調用合約必須要訪問某個節點。
以後端程序為例,後端服務若想連接節點有兩種可能,一種是雙 方在同一主機,此時後端連接節點可以採用 本地 IPC(Inter-Process Communication,進 程間通信)機制,也可以採用 RPC(Remote Procere Call,遠程過程調用)機制;另 一種情況是雙方不在同一台主機,此時只能採用 RPC 機制進行通信。
提到 RPC, 讀者應該對 Geth 啟動參數有點印象,Geth 啟動時可以選擇開啟 RPC 服務,對應的 默認服務埠是 8545。。
接著,我們來了解一下智能合約運行的過程。
智能合約的運行過程是後端服務連接某節點,將 智能合約的調用(交易)發送給節點,節點在驗證了交易的合法性後進行全網廣播,被礦工打包到 區塊中代表此交易得到確認,至此交易才算完成。
就像資料庫一樣,每個區塊鏈平台都會提供主流 開發語言的 SDK(Software Development Kit,軟體開發工具包),由於 Geth 本身就是用 Go 語言 編寫的,因此若想使用 Go 語言連接節點、發交易,直接在工程內導入 go-ethereum(Geth 源碼) 包就可以了,剩下的問題就是流程和 API 的事情了。
總結一下,智能合約被調用的兩個關鍵點是節點和 SDK。
由於 IPC 要求後端與節點必須在同一主機,所以很多時候開發者都會採用 RPC 模式。除了 RPC,以太坊也為開發者提供了 json- rpc 介面,本文就不展開討論了。
接下來介紹如何使用 Go 語言,藉助 go-ethereum 源碼庫來實現智能合約的調用。這是有固定 步驟的,我們先來說一下總體步驟,以下面的合約為例。
步驟 01:編譯合約,獲取合約 ABI(Application Binary Interface,應用二進制介面)。 單擊【ABI】按鈕拷貝合約 ABI 信息,將其粘貼到文件 calldemo.abi 中(可使用 Go 語言IDE 創建該文件,文件名可自定義,後綴最好使用 abi)。
最好能將 calldemo.abi 單獨保存在一個目錄下,輸入「ls」命令只能看到 calldemo.abi 文件,參 考效果如下:
步驟 02:獲得合約地址。注意要將合約部署到 Geth 節點。因此 Environment 選擇為 Web3 Provider。
在【Environment】選項框中選擇「Web3 Provider」,然後單擊【Deploy】按鈕。
部署後,獲得合約地址為:。
步驟 03:利用 abigen 工具(Geth 工具包內的可執行程序)編譯智能合約為 Go 代碼。abigen 工具的作用是將 abi 文件轉換為 Go 代碼,命令如下:
其中各參數的含義如下。 (1)abi:是指定傳入的 abi 文件。 (2)type:是指定輸出文件中的基本結構類型。 (3)pkg:指定輸出文件 package 名稱。 (4)out:指定輸出文件名。 執行後,將在代碼目錄下看到 funcdemo.go 文件,讀者可以打開該文件欣賞一下,注意不要修改它。
步驟 04:創建 main.go,填入如下代碼。 注意代碼中 HexToAddress 函數內要傳入該合約部署後的地址,此地址在步驟 01 中獲得。
步驟 04:設置 go mod,以便工程自動識別。
前面有所提及,若要使用 Go 語言調用智能合約,需要下載 go-ethereum 工程,可以使用下面 的指令:
該指令會自動將 go-ethereum 下載到「$GOPATH/src/github.com/ethereum/go-ethereum」,這樣還算 不錯。不過,Go 語言自 1.11 版本後,增加了 mole 管理工程的模式。只要設置好了 go mod,下載 依賴工程的事情就不必關心了。
接下來設置 mole 生效和 GOPROXY,命令如下:
在項目工程內,執行初始化,calldemo 可以自定義名稱。
步驟 05:運行代碼。執行代碼,將看到下面的效果,以及最終輸出的 2020。
上述輸出信息中,可以看到 Go 語言會自動下載依賴文件,這就是 go mod 的神奇之處。看到 2020,相信讀者也知道運行結果是正確的了。