国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Web程序員如何入門以太坊開發

SwordFly / 3350人閱讀

摘要:加入以太坊生態系統,一起征服世界。數字,字符串等要注意的第二件事是以太坊中的是位。一旦你掌握了這些東西,我個人會認為你是一個有能力的以太坊開發者

我經常構建使用以太坊的Web應用程序,我理所當然地認為每天都使用的是神奇的工具集。我們的生態系統正在迅速發展,我認為很多新人都感到不知所措。以太坊是一項了不起的技術,但它也是新生的,而且根本沒有足夠的時間讓專業知識充分滲透。我希望人們知道以太坊開發實際上與現代Web開發人員工作流程非常兼容——將以太坊功能集成到任何Web應用程序中相對容易,你可以從今天開始。

因為我認為自己是以太坊的高手,可以向主流開發者展示方向,我決定將一堆分散的知識放到一個地方(我知道不是非常去中心化)。你當然需要在每一步都查閱相應的文檔,但我希望本文將向你展示如何將所有內容(或多或少)放在一起。

如果你準備好學習,請讓我為你提供方向和指南。加入以太坊生態系統,一起征服世界。

獲取區塊鏈

有很多客戶端可供選擇,但我建議不要擔心geth 、parity與pyethapp(即將到來的python客戶端代表!)。對于那些只想要一個可復用的區塊鏈以便可以開始構建東西(例如你)的人,我建議testrpc滿足你的所有開發需求。安裝完成后,可以使用以下命令啟動它:

testrpc

恭喜你,這就有一個區塊鏈了。請注意,默認情況下,testrpc不會挖掘塊,但-b標志允許你指定塊間隔(例如1秒)。我喜歡這種配置有很多原因,我不會介入,但請記住它是可用的。

與區塊鏈交互

一旦你的區塊鏈旋轉,你需要一種與它交談的方法。 你可能已經下載了web3.js。 如果你沒有,你必須下載新的。好吧,繼續并確保安裝了web3,然后打開一個config.js文件并將其放入其中:

var web3 = require("web3");
var web3_provider = "http://localhost:8545";
var _web3 = new web3();
_web3.setProvider(new web3.providers.HttpProvider(web3_provider));
exports.web3 = _web3;

任何時候你想與后端服務器上的區塊鏈交互,只需要這樣做:

var config = require("./config.js");

config.web3.eth.X

可以在此處找到X(即你想要的任何web3 API函數)。

寫智能合約

我會在這里為你節省一些時間:你將使用solidity來編寫智能合約。如果你認為智能合約是可怕的,沒必要。對于許多應用程序,只要遵循一條規則,它實際上非常簡單:保持合約簡單。

有兩個原因,你總是始終保持合約絕對簡單,因為必須這樣:

每次計算/存儲操作都需要gas,等于以太幣,等于貨幣。我們正在談論支付0.05美元和1.50美元之間的差異來調用你的合約。以太坊的觀點不是要替換你的數據庫(至少在我看來不是這樣),所以保持邏輯簡短和存儲最小化。

更復雜=更多地方出錯。當你的代碼負責人們的錢并且無法回滾時,這很糟糕。請花一點時間只讓有用的話寫在其中。

好的,簡單的合約——得到它。讓我們繼續。

部署智能合約

如果你還沒有聽說過truffle,那么現在一定要看一下。我喜歡在truffle目錄中管理我的測試者合約。關于這一點的巧妙之處在于,你可以輕松地將其用于測試框架。在package.json中考慮這個腳本:

"scripts": {
  "test": "cd truffle && truffle deploy && truffle test ./myTruffleTest.js && cd .. && npm run myOtherTests"
}

這樣做:1.部署合約,2.運行truffle測試,3.運行常規測試——所有這些都在同一個腳本中!

請注意,你的truffle測試是“特殊的”,因為它們會在測試范圍內注入一堆很酷的區塊鏈內容。有多種方法可以將此信息傳遞給你的測試套件的其余部分。我個人使用truffle測試將合約地址保存到配置文件中,然后將該配置導入到我常規mocha測試中。只要我有正確的地址,我就可以通過web3.js在任何測試中與我的合約進行交互。無論如何,你會發現什么最適合你。

回到主要內容。你可以通過轉到truffle目錄并鍵入以下內容來部署智能合約:

truffle deploy

請注意,testrpc必須在另一個窗口中運行!

這將打印你剛剛部署的合約的地址,稍后你將需要該地址。正如我所提到的,你總是可以在truffle測試中以編程方式保存這個地址,但是現在你可以將它復制并粘貼到你的config.js文件中:

exports.contract_addr = "0xe73e8e0a4442e140aea87a4b150ef07b82492500"
進行智能合約調用

既然我們有合約,我們需要調用它。好的,這個看起來很簡陋——我們將用純十六進制字符串調用合約。當然有libraries可以讓這更容易,但是當涉及到合約調用時,我就開始要講課了。請記住,我是你的領路人。

首先要注意的是,所有內容都必須是十六進制的。數字,字符串等要注意的第二件事是以太坊中的words是256位。這意味著你需要用零填充所有內容到64個字符。需要注意的第三件事是必須在函數定義中規范地聲明類型。

好吧,這真的挺亂。我們來看一個例子,更好理解:

function add(uint x, uint y) public constant returns (uint) {
  return x + y;
}

假設你要做個加法如1加2,以下是你調用此函數的方法:

1.獲取封裝好的規范函數定義的keccak 256哈希的前4個字節。

說什么?好吧,我沒有做到這一點,但你可以在這個網站上輸入你的功能聲明并取前8個字符。規范是什么意思?好吧,在以太坊中有規范類型和速記類型(例如uint256uint的規范類型)。我實際上不知道它們的定義在哪里,但是查看以太坊ABI定義的例子以及這篇文章。

無論如何,這就是我們的定義:

add(uint256,uint256)

返回keccak256哈希:

771602f7f25ce61b0d4f2430f7e4789bfd9e6e4029613fda01b7f2c89fbf44ad

其中前4個字節(8個字符)是:

771602f7

2.將參數填充為256位

這個更容易掌握:

x = 1是:

0000000000000000000000000000000000000000000000000000000000000001

y = 2是:

0000000000000000000000000000000000000000000000000000000000000002

他們在一起是:

00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002

3.將所有內容打包在一起并添加0x前綴

自定義:

0x771602f700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002

現在我們有了有效負載,我們可以通過web3調用合約:

var config = require("./config.js");

var call = "0x771602f700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"

var to = config.contract_addr;

var res = config.web3.eth.call({ to: to, data: call });

在那之后,你應該返回res=3。實際上,你會得到一個BigNumber對象:

res.toString()
>"3"

你可能應該閱讀此內容以了解有關在整個應用中使用BigNumbers的原因。

好的,你可以使用我之前提到的庫。

等等,我們還沒有完成!我剛剛告訴你如何調用合約。但是,如果你想寫入些東西(即更新狀態)怎么辦?以上的是不行的!你需要使用私鑰簽署一個交易,但在此之前,你需要一些以太。

設置帳戶

我們回到truffle吧。在我們的測試中,需要添加如下內容:

var keys = require(`${process.cwd()}/../test/keys.json`);

it("Should send me some ether.", function() {
  assert.notEqual(keys.me.addr, null);

  var eth = 1*Math.pow(10, 18);
  var sendObj = {
    from: accounts[0],
    value: eth,
    to: keys.me.addr
  }
  
  Promise.resolve(web3.eth.sendTransaction(sendObj))
  .then(function(txHash) {
    assert.notEqual(txHash, null);
    return web3.eth.getBalance(keys.me.addr)
  })
  .then(function(balance) {
    assert.notEqual(balance.toNumber(), 0);
  })
})

重要提示:我們實際發送1個以太,這與10^18 wei相同。我們總是使用wei值進行調用/交易。

現在,我在這里跳過一步。你需要先獲得以太坊帳戶,該帳戶來自你生成的私人/公共密鑰對。我喜歡使用eth-lightwallet在后端進行密鑰管理。

為了簡單起見,讓我假裝在不斷增長的config.js中硬編碼這個變量:

exports.me = {
  addr: "0x29f2f6405e6a307baded0b0672745691358e3ee6",
  pkey: "8c2bcfce3d9c4f215fcae9b215eb7c95831da0219ebfe0bb909eb951c3134515"
}

強制性提醒:永遠不要共享你的私鑰,將其上傳到github,或者如果有任何資金就將其發布在Medium上。

回到測試,你可以看到以太被從accounts[0](默認情況下有一堆以太)移動到你的配置文件中的me.addr

與智能合約進行交易

現在你的帳戶已經有了一些以太,現在是時候花錢了。有三種方式可以用以太:

1.將其作為Value發送到另一個地址。

2.調用更新合約函數去更新網絡狀態,這需要gas來激勵礦工處理你的更新。

3.調用更新合約狀態,但也接受以太幣來支付(僅供參考,用solidity修正)——將發送Value,你還必須支付gas費用。

我們接下來要做的是第2種。假設我們有以下函數來跟蹤用戶的余額:

function addUserBalance(uint balance)
public returns (bool) {
  if (!accounts[msg.sender]) { throw; }
  if (accounts[msg.sender].balance + balance < accounts[msg.sender].balance) { throw; }
  accounts[msg.sender].balance += balance;
  return true;
}

注意第二個if語句,這是必要的,因為加和減在solidity會導致數值溢出和下溢——小心!還要注意在函數范圍內的未聲明的msg對象。

當我們通過發送交易調用此函數時,我們要求更新網絡的全局狀態以說明以下內容:

在合約范圍內,msg.sender帳戶的余額已經增加了balance

我們沒有權力自己更新狀態,所以需要一個礦工做這件事。我們用gas向他或她支付這項服務,這意味著付出以太。

要正確調用此函數,我們需要再次使用ABI:

addUserBalance(uint256) --> 22526328 --> 0x225263280000000000000000000000000000000000000000000000000000000000000001

我們使用這些數據來形成一個未簽名的交易:

var data = "0x225263280000000000000000000000000000000000000000000000000000000000000001";
var nonce = config.web3.eth.getTransactionCount(keys.me.addr);
var gasPrice = 20 * Math.pow(10, 9);
var gasLimit = 100000;

var txn = {
  from: config.me.addr,
  to: config.contract_address,
  gas: `0x${gasLimit.toString(16)}`,
  gasPrice: `0x${gasPrice.toString(16)}`,
  data: data,
  nonce: `0x${nonce.toString(16)}`,
  value: "0x0"
}

如上所述,需要gas進行交易(即更新狀態)。gas*gasPrice是礦工執行交易可能花費的金額。如果操作成本高于你提供的成本,則交易將不會更新狀態,并且礦工將保留你的所有gas費用。如果使用的gas少于所用gas,則退還余額。

如果我們將此對象提交給網絡,它將失敗,因為沒有證據表明我實際上正在授權此交易。誰知道,有些陌生人可能會將我的余額更新為10億(雖然目前還不清楚為什么有人會這樣做)。

無論如何,我需要做的是用我的私鑰簽署交易。還記得你在配置文件中內容,我告訴過你不要與任何人分享嗎?這樣做:

var Tx = require("ethereumjs-tx");

var privateKey = Buffer.from(config.me.pkey, "hex")
var tx = new Tx(txn);
tx.sign(privateKey);
var serializedTx = tx.serialize();

在這里,使用我最喜歡的庫之一,根據你的私鑰簽署一個交易對象。這應該返回如下內容:

0xf8aa808504a817c800830f424094a0f68379088f9aee95ba5c9d178693b874c4cd6880b844a9059cbb000000000000000000000000053b2188b0b100e68299708864e2ccecb62cdf0d000000000000000000000000000000000000000000000000000000746a5288001ca01f683f083c2d7c741a1218efc0144adc1749125a9ca53134b06353a8e4ef72afa07c50fb59647ff8b8895b75795b0f51de745fa5987b985f7d1025eb346755bca0

最后,我們可以通過web3將其提交給區塊鏈。它將返回一個交易哈希,它只是提供的交易的哈希值(這非常重要的是,不能證明交易是成功的!)

var txHash = config.web3.eth.sendRawTransaction(raw_txn);

看起來像這樣:

0xac8914ecb06b333a9e655a85a0cd0cccddb8ac627098e7c40877d27a130a7293

