GVKun编程网logo

为 Solidity/python 安装布朗尼的问题

4

如果您想了解为Solidity/python安装布朗尼的问题的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于14、安装以太坊Solidity语言编译器、18、solidity的interf

如果您想了解为 Solidity/python 安装布朗尼的问题的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于14、安装以太坊 Solidity 语言编译器、18、solidity 的 interface、9、Solidity 的时间、单位转换。、opencv python 轮廓属性/纵横比/Extent/Solidity/等效直径/掩模/极点的有价值的信息。

本文目录一览:

为 Solidity/python 安装布朗尼的问题

为 Solidity/python 安装布朗尼的问题

如何解决为 Solidity/python 安装布朗尼的问题

我一直在运行布朗尼时遇到问题,所以我卸载了它,然后我重新安装了它并出现以下错误

要求已经满足:atomicwrites>=1.0 in c:\\python39\\lib\\site-packages(来自 pytest==6.2.3->eth-brownie) (1.4.0) 要求已经满足:colorama in c:\\python39\\lib\\site-packages(来自 pytest==6.2.3->eth-brownie) (0.4.4) 已经满足要求:pywin32>=223 in c:\\python39\\lib\\site-packages(来自 web3==5.18.0->eth-brownie)(301) 警告:忽略无效的分发 -p (c:\\python39\\lib\\site-packages) 警告:忽略无效分发 -ip (c:\\python39\\lib\\site-packages) 警告:忽略无效分发 - (c:\\python39\\lib\\site-packages) 安装收集 软件包:eth-brownie 警告:忽略无效分发 -p (c:\\python39\\lib\\site-packages) 警告:忽略无效分发 -ip (c:\\python39\\lib\\site-packages) 警告:忽略无效分发 - (c:\\python39\\lib\\site-packages) 安装成功 eth-brownie-1.14.6 警告:忽略无效分发 -p (c:\\python39\\lib\\site-packages) 警告:忽略无效分发 -ip (c:\\python39\\lib\\site-packages) 警告:忽略无效分发 - (c:\\python39\\lib\\site-packages)

enter image description here

解决方法

我发现修复的唯一方法是卸载 python 和所有软件包,然后重新安装它并确保它被选为控制面板中的路径 -> 系统 -> 系统 -> 高级系统设置 -> 环境变量 -> 路径

如果其他人在尝试修复 python 时遇到问题,我的建议是重新安装所有与 python 相关的东西,因为它很可能坏了,所以节省你的时间并重新开始

14、安装以太坊 Solidity 语言编译器

14、安装以太坊 Solidity 语言编译器

高春辉、王春生、朱峰:关于开源创业的 15 件小事

编译器 github 地址:https://github.com/ethereum/solc-js

1、安装:

npm install solc

2、写个任意的合约,保存为 sol 文件:

我的 TokenWeb3.sol,如下:

pragma solidity 0.4.16;
contract TokenWeb3 {
  mapping (address => uint) public balancesOf;
  address public owner;
  //这里是创建合约的时候调用。msg.sender就是eth.account[0],也可以改编译后的代码指定。其他地方谁调用msg就是调用者
  function TokenWeb3() { 
    owner = msg.sender;
    balancesOf[msg.sender] = 10000;
  }

//msg就是调用者
  function transfer(address _to, uint _value) {
      //避免转移出去的代币超过当前的存货
    if (balancesOf[msg.sender] < _value) revert(); 
     //避免自己调用自己,或者递归调用
    if (balancesOf[_to] + _value < balancesOf[_to]) revert();
    balancesOf[msg.sender] -= _value;
    balancesOf[_to] += _value;
  }

  function mint(uint _amount) {
    balancesOf[owner] += _amount;
  }
}

3、运行命令,编译:

$ solc <contract>.sol --bin --abi --optimize -o <output-dir>/

我输出在当前目录的 test 下面,如下:

生成 abi 和 bin 文件。如下:

 

abi 文件是个 json 文件表示了只能合约的结构。如下:

bin 文件里面是一串数字。是合约的二进制哈希文件。

 

 

18、solidity 的 interface

18、solidity 的 interface

interface 关键字:定义了一个接口。其他合同可以实现这个接口。

智能合约之间通过 interface 定义的方法互相调用

首先创建私链并启动:

创建私链

geth --datadir "./ethDev" init genesis.json

启动私链

geth -datadir "./ethDev" --rpc --rpcapi="db,eth,net,web3,personal" --networkid 15 console 2>test.log

启动 mist

mist.exe --rpc http://127.0.0.1:8545

一、简单的 interface 和其实现。

下面的合约实现了 interfaceContract 的接口。

pragma solidity ^0.4.16;

interface interfaceContract {
    function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData);
}

contract InterfaceImplContract is interfaceContract {
    event Receive(address from, uint256 value, address token, bytes extraData);
    function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) {
        Receive(_from,_value,_token,_extraData);
    }
}

这里部署合约时,只需部署 InterfaceImplContract 即可,不用管接口。接口只是为了声明。如下:

二、调用接口。

下面的合约,想与实现了 interfaceContract 接口的合约进行交互。

pragma solidity ^0.4.16;

interface interfaceContract {
    function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData);
}

contract RemoteContract {
    function func(address _addr, uint _value) {
        //注意这里的_addr参数,需要填写tokenRecipient合约的地址。这里加载已经存在的智能合约。如何合约不存在会报错回滚。
        interfaceContract _interfaceContract = interfaceContract(_addr); 
        _interfaceContract.receiveApproval(msg.sender, _value, address(this), "这是一些信息");
    }
}
  • 注意这里调用 func(address _addr, uint _value) 方法时,传递的参数_addr,在下面的代码中,用来加载合约 interfaceContract _interfaceContract = interfaceContract(_addr); 所以 addr 必须传递合约地址。并且这个合约地址是 interfaceContract 的实现类的合约地址。也就是第一步创建的 InterfaceImplContract 合约的地址。
  • 如果传递的_addr 参数错误,调用失败。它将回滚所有已执行的功能。也就是这个方法会回滚。
  • 这里部署时,只需部署 RemoteContract 即可。不用管接口。接口只是为了声明。

三、实际应用。

在官方代币合约中。就有实际的引用。如下:

pragma solidity ^0.4.16;

interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }

contract TokenERC20 {
    // 代币名
    string public name;
   // 代币logo
    string public symbol;
    // 代币小数位数
    uint8 public decimals = 18;
    // 18位小数是强烈建议的默认值,避免改变它
    uint256 public totalSupply;

    // 这将创建一个包含所有余额的数组
    mapping (address => uint256) public balanceOf;
    //某人授权给某人,使用自己的多少代币.
    //比如:当前调用者msg.sender,可以授权给很多地址他代币的使用权限。
    mapping (address => mapping (address => uint256)) public allowance;

    // 代币转移日志
    event Transfer(address indexed from, address indexed to, uint256 value);

    // 销毁代币日志
    event Burn(address indexed from, uint256 value);

    /**
     * 构造方法 
     */
    function TokenERC20(uint256 initialSupply,string tokenName,string tokenSymbol) public {
        //10 ** uint256(decimals)是10^18次方。
        totalSupply = initialSupply * 10 ** uint256(decimals);  //初始化代币总数  使用 decimal,两个星号**表示次方。
        balanceOf[msg.sender] = totalSupply;                // 给创建者所有的初始化代币
        name = tokenName;                                   // 设置代币显示的名字  
        symbol = tokenSymbol;                               //设置代币显示的符合,代币logo 
    }

    /**
     * 代币转移, internal只能合约内部调用
     */
    function _transfer(address _from, address _to, uint _value) internal {
        // 防止传输到0x0地址。 使用burn()来代替
        require(_to != 0x0);
        // 检查发送方有足够代币
        require(balanceOf[_from] >= _value);
        // 防止溢出,超过uint的数据范围,会变为负数
        require(balanceOf[_to] + _value > balanceOf[_to]);
        // 保存以备将来的断言
        uint previousBalances = balanceOf[_from] + balanceOf[_to];
        // 发送方减掉代币
        balanceOf[_from] -= _value;
        // 接收方增加代币
        balanceOf[_to] += _value;
        Transfer(_from, _to, _value);//event 日志
        // 断言用于使用静态分析来查找代码中的bug。 他们永远不会失败
        assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
    }

    /**
     * Transfer tokens
     *
     * @param _to 收币方地址
     * @param _value 转移多少代币
     */
    function transfer(address _to, uint256 _value) public {
        _transfer(msg.sender, _to, _value);
    }

    /**
     * 从其他地址转移代币,需要其他地址授权给调用的人。
     *
     */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(_value <= allowance[_from][msg.sender]);     // 检查授权额度
        allowance[_from][msg.sender] -= _value;
        _transfer(_from, _to, _value);
        return true;
    }

    /**
     * 允许其他人,花费我的代币。
     *
     *授权给_spender地址,_value个代币
     *
     * @param _spender 授权给_spender地址
     * @param _value 代币数
     */
    function approve(address _spender, uint256 _value) public returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        return true;
    }

    /**
     * Set allowance for other address and notify
     *
     * 允许 `_spender` 代表你花费不大于`_value` 个代币, and then ping the contract about it
     *
     * @param _spender 授权给哪个地址
     * @param _value 授权最大代币数量
     * @param _extraData 一些额外的信息发送到批准的合同
     */
    function approveAndCall(address _spender, uint256 _value, bytes _extraData)public returns (bool success) {
        tokenRecipient spender = tokenRecipient(_spender);
        if (approve(_spender, _value)) {
            spender.receiveApproval(msg.sender, _value, this, _extraData);
            return true;
        }
    }

    /**
     * 销毁代币 
     *
     * 从系统中不可逆地删除`_value''个代币
     */
    function burn(uint256 _value) public returns (bool success) {
        require(balanceOf[msg.sender] >= _value);   //检查调用者金额大于销毁数量
        balanceOf[msg.sender] -= _value;            // 调用者代币减掉
        totalSupply -= _value;                      // 总供应量减掉
        Burn(msg.sender, _value);                  // event日志
        return true;
    }

    /**
     * 从其他账户销毁代币
     *
     *
     * @param _from 从哪个账户销毁代币
     * @param _value 销毁的代币数
     */
    function burnFrom(address _from, uint256 _value) public returns (bool success) {
        require(balanceOf[_from] >= _value);                // Check if the targeted balance is enough
        require(_value <= allowance[_from][msg.sender]);    // Check allowance
        balanceOf[_from] -= _value;                         // Subtract from the targeted balance
        allowance[_from][msg.sender] -= _value;             // Subtract from the sender''s allowance
        totalSupply -= _value;                              // 减掉总供应量
        Burn(_from, _value);                              // event日志
        return true;
    }
}

