[web3j]java使用web3j调用以太坊私链上的智能合约

/ 13,602评论 / 54084阅读 / 10点赞

环境


web3j命令行工具

* 这个工具可以帮我们把合约生成为一个java类,供我们实现java调用智能合约。

* github项目链接


安装4.5.5以上的新版本(4.9)


安装4.5.5以及之前的旧版本

此时的目录结构
web3j_home=/usr/local/sbin/web3j
PATH=$web3j_home/bin:$PATH
export PATH

在Maven中导入web3j

<dependency>
  <groupId>org.web3j</groupId>
  <artifactId>core</artifactId>
  <version>4.9.0</version>
</dependency>
<dependency>
  <groupId>org.web3j</groupId>
  <artifactId>core</artifactId>
  <version>4.9.0-android</version>
</dependency>

生成测试文件(java智能合约封装器)

准备sol,abi和bin文件

// SPDX-License-Identifier: SimPL-2.0
pragma solidity >=0.4.0 <=0.7.0;

contract HelloWorld {
    uint count = 2022;
    
    function setCount(uint in_count) public
    {
        count = in_count;
    }

    function GetCount()public view returns(uint)
    {
        return count;
    }
}

使用web3j把智能合约生成java类

web3j generate solidity -a hello.abi -b hello.bin -o ./web_hello -p com.coolight.hello

修改web3j自动生成的java类

    //web3j自动生成的函数
    public RemoteFunctionCall<TransactionReceipt> GetCount() {
        final Function function = new Function(
                FUNC_GETCOUNT, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeRemoteCallTransaction(function);
    }
    //增加的函数
    public RemoteFunctionCall<BigInteger> GetCountReturn() {
        final Function function = new Function(
                FUNC_GETCOUNT,
                Collections.emptyList(),
                Arrays.asList(new TypeReference<Uint256>(){}));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }
    //web3j自动生成的函数
    public RemoteFunctionCall<TransactionReceipt> getUserEvent(String user_name) 
    {
        final Function function = new Function(
                FUNC_GETUSEREVENT,
                Arrays.<Type>asList(new org.web3j.abi.datatypes.Utf8String(user_name)),
                Collections.<TypeReference<?>>emptyList());
        return executeRemoteCallTransaction(function);
    }

    //增加的函数
    public RemoteFunctionCall<String> getUserEventReturn(String user_name) {
        final Function function = new Function(
                FUNC_GETUSEREVENT,
                Arrays.asList(new org.web3j.abi.datatypes.Utf8String(user_name)),
                Arrays.asList(new TypeReference<Utf8String>(){}));
        return  executeRemoteCallSingleValueReturn(function, String.class);
    }
    //web3j自动生成的函数
    public RemoteFunctionCall<TransactionReceipt> getUserLen(String user_name) {
        final Function function = new Function(
                FUNC_GETUSERLEN,
                Arrays.<Type>asList(new org.web3j.abi.datatypes.Utf8String(user_name)),
                Collections.<TypeReference<?>>emptyList());
        return  executeRemoteCallTransaction(function);
    }

    //增加的函数
    public RemoteFunctionCall<BigInteger> getUserLenReturn(String user_name) {
        final Function function = new Function(
                FUNC_GETUSERLEN,
                Arrays.asList(new org.web3j.abi.datatypes.Utf8String(user_name)),
                Arrays.asList(new TypeReference<Uint256>(){}));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.Type;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.crypto.Credentials;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.RemoteCall;
import org.web3j.protocol.core.RemoteFunctionCall;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.tx.Contract;
import org.web3j.tx.TransactionManager;
import org.web3j.tx.gas.ContractGasProvider;

/**
 * <p>Auto generated code.
 * <p><strong>Do not modify!</strong>
 * <p>Please use the <a href="https://docs.web3j.io/command_line.html">web3j command line tools</a>,
 * or the org.web3j.codegen.SolidityFunctionWrapperGenerator in the 
 * <a href="https://github.com/web3j/web3j/tree/master/codegen">codegen module</a> to update.
 *
 * <p>Generated with web3j version 4.5.5.
 */
@SuppressWarnings("rawtypes")
public class Hello extends Contract {
    private static final String BINARY = "{\n"
            + "\t\"linkReferences\": {},\n"
            + "\t\"object\": \"60806040526107e660005534801561001657600080fd5b5060c7806100256000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630ab93971146037578063d14e62b8146053575b600080fd5b603d607e565b6040518082815260200191505060405180910390f35b607c60048036036020811015606757600080fd5b81019080803590602001909291905050506087565b005b60008054905090565b806000819055505056fea26469706673582212205f4a89ec8a6affc1a5970dfedafa55c57435fd83a7635cd22b59193fcb6e42e964736f6c63430007000033\",\n"
            + "\t\"opcodes\": \"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH2 0x7E6 PUSH1 0x0 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0xC7 DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x32 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xAB93971 EQ PUSH1 0x37 JUMPI DUP1 PUSH4 0xD14E62B8 EQ PUSH1 0x53 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3D PUSH1 0x7E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x7C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH1 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH1 0x87 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5F 0x4A DUP10 0xEC DUP11 PUSH11 0xFFC1A5970DFEDAFA55C574 CALLDATALOAD REVERT DUP4 0xA7 PUSH4 0x5CD22B59 NOT EXTCODEHASH 0xCB PUSH15 0x42E964736F6C634300070000330000 \",\n"
            + "\t\"sourceMap\": \"75:231:0:-:0;;;115:4;102:17;;75:231;;;;;;;;;;;;;;;;\"\n"
            + "}\n";

    public static final String FUNC_GETCOUNT = "GetCount";

    public static final String FUNC_SETCOUNT = "setCount";

    @Deprecated
    protected Hello(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
        super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit);
    }

    protected Hello(String contractAddress, Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) {
        super(BINARY, contractAddress, web3j, credentials, contractGasProvider);
    }

    @Deprecated
    protected Hello(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
        super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit);
    }

    protected Hello(String contractAddress, Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) {
        super(BINARY, contractAddress, web3j, transactionManager, contractGasProvider);
    }

    public RemoteFunctionCall<TransactionReceipt> GetCount() {
        final Function function = new Function(
                FUNC_GETCOUNT, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeRemoteCallTransaction(function);
    }

    // 新增获取返回值方法
    public RemoteFunctionCall<BigInteger> GetCountReturn() {
        final Function function = new Function(
                FUNC_GETCOUNT, 
                Collections.emptyList(),
                Arrays.asList(new TypeReference<Uint256>(){}));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<TransactionReceipt> setCount(BigInteger in_count) {
        final Function function = new Function(
                FUNC_SETCOUNT, 
                Arrays.<Type>asList(new org.web3j.abi.datatypes.generated.Uint256(in_count)), 
                Collections.<TypeReference<?>>emptyList());
        return executeRemoteCallTransaction(function);
    }

    @Deprecated
    public static Hello load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
        return new Hello(contractAddress, web3j, credentials, gasPrice, gasLimit);
    }

    @Deprecated
    public static Hello load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
        return new Hello(contractAddress, web3j, transactionManager, gasPrice, gasLimit);
    }

    public static Hello load(String contractAddress, Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) {
        return new Hello(contractAddress, web3j, credentials, contractGasProvider);
    }

    public static Hello load(String contractAddress, Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) {
        return new Hello(contractAddress, web3j, transactionManager, contractGasProvider);
    }

    public static RemoteCall<Hello> deploy(Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) {
        return deployRemoteCall(Hello.class, web3j, credentials, contractGasProvider, BINARY, "");
    }

    @Deprecated
    public static RemoteCall<Hello> deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
        return deployRemoteCall(Hello.class, web3j, credentials, gasPrice, gasLimit, BINARY, "");
    }

    public static RemoteCall<Hello> deploy(Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) {
        return deployRemoteCall(Hello.class, web3j, transactionManager, contractGasProvider, BINARY, "");
    }

    @Deprecated
    public static RemoteCall<Hello> deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
        return deployRemoteCall(Hello.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, "");
    }
}

测试调用智能合约

import java.math.BigInteger;

import org.web3j.crypto.Credentials;
import org.web3j.crypto.RawTransaction;
import org.web3j.crypto.TransactionEncoder;
import org.web3j.crypto.WalletUtils;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.admin.Admin;
import org.web3j.protocol.admin.methods.response.PersonalUnlockAccount;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.response.EthGetBalance;
import org.web3j.protocol.core.methods.response.EthGetTransactionCount;
import org.web3j.protocol.core.methods.response.EthSendTransaction;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.RawTransactionManager;
import org.web3j.tx.TransactionManager;
import org.web3j.tx.gas.ContractGasProvider;
import org.web3j.tx.gas.StaticGasProvider;
import org.web3j.utils.Convert;
import org.web3j.utils.Numeric;

public class App
{
   // 1 - 智能合约地址
   private static String contractAddress = "0x62f7ca98490B199857ccDf9e68C218DEf5000d50";

    //燃料消耗
    private static final BigInteger gasPrice = new BigInteger("100000");

    //消耗限制
    private static final BigInteger gasLimit = new BigInteger("300000");

    //2 - 私链ID
    private static final long chainId = 7;


   // main method
   public static void main(String[] args) {

        //3 - 私钥的文件名
        String fileName = "UTC--2022-01-22T14-43-04.829667987Z--7cbad9dbed1f3ef418de1f0c6412cfec197c7751";
        try{
        // 4 - 加载 web3j - 这里需要修改为你要连接的节点链接
       Web3j web3 = Web3j.build(new HttpService("http://localhost:8545/"));

        // 5 - 加载账号 - 第一个String是密码,第二个是私钥的文件路径
       Credentials credentials = WalletUtils.loadCredentials("123456", "/home/0Acoolight/geth/rungeth/data/keystore/" + fileName);
       // 6 - 加载合约
       Hello contract = Hello.load(
           contractAddress, web3,
           new RawTransactionManager(web3, credentials, chainId),
           new StaticGasProvider(gasPrice, gasLimit)
       );
       // say hello
       System.out.println("Welcome coolight - " + credentials.getAddress());
       // 7 - 调用智能合约
           BigInteger currentValue;
           // 获取Count的值 - 调用GetCountReturn() 相当于合约中的GetCount()
           currentValue = contract.GetCountReturn().send();
           System.out.println(currentValue);
           // 修改Count的值 - 调用setCount()
           contract.setCount(new BigInteger("1")).send();
           // 获取Count的值
           currentValue = contract.GetCountReturn().send();
           System.out.println(currentValue);
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

本文所用文件打包

如果显示需要登录,请刷新页面或点击此处下载

常见问题


常见数据类型所在包

  1. Dnrtqkj说道:

    Привет!
    Приобрести документ ВУЗа можно у нас в столице.
    ast-diplomy.com/kupit-diplom-voronezh
    Успехов в учебе!

  2. Manrblx说道:

    Привет, друзья!
    Заказать документ университета
    diplomasx24.ru/kupit-diplom-omsk

  3. Arnoldscava说道:

    mexico drug stores pharmacies п»їbest mexican online pharmacies mexican drugstore online

  4. Dnrtvzf说道:

    Здравствуйте!
    Приобрести документ о получении высшего образования можно в нашей компании.
    diploms-x24.ru/kupit-diplom-ekaterinbur
    Успешной учебы!

  5. Arnoldscava说道:

    mexican border pharmacies shipping to usa mexican border pharmacies shipping to usa mexican pharmaceuticals online

  6. yurist_khsa说道:

    Опытные юристы к вашим услугам, помогаем.

    Юридическое сопровождение на высшем уровне, заказывайте.

    Сложные дела требуют профессионалов, звоните.

    Ваш надежный партнёр в праве, вы получите лучшие услуги.

    Наши адвокаты – ваши защитники, подходящее решение.

    Юридическая консультация по всем вопросам, в любое время.

    Качественные юридические услуги для физических и юридических лиц, с нами.

    Юристы, которые помогут вам выиграть дело, обратитесь к нам.

    Ваш правовой советник, работа только по факту.

    Ваши права – наш приоритет, и бизнесе.

    Доверьте своё дело настоящим профессионалам, звоните нам.

    Что такое юрист и его роль?, все, что вы хотели знать.

    Индивидуальные юридические услуги, с нами легко.

    Профессиональные услуги юриста для вас, дежурим круглосуточно.

    Ваш защитник в сложных вопросах, гибкий подход к каждому клиенту.

    Мы заботимся о вашей безопасности, все, что вам нужно.

    Качественные юридические услуги по доступным ценам, профессионализм и опыт.

    Наши клиенты – наши лучшие рекомендации, примеры успешных дел.

    Сложные вопросы требуют грамотного подхода, уверенность в результате.

    Что предлагает современный юрист?, отзывы о нас.
    услуги юриста по земельным вопросам услуги юриста по земельным вопросам .

  7. Manrxqm说道:

    Добрый день!
    Приобрести документ института
    ast-diplomas24.ru/kupit-diplom-nizhnij-novgorod

  8. Xazrnvi说道:

    Здравствуйте!
    Пошаговая инструкция по официальной покупке диплома о высшем образовании
    landik-diploms-srednee.ru/svidetelstvo-o-rozhdenii

  9. RichardMonge说道:

    http://mexicandeliverypharma.com/# mexican pharmaceuticals online

  10. Trefjwj说道:

    Привет!
    Официальная покупка диплома вуза с сокращенной программой в Москве
    rdcvw.com/space-uid-320969
    Поможем вам всегда!.

  11. Trefloe说道:

    Здравствуйте!
    Покупка диплома о среднем полном образовании: как избежать мошенничества?
    skillsofblocks.com/купить-диплом-о-высшем-образовании-ре/
    Рады оказаться полезными!.

  12. Trefzkl说道:

    Привет!
    Как оказалось, купить диплом кандидата наук не так уж и сложно
    remotebillpay.com/купить-диплом-о-высшем-образовании-ре/
    Рады оказать помощь!.

  13. Lazrfzx说道:

    Привет!
    Мы изготавливаем дипломы любых профессий по доступным тарифам.
    forexgroupx.ru/vyisshee-obrazovanie-dlya-vas-nadezhno-i-legalno

  14. Waynetar说道:

    buying prescription drugs in mexico: mexican rx online – pharmacies in mexico that ship to usa

  15. DominicHOr说道:

    п»їbest mexican online pharmacies: mexican pharmaceuticals online – mexico drug stores pharmacies

  16. Diplomi_tlol说道:

    Привет, друзья!
    Приобрести документ о получении высшего образования можно в нашей компании.
    ast-diplomy.com/kupit-diplom-perm

  17. Diplomi_opol说道:

    Здравствуйте!
    Приобрести документ ВУЗа можно в нашей компании.
    ast-diploms.com/kupit-diplom-tehnikuma-kolledzha

  18. Lazrudp说道:

    Здравствуйте!
    Заказать диплом университета.
    cbr.by/club/user/1977/blog/316

  19. Lazrmoh说道:

    Привет, друзья!
    Заказать диплом университета.
    cbr.by/club/user/1977/blog/316

  20. Lazrdup说道:

    Здравствуйте!
    Мы предлагаем дипломы психологов, юристов, экономистов и прочих профессий по приятным тарифам.
    adobe-photoshop.ru/search/водопад

  21. yurist_fvsa说道:

    Опытные юристы к вашим услугам, помогаем.

    Наймите юриста с богатым опытом, пишите нам.

    Сложные дела требуют профессионалов, пишите.

    Юридическая помощь для бизнеса, вы получите лучшие услуги.

    Лучшие юристы для вашего комфорта, подходящее решение.

    Юридическая консультация по всем вопросам, свяжитесь с нами.

    Качественные юридические услуги для физических и юридических лиц, доступные цены.

    Профессиональная юридическая поддержка, обратитесь к нам.

    Консультации по правовым вопросам, актуальные решения.

    С нами ваши интересы под защитой, недорого.

    Опыт работы более 10 лет, контактируйте с нами.

    Как найти качественного юриста?, наши советы для вас.

    Юридическая помощь без лишних вопросов, с нами легко.

    Профессиональные услуги юриста для вас, дежурим круглосуточно.

    Ваш защитник в сложных вопросах, долгосрочное сотрудничество.

    Ваше доверие – наша работа, сопровождение на всех этапах.

    Юристы, которые знают свое дело, профессионализм и опыт.

    Юридическая поддержка на всех этапах, примеры успешных дел.

    Правовая помощь для каждого, мы заботимся о вас.

    Что предлагает современный юрист?, мы делаем жизнь проще.
    юрист адвокат юрист адвокат .

  22. Arnoldscava说道:

    pharmacies in mexico that ship to usa mexican rx online mexico pharmacies prescription drugs

  23. RichardMonge说道:

    https://mexicandeliverypharma.com/# mexico drug stores pharmacies

  24. Richardditly说道:

    Частная платная клиника https://mypsyhealth.ru психиатрии, психологии, психотерапии и наркологии анонимно в Москве.

  25. RichardMonge说道:

    https://mexicandeliverypharma.com/# mexican online pharmacies prescription drugs

  26. Waynetar说道:

    mexican rx online: buying prescription drugs in mexico – mexican rx online

  27. DominicHOr说道:

    mexican rx online: buying from online mexican pharmacy – purple pharmacy mexico price list

  28. yurist_ensa说道:

    Профессиональный юрист для вашей защиты, в любых юридических вопросах.

    Юридическое сопровождение на высшем уровне, сейчас.

    Сложные дела требуют профессионалов, для получения информации.

    Оптимальные решения для ваших юридических вопросов, вы не останетесь одни.

    Лучшие юристы для вашего комфорта, узнайте.

    Наши специалисты ответят на любой ваш вопрос, свяжитесь с нами.

    Профессиональные юристы для защиты ваших прав, с нами.

    Услуги опытных адвокатов, узнайте больше.

    Юрист для всех случаев жизни, с высоким качеством.

    Грамотные юристы – залог вашего успеха, в любых вопросах.

    Опыт работы более 10 лет, звоните нам.

    Как найти качественного юриста?, все, что вы хотели знать.

    Индивидуальные юридические услуги, доступные решения.

    Профессиональные услуги юриста для вас, дежурим круглосуточно.

    Ваш защитник в сложных вопросах, мы работаем для вас.

    Мы заботимся о вашей безопасности, все, что вам нужно.

    Юристы, которые знают свое дело, доступность и качество.

    Наши клиенты – наши лучшие рекомендации, отзывы довольных клиентов.

    Правовая помощь для каждого, уверенность в результате.

    Юрист, который подойдет вам, документы и формальности.
    земельные юристы земельные юристы .

  29. Arnoldscava说道:

    mexican online pharmacies prescription drugs medication from mexico pharmacy medicine in mexico pharmacies

  30. Waynetar说道:

    mexican online pharmacies prescription drugs: mexican online pharmacies prescription drugs – mexico pharmacies prescription drugs

  31. DominicHOr说道:

    mexico drug stores pharmacies: mexican border pharmacies shipping to usa – buying prescription drugs in mexico

  32. yurist_dbsa说道:

    Профессиональный юрист для вашей защиты, предлагаем услуги.

    Наймите юриста с богатым опытом, обращайтесь.

    Наши юристы помогут избежать проблем, для получения информации.

    Оптимальные решения для ваших юридических вопросов, вы не останетесь одни.

    Наши адвокаты – ваши защитники, узнайте.

    Адвокаты, которые понимают ваши нужды, заходите на консультацию.

    Качественные юридические услуги для физических и юридических лиц, начните сотрудничество.

    Профессиональная юридическая поддержка, в долгий ящик.

    Консультации по правовым вопросам, индивидуальный подход.

    Ваши права – наш приоритет, недорого.

    Доверьте своё дело настоящим профессионалам, контактируйте с нами.

    Как найти качественного юриста?, ответы на ваши вопросы.

    Клиент всегда прав с нашими юристами, доступные решения.

    Заботимся о ваших интересах, всегда на связи.

    Ваш защитник в сложных вопросах, гибкий подход к каждому клиенту.

    Конфиденциальность и профессионализм, сопровождение на всех этапах.

    Качественные юридические услуги по доступным ценам, забота и внимание.

    Быстрые решения для ваших задач, примеры успешных дел.

    Юрист – ваш надежный союзник, мы заботимся о вас.

    Что предлагает современный юрист?, мы делаем жизнь проще.
    консультация юриста онлайн консультация юриста онлайн .

  33. EdwardMip说道:

    Deep Fake Nudes https://undressapp.net with Undress AI and Deepnude

  34. Danrfjr说道:

    Привет!
    Мы изготавливаем дипломы любых профессий.
    medlink.live/read-blog/125_kak-najti-nadezhnyj-onlajn-magazin-kotoryj-realizuet-diplomy?mode=night
    Будем рады вам помочь!.

  35. Trefkhv说道:

    Здравствуйте!
    Как приобрести диплом о среднем образовании в Москве и других городах
    dadiler.com/купить-диплом-советы-и-рекомендации/
    Поможем вам всегда!.

  36. Trefhnw说道:

    Привет, друзья!
    Официальная покупка аттестата о среднем образовании в Москве и других городах
    property25.org/где-купить-диплом-о-высшем-образовани/
    Рады оказать помощь!.

  37. Trefegq说道:

    Привет, друзья!
    Вопросы и ответы: можно ли быстро купить диплом старого образца?
    higherranker.com/купить-диплом-проверенные-способы/
    Рады оказать помощь!.

  38. Diplomi_olol说道:

    Добрый день!
    Заказать документ института вы имеете возможность в нашей компании.
    ast-diplomy.com/kupit-diplom-chelyabinsk

  39. Trefjco说道:

    Привет, друзья!
    Быстрая схема покупки диплома старого образца: что важно знать?
    ayurastroyoga.com/настоящий-диплом-как-и-где-купить/
    Будем рады вам помочь!.

  40. Diplomi_udol说道:

    Добрый день!
    Приобрести документ университета можно в нашей компании.
    diplomasx.com/kupit-diplom-kandidata-nauk

  41. Lazrgth说道:

    Привет!
    Мы изготавливаем дипломы любых профессий по приятным ценам.
    eurodelo.ru/vyisshee-obrazovanie-dlya-vseh-byistro-i-legko

  42. Lazrocj说道:

    Добрый день!
    Мы можем предложить дипломы любой профессии по приятным ценам.
    lghb.co.ke/купить-диплом-новосибирск

  43. Arnoldscava说道:

    mexican online pharmacies prescription drugs purple pharmacy mexico price list mexican pharmaceuticals online

  44. Mazrrez说道:

    Добрый день!
    Легальные способы покупки диплома о среднем полном образовании
    mans-diplomasxx.ru

  45. Diplomi_lkol说道:

    Привет!
    Купить документ о получении высшего образования можно в нашей компании в Москве.
    diploms-x.com/kupit-diplom-kazanВ 

  46. Diplomi_jhol说道:

    Здравствуйте!
    Заказать документ о получении высшего образования можно в нашей компании.
    ast-diploms.com/kupit-diplom-specialista

  47. Arnoldscava说道:

    reputable mexican pharmacies online buying prescription drugs in mexico mexico drug stores pharmacies

  48. Mazryji说道:

    Добрый день!
    Как приобрести аттестат о среднем образовании в Москве и других городах
    mandiplomiks.ru

  49. Harryheide说道:

    Immerse yourself in the charm of France https://france.life-in-france.net a land of fine cuisine, impressive architecture and picturesque landscapes. An unrivaled lifestyle.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注