現在的這一步,嚴格來說是可選的,但對于驗證你的交易是否已被接受和處理非常重要:獲取你的交易收據。

var txReceipt = config.web3.eth.getTransactionReceipt(txHash);

如果返回null,則你的交易未被提取(可能是你使用錯誤的私鑰進行了簽名?)。如果它不為null,可能仍有各種其他失敗情況,來看看你的交易。

好的,有一條線索——如果你的gasUsed等于發送的gas,則意味著你的函數調用失敗了。這意味著1.你沒有提供足夠的gas或者同時2.你的合約遇到了throw

總結

我知道,這是很多內容。

如果你感覺太多了,我建議你慢慢來,并使用這篇文章作為參考。你可能需要花費大量時間閱讀文檔。

也就是說,我上面描述的是80%的內容。一旦你掌握了這些東西,我個人會認為你是一個有能力的以太坊開發者。

如果你有興趣,可以開始修修補補!這些工具變得越來越好,并且從未如此容易地進入。歡迎上岸。

更新:我已經為你創建了一個repo來展示本文中介紹的大部分內容。

如果希望快速進行以太坊開發,那請看我們精心打造的教程:
以太坊入門教程,主要介紹智能合約與dapp應用開發,適合入門。

其他區塊鏈教程如下:

以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。

java以太坊開發教程,主要是針對java和android程序員進行區塊鏈以太坊開發的web3j詳解。

python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。

php以太坊,主要是介紹使用php進行智能合約開發交互,進行賬號創建、交易、轉賬、代幣開發以及過濾器和事件等內容。

C#以太坊,主要講解如何使用C#開發基于.Net的以太坊應用,包括賬戶管理、狀態與交易、智能合約開發與交互、過濾器和事件等。

php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如創建地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。

EOS入門教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智能合約開發與部署、使用代碼與智能合約交互等核心知識點,最后綜合運用各知識點完成一個便簽DApp的開發。

匯智網原創翻譯,轉載請標明出處。這里是原文

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97968.html

相關文章

  • Web序員如何入門以太開發

    摘要:加入以太坊生態系統,一起征服世界。數字,字符串等要注意的第二件事是以太坊中的是位。一旦你掌握了這些東西,我個人會認為你是一個有能力的以太坊開發者 我經常構建使用以太坊的Web應用程序,我理所當然地認為每天都使用的是神奇的工具集。我們的生態系統正在迅速發展,我認為很多新人都感到不知所措。以太坊是一項了不起的技術,但它也是新生的,而且根本沒有足夠的時間讓專業知識充分滲透。我希望人們知道以太...

    kidsamong 評論0 收藏0
  • Android App 如何生成以太錢包

    摘要:以太坊,主要講解如何使用開發基于的以太坊應用,包括賬戶管理狀態與交易智能合約開發與交互過濾器和事件等。 Android應用程序以太坊錢包生成,要做的工作不少,不過如果我們一步一步來應該也比較清楚: 1.在app/build.gradle中集成以下依賴項: compile (org.web3j:core-android:2.2.1) web3j核心是用于從服務器下載以太坊區塊鏈數據的核心...

    不知名網友 評論0 收藏0
  • Android App 如何生成以太錢包

    摘要:以太坊,主要講解如何使用開發基于的以太坊應用,包括賬戶管理狀態與交易智能合約開發與交互過濾器和事件等。 Android應用程序以太坊錢包生成,要做的工作不少,不過如果我們一步一步來應該也比較清楚: 1.在app/build.gradle中集成以下依賴項: compile (org.web3j:core-android:2.2.1) web3j核心是用于從服務器下載以太坊區塊鏈數據的核心...

    _ipo 評論0 收藏0
  • Java開發區塊鏈的三大sdk庫

    摘要:是企業與區塊鏈相遇的地方。的框架旨在成為開發區塊鏈解決方案的支柱。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 如果你想將區塊鏈合并到一個Java項目中,現在我們來看看就是這個細分領域中三個最大的OSS玩家。 好的伙計們,我們都聽說過比特幣,以太坊或其他加密貨幣,其中有一些時髦的名字圍繞著我們常見的新聞,但我們作為Java開發人員知道如何輕松地與這些區塊鏈技術進行交互嗎?以...

    iKcamp 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<