智能合约是什么?

智能合约(Smart Contract),是一段布置在区块链上的代码,一旦某个事情触发合约中的条款,代码就会主动履行。用人话来讲便是:智能合约是一份根据密码学这种高科技上面的数字化合同,与传统的纸质合同的差异便是: 主动售货机相当于智能合约,售货员相当于纸质合同。

举个简略的比如你就理解了:

假定甲向乙借了一大笔钱,尽管打了白纸黑字的借单。可是到期后,甲以各种理由回绝还款,此刻乙想要拿回告贷只能申述。智能合约就能处理这种问题,假如甲乙双方在告贷前把告贷金额、还款时刻、对方绑定银行卡信息等打包进合约中。到了约好还款日,告贷会主动划到乙的账户里,即便甲不想还也没办法。

来历:千氪财经

金字塔在智能合约审计方面有哪些成功的事例呢?

金字塔选用形式化验证、静态剖析、动态剖析、典型事例测验和人工审阅的办法对KID项目智能合约代码规范性、安全性以及业务逻辑三个方面进行多维度全面的安全审计。经审计,KID项目智能合约经过一切检测项,合约审计成果为经过。

用Go来做以太坊开发④智能合约

在这个章节中咱们会介绍怎么用Go来编译,布置,写入和读取智能合约。

与智能合约交互,咱们要先生成相应智能合约的运用二进制接口ABI(application binary interface),并把ABI编译成咱们能够在Go运用中调用的格局。

第一步是装置 Solidity编译器 ( solc ).

Solc 在Ubuntu上有snapcraft包。

Solc在macOS上有Homebrew的包。

其他的渠道或许从源码编译的教程请查阅官方solidity文档 install guide .

咱们还得装置一个叫 abigen 的东西,来从solidity智能合约生成ABI。

假定您现已在核算机上设置了Go,只需运转以下指令即可装置 abigen 东西。

咱们将创立一个简略的智能合约来测验。 学习更杂乱的智能合约,或许智能合约的开发的内容则超出了本书的规模。 我激烈建议您检查 truffle framework 来学习开发和测验智能合约。

这儿仅仅一个简略的合约,便是一个键/值存储,只要一个外部办法来设置任何人的键/值对。 咱们还在设置值后添加了要宣布的事情。

尽管这个智能合约很简略,但它将适用于这个比如。

现在咱们能够从一个solidity文件生成ABI。

它会将其写入名为“Store_sol_Store.abi”的文件中

现在让咱们用 abigen 将ABI转换为咱们能够导入的Go文件。 这个新文件将包含咱们能够用来与Go运用程序中的智能合约进行交互的一切可用办法。

为了从Go布置智能合约,咱们还需求将solidity智能合约编译为EVM字节码。 EVM字节码将在业务的数据字段中发送。 在Go文件上生成布置办法需求bin文件。

现在咱们编译Go合约文件,其间包含deploy办法,因为咱们包含了bin文件。

在接下来的课程中,咱们将学习怎么布置智能合约,然后与之交互。

Commands

Store.sol

solc version used for these examples

假如你还没看之前的章节,请先学习 编译智能合约的章节 因为这节内容,需求先了解怎么将智能合约编译为Go文件。

假定你现已导入从 abigen 生成的新创立的Go包文件,并设置ethclient,加载您的私钥,下一步是创立一个有装备密匙的买卖发送器(tansactor)。 首要从go-ethereum导入 accounts/abi/bind 包,然后调用传入私钥的 NewKeyedTransactor 。 然后设置一般的特点,如nonce,燃气价格,燃气上线约束和ETH值。

假如你还记得上个章节的内容, 咱们创立了一个十分简略的“Store”合约,用于设置和存储键/值对。 生成的Go合约文件供给了布置办法。 布置办法称号一直以单词 Deploy 最初,后跟合约称号,在本例中为 Store 。

deploy函数承受有密匙的业务处理器,ethclient,以及智能合约结构函数或许承受的任何输入参数。咱们测验的智能合约承受一个版本号的字符串参数。 此函数将回来新布置的合约地址,业务目标,咱们能够交互的合约实例,还有过错(假如有)。

就这么简略:)你能够用业务哈希来在Etherscan上查询合约的布置状况:

Commands

Store.sol

contract_deploy.go

solc version used for these examples

这写章节需求了解怎么将智能合约的ABI编译成Go的合约文件。假如你还没看, 前先读 上一个章节 。

一旦运用 abigen 东西将智能合约的ABI编译为Go包,下一步便是调用“New”办法,其格局为“Newcontractname style="box-sizing: border-box font-size: 16px -ms-text-size-adjust: auto -webkit-tap-highlight-color: transparent;"”,所以在咱们的比如中假如你 回想一下它将是 NewStore 。 此初始化办法接纳智能合约的地址,并回来能够开端与之交互的合约实例。/contractname

Commands

Store.sol

contract_load.go

solc version used for these examples

这写章节需求了解怎么将智能合约的ABI编译成Go的合约文件。假如你还没看, 前先读 上一个章节 。

在上个章节咱们学习了怎么在Go运用程序中初始化合约实例。 现在咱们将运用新合约实例供给的办法来阅览智能合约。 假如你还记得咱们在布置过程中设置的合约中有一个名为 version 的全局变量。 因为它是揭露的,这意味着它们将成为咱们主动创立的getter函数。 常量和view函数也承受 bind.CallOpts 作为第一个参数。了解可用的详细选项要看相应类的 文档 一般情况下咱们能够用 nil 。

Commands

Store.sol

contract_read.go

solc version used for these examples

这写章节需求了解怎么将智能合约的ABI编译成Go的合约文件。假如你还没看, 前先读 上一个章节 。

写入智能合约需求咱们用私钥来对买卖业务进行签名。

咱们还需求先查到nonce和燃气价格。

接下来,咱们创立一个新的keyed transactor,它接纳私钥。

然后咱们需求设置keyed transactor的规范买卖选项。

现在咱们加载一个智能合约的实例。假如你还记得 上个章节 咱们创立一个名为 Store 的合约,并运用 abigen 东西生成一个Go文件。 要初始化它,咱们只需调用合约包的 New 办法,并供给智能合约地址和ethclient,它回来咱们能够运用的合约实例。

咱们创立的智能合约有一个名为 SetItem 的外部办法,它承受solidity“bytes32”格局的两个参数(key,value)。 这意味着Go合约包要求咱们传递一个长度为32个字节的字节数组。 调用 SetItem 办法需求咱们传递咱们之前创立的 auth 目标(keyed transactor)。 在暗地,此办法将运用它的参数对此函数调用进行编码,将其设置为业务的 data 特点,并运用私钥对其进行签名。 成果将是一个已签名的业务目标。

现在我就能够看到买卖现已成功被发送到了以太坊网络了:

要验证键/值是否已设置,咱们能够读取智能合约中的值。

搞定!

Commands

Store.sol

contract_write.go

solc version used for these examples

有时您需求读取已布置的智能合约的字节码。 因为一切智能合约字节码都存在于区块链中,因而咱们能够轻松获取它。

首要设置客户端和要读取的字节码的智能合约地址。

现在你需求调用客户端的 codeAt 办法。 codeAt 办法承受智能合约地址和可选的块编号,并以字节格局回来字节码。

你也能够在etherscan上查询16进制格局的字节码

contract_bytecode.go

首要创立一个ERC20智能合约interface。 这仅仅与您能够调用的函数的函数界说的契约。

然后将interface智能合约编译为JSON ABI,并运用 abigen 从ABI创立Go包。

假定咱们现已像平常相同设置了以太坊客户端,咱们现在能够将新的 token 包导入咱们的运用程序并实例化它。这个比如里咱们用 Golem 代币的地址.

咱们现在能够调用任何ERC20的办法。 例如,咱们能够查询用户的代币余额。

咱们还能够读ERC20智能合约的公共变量。

咱们能够做一些简略的数学运算将余额转换为可读的十进制格局。

相同的信息也能够在etherscan上查询:

Commands

erc20.sol

contract_read_erc20.go

solc version used for these examples