回覆列表
  • 1 # 關注科技資訊

    要做到這一點,使用者將需要使用支援Web3的瀏覽器,因此可以使用像Parity或Mist這樣的可安裝瀏覽器,或者他們可以使用像MetaMask這樣的瀏覽器擴充套件。

    此外,雖然我可以教你如何直接使用web3API,但我將教你如何使用一個新的很方便的庫與乙太網智慧合約EthJS互動。

    你的網站需要等待ready事件,然後檢查全域性web3物件。看起來像這樣:

    window.addEventListener("load", function() {

    // Check if Web3 has been injected by the browser:

    if (typeof web3 !== "undefined") {

    // You have a web3 browser! Continue below!

    startApp(web3);

    } else {

    // Warn the user that they need to get a web3 browser

    // Or install MetaMask, maybe with a nice graphic.

    })

    從MetaMask開發人員指南中複製。

    在這個例子中,我假設你正在使用像Browserify或Webpack這樣的JavaScript捆綁器,並且知道如何從NPM安裝模組。

    在你的應用程式設定中,你將使用一些不同的ethjs模組,你將使用全域性web3物件的currentProvider屬性初始化它們,這就是它與區塊鏈的對話方式。

    const Eth = require("ethjs-query")

    const EthContract = require("ethjs-contract")

    function startApp(web3) {

    const eth = new Eth(web3.currentProvider)

    const contract = new EthContract(eth)

    initCon

    一旦例項化了合約,就可以使用它來建立對網路上實時合約的引用。要做到這一點,你需要兩件事:

    合約地址。

    合約ABI。

    ABI是應用程式二進位制介面,它告訴你的JavaScript如何與智慧合約通訊。它只是描述合約方法的JSON資料。

    通常,如果你釋出合約,你知道如何獲得ABI,如果你要與其他人簽訂合約,他們應該提供ABI,儘管有時候你可以找到與Etherscan等區塊瀏覽器的合約相匹配的ABI。

    假設你有可用的ABI和地址,並瞭解我們現在如何建立合約物件。在這個例子中,我將使用僅包含Token標準中的transfer(to,value)方法的ABI:

    const abi = [{

    "constant": false,

    "inputs": [

    {

    "name": "_to",

    "type": "address"

    },

    {

    "name": "_value",

    "type": "uint256"

    }

    ],

    "name": "transfer",

    "outputs": [

    {

    "name": "success",

    "type": "bool"

    }

    ],

    "payable": false,

    "type": "function"

    }]

    const address = "0xdeadbeef123456789000000000000"

    function initContract (contract) {

    const MiniToken = contract(abi)

    const miniToken = MiniToken.at(address)

    listenForClicks(miniToken)

    }

    現在我們已經為智慧合約初始化了一個JavaScript介面,所以我們只需要建立一個小HTML。

    <button>Send Money!</button>

    function listenForClicks (miniToken) {

    var button = document.querySelector("button.transferFunds")

    button.addEventListener("click", function() {

    miniToken.transfer(toAddress, value, { from: addr })

    .then(function (txHash) {

    console.log("Transaction sent")

    console.dir(txHash)

    waitForTxToBeMined(txHash)

    })

    .catch(console.error)

    })

    }

    請注意,如果此交易也傳送以太,你將向包含from欄位的選項雜湊新增value:"10000"。該值以wei為單位,為1x10 ^ -18以太。轉換的簡單方法是這樣的:

    var inWei = web3.toWei("10", "ether")

    對於普通的Web開發人員來說,一個奇怪的部分是交易響應並不意味著交易現在已經完成,它只是意味著它已經被傳輸到網路。它仍然需要被挖掘,而在以太坊中,平均需要大約14秒(阻斷時間,檢視EthStats.net上的統計資料)。

    現在還沒有很好的訂閱方法可以等待挖掘交易,所以你需要用收到的txHash進行輪詢。是的,這很乏味,所以我會告訴你如何使用新的JavaScript async/await模式來減少痛苦:

    async function waitForTxToBeMined (txHash) {

    let txReceipt

    while (!txReceipt) {

    try {

    txReceipt = await eth.getTransactionReceipt(txHash)

    } catch (err) {

    return indicateFailure(err)

    }

    }

    indicateSuccess()

    }

    如此而已!

  • 中秋節和大豐收的關聯?
  • 辦卡的健身房老闆跑路了,警方已經介入調查,我要怎麼維權?