这里的 approveAndCall 方法,就调用了接口。把自己的代币授权给某个合约接口。并且调用合约的后续处理方法。执行通知。

 

 

9、Solidity 的时间、单位转换。

9、Solidity 的时间、单位转换。

以下这些以太币单位都是 solidity 中可以使用的关键词。

  • ether
  • finney
  • szabo
  • wei

Ether 的 Demo 合约

pragma solidity 0.4.10;
contract demo {
    uint public balance;
    function demo() {
        balance = 1 ether;
    }

    function addFinney() {
        balance += 1 finney;
    }

    function addSzabo() {
        balance += 1 szabo;
    }

    function addWei() {
        balance += 1 wei;
    }
}

Time

有以下几种 Time 类型

  • seconds
  • minutes
  • hours
  • days
  • weeks
  • years
  • now

Time 的 Demo 合约

pragma solidity 0.4.10;
contract demo {
    uint public a;
    function demo() {
        // a = now;
        a = 10000000000;
    }

    function addSeconds(uint num) {
        a += num;
    }

    function addMinutes(uint num) {
        a += num * 1 minutes;
    }

    function addHours(uint num) {
        a += num * 1 hours;
    }

    function addDays(uint num) {
        a += num * 1 days;
    }

    function addWeeks(uint num) {
        a += num * 1 weeks;
    }

    function addYears(uint num) {
        a += num * 1 years;
    }
}

opencv python 轮廓属性/纵横比/Extent/Solidity/等效直径/掩模/极点

opencv python 轮廓属性/纵横比/Extent/Solidity/等效直径/掩模/极点

Contour Properties

1 纵横比

它是对象的边界矩形的宽度与高度的比率.

$$ Rspect Ratio = \frac{Width}{Height} $$

x,y,w,h = cv2.boundingRect(cnt)
aspect_ratio = float(w)/h

2 Extent

轮廓面积和外接矩形面积的比值

$$ Extent = \frac{Object Area}{Bounding Rectangle Area} $$

area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area

3 Solidity

轮廓面积与凸包面积的比

$$ Extent = \frac{Contou Area}{Convex Hull Area} $$

area = cv.contourArea(cnt)
hull = cv.convexHull(cnt)
hull_area = cv.contourArea(hull)
solidity = float(area)/hull_area

4 等效直径

与轮廓面积相等的圆形的直径

$$ Equivalent Diameter = \sqrt{\frac{4 \times\;Contou Area}{Convex Hull Area}}\quad $$

area = cv2.contourArea(cnt)
equi_diameter = np.sqrt(4*area/np.pi)

5 方向

方向是对象定向的角度。 以下方法还给出了主轴和短轴长度。

(x,y),(MA,ma),angle = cv2.fitEllipse(cnt)

6 掩模和像素点

在某些情况下,我们可能需要包含该对象的所有点.可以这样做:

mask = np.zeros(imgray.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))
#pixelpoints = cv2.findNonZero(mask)

这里,两个方法,一个使用Numpy函数,另一个使用OpenCV函数(最后一个注释行)给出相同的方法。 结果也相同,但略有不同。 Numpy以(行,列)格式给出坐标,而OpenCV以(x,y)格式给出坐标。 所以答案基本上会互换。 请注意,row = x和column = y.

7 最大值和最小值及它们的位置

我们可以使用掩模图像得到这些参数:

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)

8 平均颜色或平均强度

在这里,我们可以找到对象的平均颜色。 或者它可以是灰度模式下物体的平均强度。 我们再次使用掩模完成它.

ean_val = cv2.mean(im,mask = mask)

9 极点

目标最上面,最下面,最左边,最右边的点

leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])

今天的关于为 Solidity/python 安装布朗尼的问题的分享已经结束,谢谢您的关注,如果想了解更多关于14、安装以太坊 Solidity 语言编译器、18、solidity 的 interface、9、Solidity 的时间、单位转换。、opencv python 轮廓属性/纵横比/Extent/Solidity/等效直径/掩模/极点的相关知识,请在本站进行查询。

本文标签: