主页 > 下载imtoken被盗 > Solidity概述和基本代码展示

Solidity概述和基本代码展示

下载imtoken被盗 2023-01-16 21:03:32

Solidity 是一种面向合约的高级语言,用于实现智能合约。它受 C++、Python 和 JavaScript 的影响,旨在针对以太坊虚拟机 (EVM)。

Solidity 是静态类型的,支持继承、库和复杂的用户定义类型等特性。

如您所见,可以为投票、众筹、盲拍、多重签名钱包等创建合约。

1 Solidity 智能合约示例

我们从一个基本的 Solidity 示例开始。一开始你可能不明白每一行的具体含义,不过没关系,我们会在后续的解释中介绍每一个细节。

pragma solidity ^0.4.0;合同 SimpleStorage { uint storedData;函数集(uint x){storedData = x; } function get() 常量返回 (uint) { return storedData; } }

第一行告诉合约是用0.4.0版本的solidity编写的,这些代码是向上兼容的,保证不会在不同的solidity版本下编译不同。行为。

从 Solidity 的角度来看,合约是位于以太坊区块链中特定地址的代码和数据的集合。 uint storedData 声明了一个uint(256位无符号整数)类型的变量,变量名是storedData。你可以把它想象成数据库中的一个字段,可以通过数据库中的方法来查询和修改。

在以太坊中,该字段属于合约字段。在此示例中,可以通过提供的 get 和 set 方法检索或修改变量。在 Solidity 中,您不需要通过 this 引用变量来访问变量。

如何查看币的合约地址

这个合约很简单,它只是允许以太坊上的任何人将数据存储到某个节点,同时将此操作发布到以太坊,当然以太坊上的其他节点也可以调用set方法来修改您存储的值。

尽管已修改,但任何对该值的操作历史都保存在以太坊中。不用担心您的存储记录或修改记录会丢失。稍后,我们将讨论如何限制合约只允许您修改这些数据。

2 Solidity 子币示例

pragma solidity ^0.4.0;合约币{

//public关键字允许外部访问变量

地址公共铸币者;

映射(地址 => uint)公共余额;

//事件让轻客户端快速响应变化

event Sent(address from, address to, uint amount);

如何查看币的合约地址

// 构造函数 Coin() {

minter = msg.sender;}

function mint(地址接收者,单位数量) {

if(msg.sender != minter)return;

余额[收款人] += 金额;}

函数发送(地址接收者,单位数量){

if(balances[msg.sender] < amount)return;balances[msg.sender] -= amount;

余额[收款人] += 金额;

Sent(msg.sender, receiver, amount);}}

如何查看币的合约地址

以下示例将实现一个简单的加密货币示例。无中生有不再是梦想,当然也只有合约的创建者才有这个特权。此外,任何拥有以太坊密钥对的人都可以进行货币交易如何查看币的合约地址,而无需注册用户名和密码。这份合约引入了一些新的概念,我们来一一介绍。

声明一个地址类型的公共状态变量。地址类型是一个 160 位的值,不允许任何算术运算。适用于存储合约地址或其他人的密钥对。 Public 关键字自动生成一个外部访问变量值的方法。如果未声明 public,则其他合约无法访问该变量。自动生成的方法类似于:

function minter() 返回 (地址) { return minter; }

当然,如果你加上一个和上面一模一样的方法,那就没有效果了。我们需要变量和生成的方法名称完全相同。其实编译器会帮我们完成这块,不需要我们自己写,只需要知道这个概念即可。

仍然创建了一个公共状态变量,它是一种比地址更复杂的数据类型,类似于java中的Map,描述了一个地址和一个uinit数据类型的映射关系。

Mappings的关系可以看成一个hash表,所有可能的key都对应一个值为0的值。当然,map中不存在只有key值或者只有value值的情况。所以我们需要记住添加了什么样的映射关系,或者像这个例子一样,如何使用它。因为这是一个公共变量,所以系统会自动为其生成一个get方法,类似:

函数 balances(address _account) 返回 (uint) {

返还余额[_account];

}

如何查看币的合约地址

通过上面的方法,我们可以很方便的查看一个账户的余额。

这一行创建了一个名为 event 的事件。该事件在示例的最后一行触发。用户或服务器应用程序可以支付非常低的成本(我们稍后会谈到成本)来监听事件的触发。一旦这个事件被触发,监听器就会收到三个参数:from、to、amount。这也意味着从哪个帐户,到哪个帐户如何查看币的合约地址,以及金额。通过这三个参数,可以很容易地追踪到具体的交易。要监听这个事件,我们需要使用以下代码:

Coin.Sent().watch({},", function(error, result) {

如果(!错误){

console.log(“转币:”+ result.args.amount +

” 硬币是从“+ result.args.from +

” 到 “+ result.args.to +”.”);

console.log(“现在余额:\n”+

“发件人:”+ Coin.balances.call(result.args.from) +

如何查看币的合约地址

“接收方:”+ Coin.balances.call(result.args.to));

}

})

注意:用户如何调用系统自动生成的 balances 方法。

Coin方法是构造方法,合约生成时系统调用,之后不允许调用。 Msg(连同 tx 和 block)是一个全局变量,包含一些可以被区块链访问的属性。它保留了创建合约的节点的地址。 Msg.sender 是方法调用者的地址。

最后,真正完成合约功能并被其他用户调用的是 mint 和 send 方法。如果 mint 被创建合约的账户以外的账户调用,它将没有任何效果。但是,send 可以被任何帐户调用(该帐户必须有 ether)并将 ether 发送到另一个帐户。请注意,如果您使用合约将以太币发送到另一个账户,您将不会通过区块链浏览器看到任何变化,因为发送以太币的过程和金额的变化都存储在一个特殊的以太合约中。而不是在账户上。通过使用事件,可以轻松创建区块链浏览器来查看交易和账户余额。

感谢 HPB 团队的整理。

HPB 开发者社区:

本文首发于王晓明博客